DM迁移流程或原理

Job 执行

冲突检测

binlog 顺序同步模型要求按照 binlog 顺序一个一个来同步 binlog event,这样的顺序同步势必不能满足高 QPS 低同步延迟的同步需求,并且不是所有的 binlog 涉及到的操作都存在冲突。Binlog replication 采用冲突检测机制,鉴别出来需要顺序执行的 jobs,在确保这些 jobs 的顺序执行的基础上,最大程度地保持其他 job 的并发执行来满足性能方面的要求。

冲突检测流程如下:

冲突检测实现比较简单,根据转换步骤获得每条 statement 对应的 primary/unique key 信息,来进行交集检测,如果存在交集那么认定是需要顺序的执行两条 statement,请参考 具体实现代码

这个问题,有说法了,dm有冲突检测机制。确保primary/unique key的设置正确,就不会发生上述这种,insert id=1 之后delete id=1,乱序执行的问题。

1 个赞

这几个事件是被dm忽略的。是没有办法同步的。

https://docs.pingcap.com/zh/tidb/stable/shard-merge-best-practices#合表迁移过程中在上游增删表

文档对这个问题有专门的描述。

受益匪浅,学习了~!

表结构更新肯定是不过滤。我说的是 drop truncate create index 。上下游 不一致的只能是索引和表数量

你这个问题。我感觉就是人为造成的呀。tidb不支持alter table 多个修改,所以只要是DM同步的上游mysql所有的DDL 全部单独分开执行。不要写在一个sql里面呀。

是不是版本比较低

dm用的不多,跟着大佬们学习了

DM 是会攒批执行的,可以看下这个文档

https://docs.pingcap.com/zh/tidb/stable/dm-dml-replication-logic#dml-优化逻辑

1 个赞

a) 主键冲突的问题

  • 如果您观察到主键冲突,首先检查以下几点:
    • 确认源表在 Truncate 后确实没有其他插入操作,且在 Truncate 之后,Load 阶段的过程是否有问题。
    • 排查 binlog 是否包含了重复的插入操作,确认在切换到目标表时,是否有并发的写入操作导致冲突。
    • 确认是否有其他业务在操作该表,可能导致主键冲突。

b) 表重命名和结构修改的问题

  • 在表重命名和结构修改时,DM 的操作可能会依赖于 MySQL 的元数据更新的延迟。如果在表重命名后立即进行结构修改,可能会出现 DM 在还未识别到表的新状态时就尝试执行操作。
  • 建议:在进行多次重命名或结构修改时,尽量确保每一步操作都有足够的时间让元数据更新,或者通过 DM 配置调整以确保操作的顺序和完整性。
1 个赞