DM 多个库同步至TIDB DML是如何实现仅删除本库记录 DDL影响其他库数据

【 TiDB 使用环境】生产\测试环境\ POC
【 TiDB 版本】TIDB v5.4.0 DMv2.0.1
【遇到的问题】请教 DM 将多个库同步至TIDB ,上游源数据库执行delete table, TIDB库中表仅该库的数据被删除, 其他库同步数据未被删除, 实现的原理是什么 是通过事务ID吗, DDL truncate在上游执行 TIDB数据同步执行 影响其他库数据
【复现路径】做过哪些操作出现的问题
【问题现象及影响】如 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 小时日志)

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

binlog 回放时,也是按照数据删除时的状态进行回放的,也是有顺序的
举个栗子:
有A库,B库,C库,合并到 tidb E库,而且 唯一标识上没有合并的冲突问题
如果对C库,XX 表做 删除,C库的binlog会记录 XX 表实际被delete 的记录信息,DM会接收到这些 记录,对 tidb 发起相应的操作

以上是我的理解,希望对你有帮助

下面是参考文档:


1 Like

参考这个试试:https://docs.pingcap.com/zh/tidb/stable/task-configuration-file-full
可以针对不同的库设置过滤条件,也可以设置成多个数据源

非常感谢 我最先的描述可能有些问题 现在补充上了一些例子 请帮忙指点一下

表中每一行数据都有唯一的行键来标记分布式数据库中的唯一一条数据

:+1::+1::+1:

该主题在最后一个回复创建后60天后自动关闭。不再允许新的回复。