数据库同步运维中,DDL 同步异常导致链路中断、数据同步停滞是高频棘手故障。本文分享一则真实生产案例:源端通过 DMS 无锁变更新增字段,前两条字段正常同步,第三条字段缺失引发同步报错阻塞,完整拆解报错现象、底层根因、故障流转逻辑与长效解决方案。
现象:源端执行了 3 个 ADD COLUMN DDL,前两个成功同步到目标端,第三个 r_supplier_info.as_creditor_declaration 未同步,导致链路阻塞。
错误码:CONNECTOR-SIGE00000001
等级:ERROR
错误信息:
Column doesn
't exist in target table [XXX]. Possible reasons: 1. Columns have been added to the source, but incremental DDL synchronization is not enabled. 2. Although incremental DDL synchronization is enabled, DDL conversion may have failed. 3. The synchronization schema feature has been enabled, but the specified column does not exist on the target side. Origin error message: handleColumnsOnlyInSource: [asXXX] in [riXX not found in target table [hxx.riXX]
错误原因:Unknown
客户使用 DMS 无锁结构变更工具 执行
ADD COLUMN 操作。该工具为了保证"不锁表",会先将原始 DDL 拆分成两步:
原始 DDL:
ALTER TABLE rXX ADD COLUMN asXX varchar(8) DEFAULT NULL COMMENT
'xxx';
DMS 无锁变更拆分为:
① ALTER TABLE xxx AUTO_INCREMENT = xx; ← 影子表自增值同步
② ALTER TABLE xxx ADD COLUMN xxx varchar(8)...;
| DDL 类型 | OMS 是否支持同步 | 说明 |
|---|---|---|
| ALTER TABLE ... ADD COLUMN ... | 支持 | 标准的 DDL 类型 |
| ALTER TABLE ... AUTO_INCREMENT = xxx | 不支持 | OMS 当前未兼容此场景 |
OMS 的 DDL 解析器不支持解析 ALTER TABLE ... AUTO_INCREMENT = xxx 这类命令(它不会被转换成目标端的 DDL),导致整条链路卡住,影子表上的 ADD COLUMN 也无法同步到真正的目标表。
前两个表(
transaction_base_info_ext、
transaction_uprimer_vat_payment_extra)没有自增列或者当时无锁工具没有触发 AUTO_INCREMENT 拆分,因此 DDL 是单条发送的,OMS 正常解析同步。
plaintext
DMS 无锁变更提交
│
▼
┌─────────────────────────────────────────────┐
│ 拆分 DDL │
│ │
│ ① AUTO_INCREMENT = xxx (OMS 不识别) │
│ ② ADD COLUMN xxx (正常应该同步) │
└──────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ OMS obcdc 增量解析 │
│ │
│ 读到 ① → ❌ 无法解析 → DDL 同步流程中断 │
│ 读到 ② → ⏸️ 被阻断未到达目标端 │
└──────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ OMS Writer 写入目标端 │
│ │
│ 目标端 schema 中缺少 as_creditor_declaration │
│ → DML 写入时报 ColumnNotExistException │
│ → 链路卡住 │
└─────────────────────────────────────────────┘
在目标端手动补建缺失列
DMS 无锁变更需要在 OMS 侧额外配置两个参数以支持该场景。
如果业务允许,直接通过 ODC 或 MySQL 客户端执行标准 DDL(不使用 DMS 无锁变更),OMS 可以原生支持并同步。
每次使用 DMS 无锁变更时,确认目标端是否成功同步,如果未同步则手动在目标端执行
ADD COLUMN。
条件 是否触发此问题
表无 AUTO_INCREMENT 列 + 普通 DDL ❌ 不触发
表有 AUTO_INCREMENT 列 + 直接执行 DDL ❌ 不触发
表有 AUTO_INCREMENT 列 + DMS 无锁变更 ✅ 触发
1. 直接原因:
DMS 无锁变更将 ADD COLUMN 拆成 AUTO_INCREMENT + ADD COLUMN 两条 DDL,OMS 无法解析 AUTO_INCREMENT 命令
2. Ongoing 限制:
OMS 当前不支持
ALTER TABLE ... AUTO_INCREMENT = xxx 这类 DDL 的解析同步
3. 规避措施:
○ OMS 侧配置 DMS 无锁变更兼容参数
○ 或执行 DDL 前确认表结构是否带自增列,带自增列的表谨慎使用 DMS 无锁变更
○ 执行后验证目标端 schema 是否同步成功
如果你在实际操作中遇到问题,可以在评论区留言交流。后续我们会持续分享更多运维干货,记得 关注不迷路 ,下次见~
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047467/viewspace-3174473/ ,如需转载,请注明出处,否则将追究法律责任。