×
技术社区 >  技术博客 >  OMS 增量同步 DDL 失败:DMS 无锁变更导致目标端缺列

OMS 增量同步 DDL 失败:DMS 无锁变更导致目标端缺列

数据库同步运维中,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

二、根因分析

2.1 DMS 无锁变更的 DDL 拆分机制

客户使用 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)...;

2.2 OMS 的 DDL 解析局限性

DDL 类型 OMS 是否支持同步 说明
ALTER TABLE ... ADD COLUMN ... 支持 标准的 DDL 类型
ALTER TABLE ... AUTO_INCREMENT = xxx 不支持 OMS 当前未兼容此场景

OMS 的 DDL 解析器不支持解析 ALTER TABLE ... AUTO_INCREMENT = xxx 这类命令(它不会被转换成目标端的 DDL),导致整条链路卡住,影子表上的 ADD COLUMN 也无法同步到真正的目标表。

2.3 为什么前两个 ADD COLUMN 成功了

前两个表(transaction_base_info_exttransaction_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      │
  │  → 链路卡住                                  │
  └─────────────────────────────────────────────┘

四、分等级解决方案

4.1 临时恢复

在目标端手动补建缺失列

4.2 长期方案

方案一:配置 OMS DDL 同步参数(推荐)

DMS 无锁变更需要在 OMS 侧额外配置两个参数以支持该场景。

方案二:使用 OMS 原生支持的 DDL 执行方式

如果业务允许,直接通过 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 是否同步成功

精选推荐