从全量迁移到增量同步,一文掌握 DMDRS 装载与动态表管理的核心技巧
在数据迁移与同步的日常运维中,全量装载和动态增减表是两个最高频的操作场景。无论你是首次将业务库接入 DMDRS,还是在运行中需要新增一张表、调整一张表的装载策略,都需要准确理解背后的命令、掩码和限制。
本文将第二章(数据装载)与第三章(动态增减表)的内容进行融合梳理,形成一份完整、可上手的操作手册,覆盖从ADD TABLE到DELETE DICT,从普通表到分区表、大表、无主键表等各类场景。
在开始操作之前,先理清几个关键术语:
概念 说明
字典装载 从源库抽取表结构信息,生成本地字典文件,供日志解析使用
数据装载 将源表的全量数据迁移到目标表
装载掩码(LOAD_MASK) 一组控制装载行为的参数,决定“装什么、怎么装”
ADD TABLE 全量装载 + 自动切换增量同步(最常用)
ADD DICT 仅添加增量同步字典,不做全量装载(表已初始化时使用)
DELETE / TERMINATE DICT 移除增量同步表,前者仅删除源端监控,后者同时通知目标端清理
2.1 ADD TABLE —— 全量 + 增量(首选)
ALTER [CPT_NAME] ADD TABLE “<FILTER>” [LOAD_MASK]
功能:动态添加同步表,自动执行全量装载,完成后无缝切入增量同步。
默认掩码:CREATE|INSERT|INDEX|TABLE|CHECK|GROUP
典型示例:
– 添加单张表,使用默认掩码
ALTER cpt_mysql ADD TABLE “SCH.NAME=‘test_db’ AND TAB.NAME=‘empl1’”;
– 添加整个模式下的所有表
ALTER cpt_mysql ADD TABLE “SCH.NAME=‘test_db’”;
– 使用模糊匹配(需转义)
ALTER cpt_mysql ADD TABLE “SCH.NAME=‘test_db’ AND TAB.NAME LIKE ‘t_%’ ESCAPE ‘’”;
2.2 CP —— 仅全量迁移(不开启增量)
CP [CPT_NAME] “<FILTER>” [CP_MASK]
−−或
ALTER [CPT_NAME] CP “<FILTER>” [CP_MASK]
适用于一次性数据迁移,无需后续增量同步。
– 仅迁移数据,不增量
cp cpt_mysql “SCH.NAME=‘test_db’” CREATE|INSERT|INDEX
– 只建表结构,不导数据
cp cpt_mysql “SCH.NAME=‘test_db’” CREATE
2.3 CONTINUE LOAD —— 断点续传
ALTER [CPT_NAME] CONTINUE LOAD
对最近装载失败的所有表自动续传。
注意:MySQL/MariaDB 源端不支持此功能。
2.4 STOP LOAD —— 停止装载
– 停止所有表装载
ALTER [CPT_NAME] STOP LOAD
−−停止指定表装载
ALTER [CPT_NAME] STOP TABLE [PDBNAME.]SCHNAME.TABNAME
停止后,目标端已装载的数据不会删除。
2.5 SYNC TABLE —— 强制激活失败表同步(⚠️ 危险操作)
ALTER [CPT_NAME] SYNC TABLE “SCHNAME”.“TABNAME”
此命令会跳过未装载成功的分组数据,可能导致目标端数据缺失或行数不一致,仅在紧急情况下使用。
2.6 DELETE LOAD_RECORD —— 清理装载历史
ALTER [CPT_NAME] DELETE LOAD_RECORD
释放存储空间,但删除后无法续传之前的失败任务,且正在装载时不可执行。
2.7 CONTINUE RELOAD —— 指定掩码重装失败表
ALTER [CPT_NAME] CONTINUE RELOAD [LOAD_MASK]
当历史掩码无法续传成功时,用新掩码对所有错误表重装。
掩码是 DMDRS 装载的灵魂。我们按功能类别逐一解析。
3.1 核心操作掩码
掩码 作用 适用场景
CREATE 在目标端创建表 首次装载
INSERT 装载数据 必选核心掩码
INDEX 创建索引 数据装载完成后提升查询性能
DROP 先删表再重建 表结构有变更
TRUNCATE 清空数据,保留结构 表结构不变,只需重装数据
TABLE 指定装载对象为表 与CREATE组合使用
执行顺序:DMDRS 按“先 DDL 后 DML”顺序执行,例如DROP|CREATE|INSERT|INDEX实际顺序为:删表 → 建表 → 插数据 → 建索引。
3.2 性能优化掩码
掩码 作用 适用场景
GROUP 分组并行装载同一张表 大表(上亿行),效率提升 50%~80%
GROUPS 指定分组数(DM8专用) 如GROUPS|4
FAST 使用 DPI/OCI 批量接口 目标端 DM8/Oracle,追求极致速度
NOLOCK 不对源表上 S 锁 源表业务繁忙,容忍少量不一致
WAIT 上锁时强制等待 允许等待的场景
FLASHBACK 闪回查询装载(DM8/Oracle) 7×24 小时被修改的表,保证一致性
GROUP 掩码的参数差异:
源端 用法 含义
DM7 GROUP|4 分成 4 组
DM8 GROUP|100000 每 10 万行一组
Oracle GROUP|20480 每 20480 个数据块一组
MySQL GROUP|8 分 8 组(需唯一整型主键)
3.3 大对象(LOB)处理掩码
掩码 作用
NOLOB 不装载 LOB 数据,只装普通字段
DELAY 先装普通数据,后更新 LOB(>4000 字节)
LOB 仅更新 LOB 列(配合UPDATE,仅 CP 命令支持)
典型组合:
首次含 LOB 大表:CREATE|INSERT|INDEX|DELAY
只装普通数据:CREATE|INSERT|INDEX|NOLOB
3.4 特殊场景掩码
掩码 说明
EXCHANGE 交换分区装载(目标端 DM7/DM8/Oracle)
PARTITION 仅装载指定分区
WHERE 按条件过滤行(不支持续传)
PDB 指定 Oracle 容器数据库名
ROWID 为无主键表启用 ROWID 辅助列(DM/Oracle 源端)
NCVT 跳过数据清洗转换
NDEFAULT 不装载默认值信息
NOTMP 不装载临时表
ROWS 设置每批读取行数(最大 10000)
TRY 上锁失败重试次数
CHECK/FOREIGN 装载约束(外键谨慎使用)
FORCE 忽略执行端错误强制激活(谨慎)
掩码 MySQL DM8 Oracle
ROWID ❌ ✅ ✅
CONTINUE LOAD ❌ ✅ ✅
FLASHBACK ❌ ✅ ✅
FAST ❌ ✅ ✅
EXCHANGE ❌ ✅ ✅
WAIT ❌ ✅ ✅
GROUP(前提) 唯一整型主键 无特殊 无特殊
WHERE ✅ ✅ ✅
TRUNCATE ✅ ✅ ✅
5.1 普通表(< 1000 万行)
场景 推荐掩码
首次装载 CREATE|INSERT|INDEX
重新装载(结构不变) TRUNCATE|INSERT
重新装载(结构变更) DROP|CREATE|INSERT|INDEX
5.2 大表(> 1000 万行)
源端 推荐掩码
DM7 CREATE|INSERT|INDEX|GROUP|4
DM8 CREATE|INSERT|INDEX|GROUP|100000
Oracle CREATE|INSERT|INDEX|GROUP|20480
MySQL CREATE|INSERT|INDEX|GROUP|8(需唯一整型主键)
5.3 分区表
场景 推荐掩码
全表装载(目标 DM7/DM8/Oracle) DROP|CREATE|INSERT|GROUP|EXCHANGE
单分区装载 TRUNCATE|INSERT|GROUP|PARTITION|“P1”
5.4 含 LOB 的表
场景 推荐掩码
LOB 数据量小 CREATE|INSERT|INDEX
LOB 数据量大 CREATE|INSERT|INDEX|DELAY
只装普通数据 CREATE|INSERT|INDEX|NOLOB
5.5 源表业务繁忙(无法加锁)
场景 推荐掩码
允许少量不一致 INSERT|GROUP|NOLOCK
必须一致(DM8/Oracle) INSERT|GROUP|FLASHBACK
可以等待 INSERT|GROUP|WAIT|TRY|10
5.6 无主键表
源端 推荐掩码
MySQL CREATE|INSERT|INDEX(不支持 ROWID)
DM8/Oracle CREATE|INSERT|ROWID
6.1 ADD DICT —— 仅添加增量同步
当表已通过其他方式(如备份恢复)完成全量初始化时,使用ADD DICT直接开始增量同步。
ALTER [CPT_NAME] ADD DICT “<FILTER>” [LOAD_MASK]
掩码扩展:
LSN:指定起始 LSN,不指定则从 0 开始
PDB:容器数据库场景
– 添加单张表增量
ALTER cpt_dm8 ADD DICT “SCH.NAME=‘RESOURCES’ AND TAB.NAME=‘EMPLOYEE’”;
– 从当前 LSN 开始
ALTER cpt_dm8 ADD DICT “SCH.NAME=‘RESOURCES’ AND TAB.NAME=‘DEPARTMENT’” LSN;
6.2 DELETE DICT 与 TERMINATE DICT
– 删除增量同步表(仅源端移除)
ALTER cpt_dm8 DELETE DICT RESOURCES.EMPLOYEE;ALTER cpt_dm8 DELETE DICT ALL;
– 终止并通知目标端清理(不可逆)
ALTER cpt_dm8 TERMINATE DICT RESOURCES.EMPLOYEE;ALTER cpt_dm8 TERMINATE DICT ALL;
命令 源端行为 目标端行为
DELETE DICT 移除监控 仅移除监控信息
TERMINATE DICT 移除监控 清理对象信息(不可逆)
被TERMINATE的表若要重新同步,必须重新ADD DICT或ADD TABLE。
6.3 ADD 与 UPDATE 的区别
表存在 字典存在 支持命令
✓ ✓ 仅 UPDATE
✓ ✗ ADD 或 UPDATE
✗ ✓ ADD 或 UPDATE
✗ ✗ ADD 或 UPDATE
UPDATE DICT用于刷新已有字典的结构信息。
命令 作用
SHOW [CPT] LOAD STATUS 查看总体装载历史
SHOW [CPT] LOAD STATUS LAST 查看最近一次装载
SHOW [CPT] LOAD TABLE RUNNING 当前正在装载的表
SHOW [CPT] LOAD TABLE ERROR 装载错误的表及原因
SHOW [CPT] LOAD TABLE ALL 所有表的装载状态
SHOW [CPT] LOAD TABLE SCH.TAB 指定表详细信息
SHOW [CPT] LOAD GROUP [N] SCH.TAB 分组装载各组状态
SHOW [CPT] LOAD TABLE LAST [STATE] 所有表最后一次装载详情
SHOW [CPT] LOAD GROUP LAST SCH.TAB 指定表最后一次分组详情
SHOW [CPT] LOAD TABLE SYNC 强制激活同步的表列表
8.1cpvsadd table的区别
命令 用途 是否开启增量
cp 仅全量迁移 ❌
add table 全量 + 增量 ✅(装载完成后自动)
使用add table时,装载过程中产生的增量数据会缓存到检查点,装载完成后自动追平。若装载失败,检查点会堆积,需手动清理或重装。
8.2 装载前检查清单
目标端表是否存在?结构是否匹配?
源端表是否有主键?(MySQL GROUP 需唯一整型主键)
字符集是否一致?
磁盘空间是否充足(检查点文件)?
源库归档日志是否开启且完整?
8.3 性能优化建议
1.大表务必使用 GROUP,效率提升数倍。
2.适当调大load_thr参数(默认 32,建议 64~128)。
3.分区表优先使用EXCHANGE(目标端 DM7/DM8/Oracle)。
4.LOB 表使用DELAY或NOLOB分阶段装载。
5.网络受限时启用compress=1。
8.4 常见错误处理速查
错误现象 可能原因 处理方式
表装载失败 目标表已存在但结构不匹配 用DROP|CREATE|INSERT重建
分组装载失败 无主键或 GROUP 参数不当 去掉 GROUP 或调整参数
上锁超时 源表业务繁忙 使用NOLOCK或FLASHBACK
检查点堆积 表装载失败未处理 TERMINATE DICT清理后重装
ROWID 报错 MySQL 不支持 去掉 ROWID
续传失败 MySQL 不支持 使用CONTINUE RELOAD
8.5 操作规范(生产环境)
1.先在测试环境验证命令和掩码组合。
2.业务高峰期避免大表装载,以免影响源库。
3.NOLOCK慎用,可能导致数据不一致。
4.DROP前确认目标表无独立数据。
5.TERMINATE DICT不可逆,执行前务必确认。
6.定期查看SHOW LOAD TABLE ERROR,及时处理异常。
7.记录每次操作日志(时间、表名、掩码、结果)。
场景 命令
首次装载普通表 ALTER cpt ADD TABLE “SCH.NAME=‘模式’” CREATE|INSERT|INDEX
首次装载大表(DM8) ALTER cpt ADD TABLE “…” CREATE|INSERT|INDEX|GROUP|100000
首次装载大表(MySQL) ALTER cpt ADD TABLE “…” CREATE|INSERT|INDEX|GROUP|8
首次装载分区表 ALTER cpt ADD TABLE “…” DROP|CREATE|INSERT|GROUP|EXCHANGE
首次装载含 LOB 表 ALTER cpt ADD TABLE “…” CREATE|INSERT|INDEX|DELAY
仅全量迁移(不增量) cp cpt “SCH.NAME=‘模式’” CREATE|INSERT|INDEX
重新装载(结构不变) ALTER cpt ADD TABLE “…” TRUNCATE|INSERT
重新装载(结构变更) ALTER cpt ADD TABLE “…” DROP|CREATE|INSERT|INDEX
业务繁忙时(DM8/Oracle) ALTER cpt ADD TABLE “…” INSERT|GROUP|FLASHBACK
无主键表(DM8/Oracle) ALTER cpt ADD TABLE “…” CREATE|INSERT|ROWID
无主键表(MySQL) ALTER cpt ADD TABLE “…” CREATE|INSERT|INDEX
批量添加表(模糊匹配) ALTER cpt ADD TABLE “SCH.NAME=‘模式’ AND TAB.NAME LIKE ‘t%’”
指定掩码重装失败表 ALTER cpt CONTINUE RELOAD DROP|CREATE|INSERT|GROUP
仅添加增量(表已初始化) ALTER cpt ADD DICT “SCH.NAME=‘模式’ AND TAB.NAME=‘表’” LSN
删除增量表 ALTER cpt DELETE DICT 模式.表名
终止增量表(不可逆) ALTER cpt TERMINATE DICT 模式.表名
查看装载状态 SHOW cpt LOAD STATUS
查看装载错误 SHOW cpt LOAD TABLE ERROR
查看运行中的装载 SHOW cpt LOAD TABLE RUNNING
DMDRS 的装载与动态表管理功能十分灵活,但也需要根据源端数据库特性、表结构、数据量、业务压力等因素合理选择掩码组合。掌握本文所述的命令和最佳实践,能让你在数据同步的日常运维中更加从容高效。
文章
阅读量
获赞
