DM MySQL多个库同步至TIDB DML仅影响本库数据 DDL影响所有数据

【 TiDB 使用环境】生产\测试环境\ POC
【 TiDB 版本】 TIDB v5.4.0 DM v2.0.1
【遇到的问题】使用DM将MySQL同步至TIDB 上游MySQL执行delete语句仅影响到本库同步的数据 DDL语句影响所有语句 请帮忙解释一下原理 或 官方文档
【复现路径】做过哪些操作出现的问题
【问题现象及影响】
如 MYSQL A库、 MYSQLB库 都有表 test_dm同步数据至TIDB C库 test_dm DM同部方式为all 无event过滤
表有无主键都一样结果
A库
create table test_dm
(
id int,
name varchar(20),
port varchar(20) default ‘3306’,
primary key (id)
);
B库
create table test_dm
(
id int,
name varchar(20),
port varchar(20) default ‘3307’,
primary key (id)
);
C库
create table test_dm
(
id int,
name varchar(20),
port varchar(20) default ‘3308’)
;
A库
MySQL [test_db]> insert into test_dm(id,name) values(1,‘AA’),(2,‘BB’);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

MySQL [test_db]> select * from test_dm;
±—±-----±-----+
| id | name | port |
±—±-----±-----+
| 1 | AA | 3306 |
| 2 | BB | 3306 |
±—±-----±-----+
2 rows in set (0.00 sec)
B库
mysql> insert into test_dm(id,name) values(1,‘AA’),(2,‘BB’);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from test_dm;
±—±-----±-----+
| id | name | port |
±—±-----±-----+
| 1 | AA | 3307 |
| 2 | BB | 3307 |
±—±-----±-----+
2 rows in set (0.00 sec)

C库 (数据全部同步)
MySQL [test_db]> select * from test_dm;
±-----±-----±-----+
| id | name | port |
±-----±-----±-----+
| 1 | AA | 3306 |
| 2 | BB | 3306 |
| 2 | BB | 3307 |
| 1 | AA | 3307 |
±-----±-----±-----+
4 rows in set (0.00 sec)

A库
MySQL [test_db]> delete from test_dm where id=1;
Query OK, 1 row affected (0.00 sec)

MySQL [test_db]> select * from test_dm;
±—±-----±-----+
| id | name | port |
±—±-----±-----+
| 2 | BB | 3306 |
±—±-----±-----+
1 row in set (0.01 sec)

C库 (仅A库id为1数据被删除)
MySQL [test_db]> select * from test_dm;
±-----±-----±-----+
| id | name | port |
±-----±-----±-----+
| 2 | BB | 3306 |
| 2 | BB | 3307 |
| 1 | AA | 3307 |
±-----±-----±-----+
3 rows in set (0.00 sec)

B库
mysql> delete from test_dm where id=2;
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_dm;
±—±-----±-----+
| id | name | port |
±—±-----±-----+
| 1 | AA | 3307 |
±—±-----±-----+
1 row in set (0.00 sec)

C库(仅B库id为2数据被删除)
MySQL [test_db]> select * from test_dm;
±-----±-----±-----+
| id | name | port |
±-----±-----±-----+
| 2 | BB | 3306 |
| 1 | AA | 3307 |
±-----±-----±-----+
2 rows in set (0.00 sec)

B库
mysql> truncate table test_dm;
Query OK, 0 rows affected (0.00 sec)

C库 (全部清空)
mysql> select * from test_dm;
Empty set (0.00 sec)
【附件】

  • 相关日志、配置文件、Grafana 监控(https://metricstool.pingcap.com/)
  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息
  • TiDB-Overview 监控
  • 对应模块的 Grafana 监控(如有 BR、TiDB-binlog、TiCDC 等)
  • 对应模块日志(包含问题前后 1 小时日志)

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

能发下任务配置吗?合库合表迁移有开启 shard-mode 吗(开启之后会过滤掉 truncate)

FYI: https://docs.pingcap.com/zh/tidb/v5.4/feature-shard-merge-pessimistic

我试想问一下 DM在将数据加载到TIDB中 会记录上游的数据库信息吗 每一条记录 key 上都包含上游数据库如库名 行ID 信息吗

你是说 log 里吗?

DM转化binlog过程 或生成TIDB key value 时 是否写入上游信息
另有没有官方文档对这块有说明

  1. 如果您说的数据库信息和上游信息指的是库表结构,那么这些信息会被记录在 dm 本地以及下游 tidb 中(作为 checkpoint);这些信息会用来解析 binlog,协调同步 DDL 等
  2. 如果您说的 key 是 DM 中标识行的 key:DM 会根据库表结构信息解析当前 binlog 的主键或者唯一键,并用行的 主键或者唯一键列作为这一行的唯一标识符,再根据 binlog 再生成 DML,最后让 TiDB 执行(比如,上游执行 update xxx set a=NEW_VAL where b=10,DM 在拿到这些改动行的 binlog 之后,根据改动信息再生成出 DML:update xxx set a=NEW_VAL where id=xxx …);因此,这里的 key 就只是普通的 unique key 或者 primary key,不会包含额外的信息。
  3. 如果您说的 key value 指的是 TiDB 的存储层,即 TiKV,存储的 key value:DM 并不会越过 TiDB 直接调用 TiKV 的接口。至于 TiKV 对这些插入、改动行的编码方式,和直接将上游 SQL 放到 TiDB 中执行是一样的(没有什么上游数据库信息,只有 TiDB 相关的信息)。

请问您是有什么需求需要在数据迁移之后从下游数据库拿到上游的一些库表信息吗?

感谢老师 我的项目不需要获取上游信息
仅是想知道 按照您2解释 上游A库 test_dm 表id=1 与 上游B库 test_dm 表id=1 DM工具 是如何区分这两条数据的 A库删除了id=1的数据 DM仅执行了删除A库 ,B库id=1的数据在TIDB中扔能查到

FYI:https://docs.pingcap.com/zh/tidb/stable/shard-merge-best-practices#跨分表数据在主键或唯一索引冲突处理

如果 id 在全局不唯一,就不建议用来当主键/唯一键了。参照这个文档来解决。

谢谢老师