0
1
0
0
专栏/.../

Data Migration运维常见问题

 Haaahei  发表于  2022-03-24
原创迁移

问题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

当表结构不一致时,对同步的影响:

  1. 上下游字段数不一致时DML同步 结论 情况一:下游TiDB字段比上游MySQL多 结论:不影响同步,且下游TiDB多的字段类型及默认值没有分库分表合并加字段的限制情况二:下游TiDB字段比上游MySQL少 结论:同步会中断,可以将缺少的字段加进去,然后执行resume-task或者让DM自动恢复

  2. 下游TiDB字段已存在 结论 加字段:不影响同步,DM会自动忽略 MODIFY:遵循TiDB的DDL限制

  3. 下游TiDB字段 不存在 结论 减字段:不影响同步,DM会自动忽略 MODIFY:会导致同步中断,报字段不存在错误,可以将缺少的字段加进去,然后执行resume-task或者让DM自动恢复 加索引:会导致同步中断,报字段不存在错误

  4. 下游TiDB索引 已存在 结论 加索引:不影响同步,DM会自动忽略

  5. 下游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操作:

  1. 发生在leader选举期间:ddl正常同步到下游,对同步无影响
  2. 发生在leader选举前,在选举期间ddl操作仍未完成:ddl正常同步到下游,对同步无影响

情况二、分库分表合并,DDL操作:

  1. 发生在选举期间:需要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)

  1. 发生在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操作

  1. 发生在任务转移期间:等待其他空闲状态dm-worker接管完成,ddl会正常同步
  2. 发生在任务转移前,在任务转移期间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 INDEX idx_c(c)"] [argument="[]"] [error="Error 1061: index already exist idx_c; a background job is trying to add the same index, please check by ADMIN SHOW DDL JOBS"]

情况二、分库分表合并,DDL操作

  1. 发生在任务转移期间:等待其他空闲状态dm-worker接管完成,ddl会正常同步
  2. 发在任务转移前,在任务转移期间ddl操作仍未完成:等待其他空闲状态dm-worker接管完成,ddl会正常同步

0
1
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论