黄东旭解析 TiDB 的核心优势
389
2024-02-22
版本:DM v2.0.4/5/6
针对分库分表,可能由于唯一健导致同步失败(分表中由于程序bug可能存在唯一健相同的数据,如evaluate_center)
解决
手动在下游TiDB中创建库表,并把唯一健改为普通索引,为了防止因应用强制引用,普通索引名字必须保持和唯一索引一致。
版本: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_开头,数字结尾
版本:DM v2.0.4/5/6
在全量同步时,可能由于全量导出导入太久,上游数据binlog被purged
解决
开始全量导入导出前开启relay log,见任务管理;正常同步后,为了避免磁盘对同步性能的影响,关闭relay log
版本:DM v2.0.4/5/6
当上游执行更新或删除一条数据时,若下游不存在这条数据,DM同步是否会报错?
答案
不会。DM并不会判断这条数据是否存在,而是直接执行update或delete操作。
版本:DM v2.0.4/5/6
加索引会堵塞dml操作,在大表加索引的时候可能会导致复制异常退出,但是会自动恢复
涉及2.0.5及低版本,详细见:https://asktug.com/t/topic/122844?
解决
已反馈给官方,临时解决方案:小表可以直接加,影响不大;大表的话,tidb先加索引,然后再执行gh-ost操作,DM会自动处理加减索引(及加减字段)冲突。
版本: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会自动忽略
版本:DM v2.0.6
若上游kill dm相关连接,dm会如何处理?
结论
报connection was bad错误,DM会自动尝试恢复同步
版本:DM v2.0.6
若TiDB kill dm相关连接,dm会如何处理?
结论
报invalid connection错误,DM会自动尝试恢复同步
版本: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 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操作
发生在任务转移期间:等待其他空闲状态dm-worker接管完成,ddl会正常同步
发在任务转移前,在任务转移期间ddl操作仍未完成:等待其他空闲状态dm-worker接管完成,ddl会正常同步
<div data-theme-toc="true"> </div>?
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。