You need to enable JavaScript to run this app.
文档中心
大数据研发治理套件

大数据研发治理套件

复制全文
下载 pdf
整体解决方案
MySQL CDC 无锁结构变更产品说明
复制全文
下载 pdf
MySQL CDC 无锁结构变更产品说明

背景信息

在大表上直接执行 DDL,可能长时间占用数据库资源或阻塞业务写入。无锁结构变更工具通常通过影子表完成结构变更,基本过程如下:

  1. 根据业务原表创建影子表。
  2. 在影子表上执行目标 DDL。
  3. 将原表的存量数据复制到影子表。
  4. 将原表持续产生的增量数据回放到影子表。
  5. 在数据追平后切换新旧表。

这一过程中,Binlog 中的结构变更主要发生在影子表,而业务 DML 仍来自原表;同时还会出现影子表、日志表、旧表等工具内部数据。如果 DataSail 将这些表都当作普通业务表处理,可能出现以下问题:

  • 影子表上的 DDL 无法归属到业务原表,下游表结构不能及时更新。
  • 影子表和日志表的 DML 被重复同步,造成冗余数据或下游出现工具内部表。
  • 下游已经更新表结构,但原表增量数据仍按旧结构解析,造成字段不匹配。
  • 不同工具的临时表命名方式不同,固定单一规则无法覆盖实际使用场景。

MySQL CDC 无锁结构变更能力通过识别工具协议和临时表角色,使 DataSail 在变更期间继续同步业务原表的数据与结构。

适用场景

  • MySQL CDC 同步任务在增量运行期间需要执行 Online DDL。
  • 源库使用 gh-ost、pt-osc、火山引擎 DBW 无锁结构变更或阿里 DMS 无锁结构变更。
  • 需要避免无锁变更工具的内部表和内部数据进入下游。
  • 需要将影子表上的结构变更归属到已配置的业务原表。

支持的数据库类型

源端适用于 MySQL CDC V3 增量同步任务。目标端必须支持 DataSail Schema Change 事件以及对应的 DDL 执行能力;未开启结构变更同步或目标端不支持对应 DDL 时,无法完成目标表结构变更。
具体能否完成某项结构变更,取决于源端 MySQL、无锁结构变更工具、DataSail 支持的 DDL 语句以及目标端连接器的结构变更能力。目标端类型和 DDL 范围以对应连接器文档为准。

引擎版本要求

无锁结构变更能力仅支持 DataSail 1.51.0 及以上引擎版本。使用低版本引擎的存量任务,应先升级引擎版本,再配置并启用无锁结构变更能力;否则无法获得本文所述的影子表识别、变更计划管理和新旧表切换(cut-over)处理能力。

支持的无锁变更工具

协议配置值

工具或产品

主要数据影子表

其他工具表

GH_OST

gh-ost 及兼容实现

_原表_gho、~原表_gho

对应的 ghc、del 表

PT_OSC

pt-online-schema-change

_原表_new、~原表_new

对应的 old 表

PT_OSC、GH_OST

火山引擎 DBW 无锁结构变更(VeDB MySQL)

~原表_6位标识_gho 、原表_10位标识_new

对应的 old、del 表

ALI_OST

阿里 DMS 无锁结构变更

tp_{变更ID}_ogt_{原表}、tp_{变更ID}_g_{原表}

对应的 ogl、l、del、d 表

说明

  • GH_OST 相关命名中的 6 位标识支持数字和大小写字母。
  • 火山引擎 DBW 无锁结构变更的 VeDB MySQL 临时表采用 PT_OSC 协议识别,其中标识为 10 位数字或字母。
  • ALI_OST 中的变更 ID 为数字。
  • 普通 tpa_* 表不会被 ALI_OST 规则统一识别为临时表。
  • 配置 online_ddl_rules 后,只有参数中列出的协议才会生效。详细说明请参见online_ddl_rules。

高级参数

online_ddl_rules

参数全名:job.reader.online_ddl_rules
用于启用协议模式并指定需要识别的无锁变更工具。

  • 参数属性
    参数配置属性如下:

    属性

    说明

    是否必填

    否

    可选值

    GH_OST、PT_OSC、ALI_OST

    多值格式

    使用英文逗号分隔。

    大小写

    不敏感,参数前后空格会被忽略。

  • 配置示例
    以下示例同时启用 GH_OST、PT_OSC 和 ALI_OST 三种协议:

    {
      "job": {
        "reader": {
          "online_ddl_rules": "GH_OST,PT_OSC,ALI_OST"
        }
      }
    }
    
  • 使用规则说明

    • 只启用 online_ddl_rules 配置的协议。例如设置为 "GH_OST,PT_OSC" 时,仅识别 gh-ost 和 pt-osc。
    • 未配置该参数时,继续使用原有 gh-ost、pt-osc 开关和自定义正则配置。其中,gh-ost 默认开启,pt-osc 默认关闭。
    • 显式配置该参数后,仅按参数中列出的协议识别临时表,原有开关和自定义正则不再参与识别。依赖自定义正则的存量任务应在修改前确认新协议能够覆盖现有临时表命名。
    • 如果填写该参数,必须提供合法的非空协议列表;格式错误或包含不支持的值会导致任务启动失败。

online_ddl_original_tables

参数全名:job.reader.online_ddl_original_tables
如果业务原表名称恰好符合无锁变更临时表格式,可以通过该参数将其声明为业务原表,避免 DDL 或 DML 被误判和过滤。

  • 参数属性
    参数配置属性如下:

    属性

    说明

    是否必填

    否

    单表格式

    database.table

    多值格式

    使用英文逗号分隔。

    匹配方式

    库名和表名精确匹配。

  • 配置示例

    {
      "job": {
        "reader": {
          "online_ddl_rules": "GH_OST,PT_OSC,ALI_OST",
          "online_ddl_original_tables": "sales._orders_new,sales.tp_123_g_orders"
        }
      }
    }
    

    以上配置的效果如下:

    • sales._orders_new 作为业务原表处理,不识别为 pt-osc 影子表。
    • sales.tp_123_g_orders 作为业务原表处理,不识别为阿里 DMS 影子表。
    • 其他数据库中的同名表不受影响。

注意

  • 每个表都必须填写完整的 database.table,不支持只填写表名或三段式名称。
  • 各表之间使用单个英文逗号分隔,不允许出现空项、连续逗号或末尾逗号,例如 "sales.orders,,sales.users"、"sales.orders,"。
  • 格式不合法时任务将启动失败。

处理机制

DataSail 按 Binlog 顺序处理无锁结构变更事件,并为每个数据影子表维护独立的变更计划。影子表的结构变更不会在源端完成新旧表切换前作用于下游业务表。

源端 Binlog 事件

DataSail 处理方式

创建影子表

建立独立的变更计划,不在下游创建影子表。

修改影子表结构

将 DDL 记录到对应变更计划,不立即修改下游业务表。

影子表和辅助表 DML

作为工具内部数据过滤,不写入下游。

切换前的业务原表 DML

继续按业务原表当前结构正常同步。

新旧表切换(cut-over)

根据实际 RENAME 精确激活对应影子表的变更计划,并将结构变更作用于下游业务表。

删除影子表

清理对应的变更计划,不向下游传递影子表 DROP。

要将结构变更同步到下游,任务必须开启结构变更同步,并且目标端支持对应的 DDL。无锁结构变更能力不会扩大 DataSail 或目标端原有的 DDL 支持范围。

常见问题

源端执行无锁结构变更,但 DataSail 任务未开启该能力会怎样?

如果 DataSail 任务未开启无锁结构变更能力,或未启用与源端工具匹配的协议,任务可能无法正确识别影子表和辅助表,也无法将影子表上的 DDL 正确归属到业务原表。源端完成新旧表切换后,下游表结构可能与源端不一致,工具内部数据也可能被当作业务数据处理,进而导致任务失败、重复写入、数据错误或数据丢失。建议在源端执行无锁结构变更前,先在 DataSail 任务中启用对应协议,并确认目标端支持本次 DDL。

是否只支持新增列?

不是。本能力负责识别影子表并将结构变化归属到业务原表,不会扩大 DataSail 原有的 DDL 支持范围。新增列以外的操作能否同步,需要同时满足无锁结构变更工具、DataSail DDL 解析和目标端执行能力。

为什么不把影子表 DML 同步到下游?

影子表数据是工具复制或回放的中间数据。业务原表 DML 已由 DataSail 正常同步,如果再次同步影子表 DML,会造成重复写入或在下游创建工具内部表。

业务原表名称符合影子表格式怎么办?

使用 job.reader.online_ddl_original_tables 将该表声明为业务原表。配置采用 database.table 精确匹配,不会影响其他库中的同名表。

一个业务原表出现多个数据影子表时如何处理?

DataSail 为每个数据影子表分别维护独立的变更计划,不会提前选择其中一个,也不会因同一业务原表存在多个影子表而立即停止任务。源端实际发生新旧表切换时,DataSail 根据 RENAME 精确激活对应影子表的变更计划;其他未切换的影子表不会参与本次结构变更。为避免源端工具相互竞争,仍不建议对同一业务原表并行执行多个无锁结构变更。

无锁结构变更长期未完成时如何处理?

影子表收到 DROP 后,DataSail 会清理对应的变更计划。如果影子表连续 14 天没有 CREATE、ALTER 或 DML 活动,对应变更计划会过期;之后直接收到该影子表的切换事件时,任务将停止并提示变更计划已过期。需要重新执行一轮完整的无锁结构变更,使任务重新读取影子表 CREATE、ALTER 和新旧表切换事件。过期检查由后续 Binlog 事件触发,并非独立的定时任务。

任务启动或升级时源端正在执行无锁结构变更怎么办?

任务必须读取到一轮无锁结构变更完整的影子表 CREATE、ALTER 和新旧表切换事件,才能安全生成下游结构变更。如果任务启动或从旧版本状态升级时无锁结构变更已经开始,可能因缺少影子表 CREATE 计划而停止。建议先等待在途变更完成或取消,再启动或升级任务;如已进入该状态,请重新执行一轮完整的无锁结构变更。

影子表被删除后是否影响业务表继续同步?

正常清理影子表不会影响业务原表继续同步。DataSail 会在收到影子表 DROP 后清理对应的变更计划,并过滤该 DROP,不会在下游删除业务原表。DataSail 根据持续读取的 Binlog 和任务中维护的表结构处理事件,不会在每条数据到来时查询源库影子表。

最近更新时间:2026.09.03 17:37:45
这个页面对您有帮助吗?
有用
有用
无用
无用