问题1:
版本:DM v2.0.4/5/6
针对分库分表,可能由于唯一健导致同步失败(分表中由于程序bug可能存在唯一健相同的数据,如evaluate_center)
解决
手动在下游TiDB中创建库表,并把唯一健改为普通索引,为了防止因应用强制引用,普通索引名字必须保持和唯一索引一致。
问题2:
版本:DM v2.0.4/5/6
针对分库分表,采用通配符匹配可能导致非分表合并而报错,例如任务相关配置如下:
routes: route-rule-1: schema-pattern: "evaluate_center" table-pattern: "ec_evaluate_" target-schema: "evaluate_center" target-table: "ec_evaluate" route-rule-2: schema-pattern: "evaluate_center" table-pattern: "ec_questionnaire_" target-schema: "evaluate_center" target-table: "ec_questionnaire" route-rule-3: schema-pattern: "evaluate_center" target-schema: "evaluate_center"
block-allow-list: bw-rule-1: do-dbs: ["evaluate_center"] do-tables: - db-name: "evaluate_center" tbl-name: "ec_evaluate_" - db-name: "evaluate_center" tbl-name: "ec_questionnaire_"
这会导致ec_evaluate_和ec_questionnaire_开头的所有表聚合到ec_evaluate和ec_questionnaire中,如非分表 ec_evaluate_config_item ,若表结构不一致则会报错,否则下游数据将会出现问题。
解决
由于 routes 不支持正则表达式,因此需要将 block-allow-list 的配置使用正则,如下:
block-allow-list: bw-rule-1: do-dbs: ["evaluate_center"] do-tables: - db-name: "evaluate_center" tbl-name: "
^ec_evaluate_[0-9]+$" # 以ec_questionnaire_开头,数字结尾 - db-name: "evaluate_center" tbl-name: "^ec_questionnaire_[0-9]+$" # 以ec_questionnaire_开头,数字结尾
问题3:
版本:DM v2.0.4/5/6
在全量同步时,可能由于全量导出导入太久,上游数据binlog被purged
解决
开始全量导入导出前开启relay log,见任务管理;正常同步后,为了避免磁盘对同步性能的影响,关闭relay log
问题4
版本:DM v2.0.4/5/6
当上游执行更新或删除一条数据时,若下游不存在这条数据,DM同步是否会报错?
答案
不会。DM并不会判断这条数据是否存在,而是直接执行update或delete操作。
问题5
版本:DM v2.0.4/5/6
加索引会堵塞dml操作,在大表加索引的时候可能会导致复制异常退出,但是会自动恢复
涉及2.0.5及低版本,详细见:https://asktug.com/t/topic/122844
解决
已反馈给官方,临时解决方案:小表可以直接加,影响不大;大表的话,tidb先加索引,然后再执行gh-ost操作,DM会自动处理加减索引(及加减字段)冲突。
问题6
版本:DM v2.0.4/5/6
当表结构不一致时,对同步的影响:
-
上下游字段数不一致时DML同步 结论 情况一:下游TiDB字段比上游MySQL多 结论:不影响同步,且下游TiDB多的字段类型及默认值没有分库分表合并加字段的限制情况二:下游TiDB字段比上游MySQL少 结论:同步会中断,可以将缺少的字段加进去,然后执行resume-task或者让DM自动恢复
-
下游TiDB字段已存在 结论 加字段:不影响同步,DM会自动忽略 MODIFY:遵循TiDB的DDL限制
-
下游TiDB字段 不存在 结论 减字段:不影响同步,DM会自动忽略 MODIFY:会导致同步中断,报字段不存在错误,可以将缺少的字段加进去,然后执行resume-task或者让DM自动恢复 加索引:会导致同步中断,报字段不存在错误
-
下游TiDB索引 已存在 结论 加索引:不影响同步,DM会自动忽略
-
下游TiDB索引 不存在 结论 减索引:不影响同步,DM会自动忽略
问题7
版本:DM v2.0.6
若上游kill dm相关连接,dm会如何处理?
结论
报connection was bad错误,DM会自动尝试恢复同步
问题8
版本:DM v2.0.6
若TiDB kill dm相关连接,dm会如何处理?
结论
报invalid connection错误,DM会自动尝试恢复同步
问题9
版本:DM v2.0.6
DM发生高可用故障转移时,对DDL有何影响?
结论
故障一:发生dm-master leader选举
情况一、普通同步,DDL操作:
- 发生在leader选举期间:ddl正常同步到下游,对同步无影响
- 发生在leader选举前,在选举期间ddl操作仍未完成:ddl正常同步到下游,对同步无影响
情况二、分库分表合并,DDL操作:
- 发生在选举期间:需要leader选举完成,ddl才会开始同步
dm-worker(putted a shard DDL info into etcd) -> (等待选举完成) -> dm-leader(receive a shard DDL info) -> dm-worker(got a shard DDL lock operation -> start to handle ddls in optimistic shard mode -> finish to handle ddls in optimistic shard mode)
- 发生在leader选举前,在选举期间仍有ddl操作未完成:需要leader选举完成,ddl才会继续同步
dm-worker(putted a shard DDL info into etcd) -> dm-leader(receive a shard DDL info) -> dm-worker(got a shard DDL lock operation -> start to handle ddls in optimistic shard mode -> finish to handle ddls in optimistic shard mode) -> (等待选举完成) -> 同前步骤
故障二:发生dm-worker宕机
情况一、普通同步,DDL操作
- 发生在任务转移期间:等待其他空闲状态dm-worker接管完成,ddl会正常同步
- 发生在任务转移前,在任务转移期间ddl操作仍未完成:ddl正常同步到下游,对同步无影响
[2021/08/19 14:05:26.002 +08:00] [WARN] [baseconn.go:177] ["execute statement failed and will ignore this error"] [task=dm_benchmark] [unit="binlog replication"] [query="ALTER TABLE
dm_benchmark
.sbtest1
ADD INDEXidx_c
(c
)"] [argument="[]"] [error="Error 1061: index already exist idx_c; a background job is trying to add the same index, please check byADMIN SHOW DDL JOBS
"]
情况二、分库分表合并,DDL操作
- 发生在任务转移期间:等待其他空闲状态dm-worker接管完成,ddl会正常同步
- 发在任务转移前,在任务转移期间ddl操作仍未完成:等待其他空闲状态dm-worker接管完成,ddl会正常同步