mysql binlog-do-db配置了多个库名, 使用dm无法实现增量同步

Bug 反馈
清晰准确地描述您发现的问题,提供任何可能复现问题的步骤有助于研发同学及时处理问题
【 TiDB 版本】
V6.5.0
【 Bug 的影响】
dm无法增量同步

【可能的问题复现步骤】

  1. 源mysql数据库配置为: binlog-do-db=db1,db_to_sync
  2. dm只同步db_to_sync这个库
  3. dm只能全量同步db_to_sync这个库, 无法增量, 且不报错
  4. 源mysql数据库配置为: binlog-do-db=db_to_sync
  5. 此时可以增量同步了

【看到的非预期行为】
无法增量同步, 且日志不报错

【期望看到的行为】
mysql.ini 配置为binlog-do-db=db1,db_to_sync, 在需要同步的库前面有其他不需要的库的时候, 也能增量同步

【相关组件及具体版本】
V6.5.0

【其他背景信息或者截图】
如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。

你的task.yaml怎么写的?

mysql binlog 的配置还有账号权限,都够么?

配置文件贴出来看看

vi source1.yaml
source-id: “mysql-207”
enable-gtid: false
from:
host: “10.0.0.207”
port: 3306
user: “root”
password: “xxx”

vi source2.yaml
source-id: “mysql-208”
enable-gtid: false
from:
host: “10.0.0.208”
port: 3306
user: “root”
password: “xxx”

vi task.yaml

# 2个分库的mysql表(库名表名一致) 合并到tidb
name: "mysql_merge_to_center"
task-mode: all
shard-mode: "pessimistic"
meta-schema: "dm_meta"
ignore-checking-items: ["auto_increment_ID"]

target-database:
  host: 10.x.x.x
  port: 4000
  user: "root"
  password: "xxxxx"

mysql-instances:
  -
    source-id: "mysql-207"
    block-allow-list:  "listA"
  -
    source-id: "mysql-208"
    block-allow-list:  "listA"

block-allow-list:
  listA:
    do-dbs: ["db_to_sync"]
    do-tables:
    - db-name: "db_to_sync"
      tbl-name: "table1"

https://docs.pingcap.com/zh/tidb/stable/dm-task-configuration-guide#配置需要数据源表到目标-tidb-表的映射

如果不需要将数据源表路由到不同名的目标 TiDB 表,可以跳过该项配置。分库分表合并迁移的场景必须配置该规则。

你是个分库分表合并迁移的场景,然而完全没有配置路由规则。
从行为上必然导致207,208这两个mysql实例里面的数据相互覆盖,你下游的表也要做改造的,否则大概率造成两个mysql实例上的主键冲突,导入的时候默认开了safe-mode,数据也会是相互覆盖的。

所以你当然会觉得一会好了一会不好,和你上游的 binlog-do-db一点关系没有。

同步上游的db_to_sync库里面的table1到下游同名的库,同名的表。

routes:                          
  route-rule-1:                  
    schema-pattern: "db_to_sync"      
    table-pattern: "table1"         
    target-schema: "db_to_sync"         
    target-table: "table1"             
  route-rule-2:
    schema-pattern: "db_to_sync"
    target-schema: "db_to_sync"

mysql-instances:
  - source-id: "mysql-207"                   
    block-allow-list:  "listA"                             
    route-rules: ["route-rule-1","route-rule-2"]
  - source-id: "mysql-208"                   
    block-allow-list:  "listA"                             
    route-rules: ["route-rule-1","route-rule-2"]

你这样配置完了以后,务必记得在你下游表的主键里面添加分片键。另外一定要注意下游表的写入热点问题。
不然配置对了,表的主键冲突相互覆盖结果也不会正确。有写入热点,导入也慢。tikv负载也不均衡。

并非一会好,一会不好, 是一直不行. 源表的主键已经做了处理, 确保不会冲突.
不做路由的原因是: 1. 源表的主键不会冲突(workid); 2. 所有的库名表名完全一致

1 个赞

tiup dmctl list-member

tiup dmctl query-status mysql_merge_to_center

你在中控机上执行一下这2个命令,我看看结果,如果没有设置DM_MASTER_ADDR环境变量,可能还要加 --master-addr dm-master-ip:8261

检查DM的日志文件,查找是否有相关的错误或警告信息