使用dm做MySQL到TiDB之间的数据同步报错

【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.1.6
【遇到的问题:问题现象及影响】 使用dm同步数据到下游TiDB时报错,因为上游MySQL做了表变更操作,导致dm同步报错"Error 1412: Table definition has changed, please retry transaction",请问这该如何处理呢? dm的版本是v6.1.6

当上游 MySQL 数据库的表结构发生变化时,DM 同步任务可能会报错,错误信息为 “Error 1412: Table definition has changed, please retry transaction”。这是因为 MySQL 在执行 DDL 操作时会对表加锁,如果 DM 正在同步该表,就会导致同步任务失败。

为了解决这个问题,可以尝试以下方法:

  1. 在上游 MySQL 执行 DDL 操作时,尽量避免对正在被 DM 同步的表进行修改。可以在业务低峰期执行 DDL 操作,或者使用在线 DDL 工具,如 pt-online-schema-change 等。
  2. 在 DM 配置文件中,可以通过设置 enable-ansi-quotes 参数为 true,来启用 ANSI 引号模式。这样,在同步 DDL 语句时,DM 会将表名和列名用双引号括起来,避免与 MySQL 关键字冲突。例如:
mysql-instances:
  - source-id: "mysql-replica-01"
    ...
    mydumper-config-name: "global"
    loader-config-name: "global"
    syncer-config-name: "global"
    enable-ansi-quotes: true

需要注意的是,启用 ANSI 引号模式可能会导致一些 MySQL 客户端无法正常连接到 TiDB,因为这些客户端不支持 ANSI 引号模式。因此,在启用该模式时,需要对应用程序进行测试,确保不会出现兼容性问题。
3. 如果以上方法都无法解决问题,可以尝试在 DM 配置文件中,将 safe-mode 参数设置为 false,来关闭 DM 的安全模式。这样,在同步 DDL 语句时,DM 会直接执行 ALTER TABLE 语句,而不是使用 PT 工具进行在线 DDL 操作。例如:

mysql-instances:
  - source-id: "mysql-replica-01"
    ...
    mydumper-config-name: "global"
    loader-config-name: "global"
    syncer-config-name: "global"
    safe-mode: false

需要注意的是,关闭安全模式可能会导致数据不一致或数据丢失等问题,因此在使用该模式时需要格外小心,确保数据的完整性和一致性。

1 个赞

谢谢你 :+1:

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。