MySQL 到 PostgreSQL 大存量 CDC 同步实施:先全量后位点怎么落地

MySQL 到 PostgreSQL 大存量 CDC 同步实施指南,说明如何用普通任务先同步存量,再让实时任务从已记录位点追增量,覆盖方案选型、权限、部署、内存配置、任务创建和结果校验。适合千万级或更大存量数据的 MySQL 到 PostgreSQL 同步项目。

先说现场

MySQL 源表已经有几千万行时,直接让 CDC 实时任务做全量快照,容易出现快照时间过长、源库压力升高和 binlog 消费延迟。更稳的做法是:普通任务负责存量,实时任务负责位点之后的变化。

方案怎么选

方案适合场景主要限制
CanalMySQL binlog 增量解析和消息分发需要 MySQL、Kafka、消费端和位点维护配合
Kettle批量抽取、转换和清洗实时 CDC 和任务状态管理较弱
DataX一次性离线全量迁移缺少完整 Web 和 CDC 管理
DataMover全量、增量字段和 CDC 的私有化同步需要部署 Manager、Worker 和元数据库

大存量场景建议把全量和 CDC 分开,先用普通任务完成存量,再用实时任务追增量,避免直接快照带来的压力。

DataMover 是什么

DataMover 是一个私有化部署的数据迁移同步工具:

  • 普通任务处理全量和基于增量字段的定时同步。
  • 实时任务处理 MySQL CDC,通过 binlog 捕获 INSERT、UPDATE、DELETE。
  • Web 界面配置数据源、表映射、字段映射、同步策略和执行监控。
  • Manager 负责调度,Worker 负责实际读取和写入。

部署拓扑

浏览器
  |
Manager: 8000
  |
Worker: 8011
  |
元数据库:MySQL 5.7+ 或 PostgreSQL 12+

部署拓扑

curl -fsSL https://down.datamover.cn/install.sh | bash

下载页:https://datamover.cn/download.html
文档页:https://datamover.cn/doc/

准备阶段:测试表建表和造数

先在 MySQL 源端创建测试表并生成 1 万行数据。大存量验证可以在测试环境继续扩大到百万行,观察普通任务全量和实时任务位点衔接。

MySQL 源端测试表

CREATE TABLE dm_demo_user (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(64),
  phone VARCHAR(32),
  status VARCHAR(16),
  amount DECIMAL(18,2),
  created_at DATETIME,
  updated_at DATETIME
);

INSERT INTO dm_demo_user (username, phone, status, amount, created_at, updated_at)
SELECT
  CONCAT('user_', n),
  CONCAT('1380000', LPAD(n, 4, '0')),
  CASE WHEN n % 2 = 0 THEN 'active' ELSE 'inactive' END,
  ROUND(RAND() * 100000, 2),
  NOW(),
  NOW()
FROM (
  SELECT @n := @n + 1 AS n
  FROM information_schema.columns a,
       information_schema.columns b,
       (SELECT @n := 0) c
  LIMIT 10000
) t;

PostgreSQL 目标端预期表结构

CREATE TABLE dm_demo_user (
  id BIGINT PRIMARY KEY,
  username VARCHAR(64),
  phone VARCHAR(32),
  status VARCHAR(16),
  amount NUMERIC(18,2),
  created_at TIMESTAMP,
  updated_at TIMESTAMP
);

源库和目标库权限

端需要权限原因
MySQL 源端读取表结构、业务数据和元数据;CDC 场景还要 binlog 读取权限数据源连接、选表、字段映射和增量读取
PostgreSQL 目标端建表、写入、更新、删除自动建表和任务写入
元数据库创建数据库和表权限保存任务、位点和执行记录
Worker访问源端、目标端和元数据库实际执行任务

MySQL CDC 前需要确认 binlog 已开启、行格式满足要求,并使用具备复制权限的账号。

MySQL 源端权限检测

SHOW GRANTS FOR 'datamover_user'@'%';
SELECT @@log_bin, @@binlog_format, @@binlog_row_image;

MySQL 源端授权示例

CREATE USER 'datamover_user'@'%' IDENTIFIED BY 'change_me';
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT
ON *.* TO 'datamover_user'@'%';
FLUSH PRIVILEGES;

PostgreSQL 目标端权限检测

SELECT grantee, table_schema, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'datamover_target'
ORDER BY table_name, privilege_type;

PostgreSQL 目标端授权示例

CREATE USER datamover_target WITH PASSWORD 'change_me';
CREATE SCHEMA datamover_sync AUTHORIZATION datamover_target;
GRANT ALL ON SCHEMA datamover_sync TO datamover_target;

DataMover 配置选择和内存配置

配置建议说明
普通任务全量抽取方式选择全量一次性同步存量
实时任务快照schema_only只记录位点,不执行存量快照
offset JSON默认系统管理不手写不确定位点
输出线程数默认 1,逐步调 2 到 4按目标端写入能力调整
Worker JVM数据量大时调大避免批大小提升后频繁 GC
目标端索引大批量迁移可评估迁移后再建索引减少写入放大

大存量同步流程

  1. 创建普通任务,准备同步存量。
  2. 将普通任务复制成实时任务。
  3. 实时任务配置 schema_only,不进行快照。
  4. 启动并停止实时任务,确认已生成 offset。
  5. 启动普通任务,同步全部存量数据。
  6. 普通任务完成后,再次启动实时任务,从位点追增量。

查看实时任务 offset

普通任务同步存量

字段映射重点

MySQL 类型/特性PostgreSQL 处理要确认什么
AUTO_INCREMENT序列或 identity当前值校准
TINYINTSMALLINT状态和布尔字段
DATETIMETIMESTAMP精度和时区
VARCHARVARCHAR长度、字符集
ON UPDATE时间戳逻辑单独确认是否保留自动更新时间行为

结果验证

SELECT COUNT(*) FROM source_table;
SELECT COUNT(*) FROM target_table;

SELECT MIN(id), MAX(id) FROM source_table;
SELECT MIN(id), MAX(id) FROM target_table;

SELECT status, COUNT(*) FROM source_table GROUP BY status;
SELECT status, COUNT(*) FROM target_table GROUP BY status;

SELECT * FROM source_table WHERE id IN (1, 100, 1000);
SELECT * FROM target_table WHERE id IN (1, 100, 1000);

常见坑

位点先记录,但普通任务还没完成

普通任务未完成时启动实时任务,存量期间的变化会由实时任务补齐。重点确认普通任务完成状态和位点记录时机。

复制任务时目标表策略不清楚

实时任务配置不当可能清空目标表。设置 schema_only 时保持首次启动清空目标表关闭。

停止后重复消费

原因通常是 offset 被手动修改或任务重置。优先使用系统生成位点,重置前先确认目标表策略。

相关入口

常见问题解答

MySQL 大存量为什么不直接跑实时任务快照?

直接全量快照可能导致耗时过长、源库压力大和变更日志延迟。推荐普通任务先同步存量,实时任务从已记录位点追增量。

普通任务和实时任务衔接时位点怎么处理?

先将普通任务复制成实时任务并配置 schema_only,启动后停止以生成 offset,再跑普通任务存量,最后启动实时任务追增量。

MySQL CDC 启动后没有增量事件怎么排查?

检查 binlog、行格式、源端权限和 Worker 日志,必要时打开 DEBUG 查看 CDC 读取日志。

在自己的环境中验证

下载 DataMover,开始配置迁移与同步任务。

免费下载快速开始