Data Migration 运维常见问题
作者: Haaahei 原文来源:https://tidb.net/blog/201f3b3b
问题 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 会正常同步
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/d681f3e083c50c8c2c6788f20】。文章转载请联系作者。
评论