先说现场
SQL Server 到达梦的难点集中在 identity、datetime2、uniqueidentifier、nvarchar、schema 和大小写。实施时先选 2 到 3 张典型表,确认字段类型、主键和后续增量能力,再扩大范围。
方案怎么选
| 方案 | 适合场景 | 主要限制 |
|---|---|---|
| Canal | MySQL 到下游的增量解析和分发 | 对 SQL Server 到 DM8 场景不是首选 |
| Kettle | 批量抽取、转换和清洗 | 偏 ETL 流程,长期 CDC 和任务状态管理较弱 |
| DataX | 一次性离线迁移 | 需要维护 JSON,缺少完整 Web 和 CDC 管理 |
| DataMover | 全量、增量字段和 CDC 的私有化同步 | 需要部署 Manager、Worker 和元数据库 |
如果目标是国产化替换,并且后续还要持续同步或追平变更,DataMover 的全量、增量字段和 CDC 可以放在同一套可视化管理中。
DataMover 是什么
DataMover 是一个私有化部署的数据迁移同步工具:
- 普通任务处理全量和基于增量字段的定时同步。
- 实时任务处理 SQL Server CDC,捕获 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/
准备阶段:测试表建表和造数
先在 SQL Server 源端创建测试表并生成数据。达梦目标端可以用 DataMover 自动建表,也可以先按预期结构创建。
SQL Server 源端测试表
CREATE TABLE dm_demo_user (
id BIGINT IDENTITY(1,1) PRIMARY KEY,
username NVARCHAR(64),
phone NVARCHAR(32),
status NVARCHAR(16),
amount DECIMAL(18,2),
created_at DATETIME2,
updated_at DATETIME2,
row_guid UNIQUEIDENTIFIER DEFAULT NEWID()
);
;WITH N AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n
FROM sys.all_columns a
CROSS JOIN sys.all_columns b
)
INSERT INTO dm_demo_user (username, phone, status, amount, created_at, updated_at)
SELECT
'user_' + CAST(n AS NVARCHAR),
'1380000' + RIGHT('0000' + CAST(n AS NVARCHAR), 4),
CASE WHEN n % 2 = 0 THEN 'active' ELSE 'inactive' END,
ROUND(RAND() * 100000, 2),
SYSDATETIME(),
SYSDATETIME()
FROM N
WHERE n <= 10000;
达梦目标端预期表结构
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,
row_guid VARCHAR(36)
);
源库和目标库权限
| 端 | 需要权限 | 原因 |
|---|---|---|
| SQL Server 源端 | 读取表结构、业务数据和元数据;CDC 场景还要 CDC 相关权限 | 数据源连接、选表、字段映射和增量读取 |
| 达梦目标端 | 建表、写入、更新、删除 | 自动建表和任务写入 |
| 元数据库 | 创建数据库和表权限 | 保存任务、位点和执行记录 |
| Worker | 访问源端、目标端和元数据库 | 实际执行任务 |
SQL Server CDC 前需要确认数据库或表已启用 CDC,并使用具备相关权限的账号。
SQL Server 源端权限检测
SELECT name, type_desc
FROM sys.database_principals
WHERE name = 'datamover_user';
SELECT permission_name
FROM sys.fn_my_permissions(NULL, 'DATABASE')
WHERE permission_name IN ('SELECT', 'VIEW DEFINITION', 'CONNECT');
SQL Server 源端授权示例
CREATE LOGIN datamover_user WITH PASSWORD = 'change_me';
CREATE USER datamover_user FOR LOGIN datamover_user;
ALTER ROLE db_datareader ADD MEMBER datamover_user;
GRANT VIEW DEFINITION TO datamover_user;
USE your_database;
EXEC sys.sp_cdc_enable_db;
达梦目标端权限检测
SELECT grantee, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'DATAMOVER_TARGET';
达梦目标端授权示例
CREATE USER DATAMOVER_TARGET IDENTIFIED BY "change_me";
GRANT RESOURCE TO DATAMOVER_TARGET;
CREATE SCHEMA DATAMOVER_SYNC AUTHORIZATION DATAMOVER_TARGET;
DataMover 配置选择和内存配置
| 配置 | 建议 | 说明 |
|---|---|---|
| 数据批大小 | 默认 5000 | 先跑通再调优 |
| 抽取方式 | 首次全量选择 全量 | 日常同步选择 增量 |
| 增量字段 | 优先自增主键或更新时间 | 字段应有索引 |
| 调度方式 | 一次性或间隔性 | 按业务节奏配置 |
| Worker JVM | 数据量大时调大 | 避免频繁 GC |
| 目标端索引 | 大批量迁移可评估迁移后再建索引 | 减少写入放大 |
创建普通任务
- 添加 SQL Server 源端数据源,测试连接通过。
- 添加达梦目标端数据源,确认建表和写入权限。
- 新建普通任务,选择源端和目标端。
- 进入表映射,选择试迁表。
- 检查字段映射和同步策略。
- 保存并启动。

字段映射重点
| SQL Server 类型/特性 | 达梦处理 | 要确认什么 |
|---|---|---|
IDENTITY | 序列或 identity | 当前值校准 |
DATETIME2 | 达梦时间类型 | 精度和时区 |
UNIQUEIDENTIFIER | VARCHAR 或 UUID 类型 | 长度和业务语义 |
NVARCHAR(n) | VARCHAR(n) | 长度、字符集 |
| schema/大小写 | 达梦 schema | 表名和字段名是否被正确识别 |
增量字段和 CDC
普通增量字段只能感知新增和修改,无法感知物理删除。需要同步删除时,使用实时任务 CDC。

SQL Server CDC 前检查:
- 数据库或表是否启用 CDC。
- 源端账号权限是否足够。
- Worker 是否能读取 CDC 日志。

结果验证
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);
常见坑
identity 迁移后新数据主键冲突
原因是当前值没有同步到达梦侧序列。全量迁移后查询目标表最大主键,并校准序列或 identity。
datetime2 精度变化
达梦侧时间类型可能保留不同的精度,时间字段应做最小值和最大值校验。
CDC 启动后没有增量
检查 SQL Server CDC 是否启用、账号权限和 Worker 日志。