[BUG] DM同步不支持rename table t1 to t1_bak, _new_t1 to t1的操作(TiDB 6.1已经支持)

背景

DM同步任务报错,报错内容为:

"startLocation: [position: (mysql-bin.007702, 409498399), gtid-set: 2873b8da-f7c6-11ea-97a4-00163e1092a8:1-722134916,777234c5-87b7-11ea-9279-00163e1054e6:1-1444325082,784b7fc9-87b7-11ea-a0b7-00163e068fb5:1-1724587836,abc7d256-e94d-11ec-a600-00163e0a892d:1-57,adc3c038-e94d-11ec-8ce1-00163e0489e6:1-2393:9215-43490743], endLocation: [position: (mysql-bin.007702, 409498652), gtid-set: 2873b8da-f7c6-11ea-97a4-00163e1092a8:1-722134917,777234c5-87b7-11ea-9279-00163e1054e6:1-1444325082,784b7fc9-87b7-11ea-a0b7-00163e068fb5:1-1724587836,abc7d256-e94d-11ec-a600-00163e0a892d:1-57,adc3c038-e94d-11ec-8ce1-00163e0489e6:1-2393:9215-43490743], origin SQL: [rename table ying99_fundtxn.fund_order_offline to ying99_fundtxn.fund_order_offline_bak_20221017, ying99_fundtxn._tmp_fund_order_offline to ying99_fundtxn.fund_order_offline]: ddl on multiple table: rename table ying99_fundtxn.fund_order_offline to ying99_fundtxn.fund_order_offline_bak_20221017, ying99_fundtxn._tmp_fund_order_offline to ying99_fundtxn.fund_order_offline not supported"

但其实,TiDB 6.X之后已经支持multi rename的操作,但是DM在解析时候,还是会阻塞这类语句。

MySQL [(none)]> rename table ying99_fundtxn.fund_order_offline to ying99_fundtxn.fund_order_offline_bak_20221017, ying99_fundtxn._tmp_fund_order_offline to ying99_fundtxn.fund_order_offline;
Query OK, 0 rows affected (0.51 sec)
MySQL [(none)]> show variables like 'version';
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| version       | 5.7.25-TiDB-v6.1.1 |
+---------------+--------------------+
1 row in set (0.00 sec)

只能改为增量同步了吧,修改目标表的表名

你这个是tidb同步tidb?

直接上新版了~ :cowboy_hat_face:

是MySQL同步到TIDB,现在MySQL和TiDB都支持multi rename的语法了,但是DM在中间不支持,导致还是同步不下去

Placement Rule in SQL太香了,我们的汇总TiDB当成归档库使用了,现在瓶颈在容量上,每隔一段时间就得扩容TiKV节点。老大经常吐槽成本太高了,升级到6.1.1后,用冷热分离将历史数据放到SATA盘,预计成本能降一半。

这个报错不是因为 RENAME 多张表不支持,而是在悲观/乐观协调下不能在一个语句中包含多个 shard 表/非 shard 表

您这个语句是什么场景?是 online DDL 工具产生的吗

不过我没设置route的,是个单MySQL的同步任务。不过确实今天下午在这个任务使用binlog skip DDL时候,提示我有shard的ddl被阻塞了,我还强制删除了shard lock。有什么命令可以看到任务是不是处于shard状态么?

shard-mode: "pessimistic"       # 任务协调模式,可选的模式有 ""、"pessimistic、"optimistic"。默认值为 "" 即无需协调。如果是分库分表合并任务,请设置为悲观协调模式 "pessimistic"。

知道了,我根据文档上默认配置,设置了shard-mode。我去掉,再试下:rofl:

上新版就支持了

确实是这个原因。我把任务配置里的shard-mode从"pessimistic"改成"",之后就正常了。

可以提供一下配置文件吗,我们看看代码有什么可以优化的

其实代码没什么优化的,只不过官方文档里的模板shard-mode的默认值是"pessimistic" ,加了这个参数就会走分库分表的逻辑。我在复制模板时候,忘了把这一行给去掉。。。

1 个赞

解决问题就好 祝tidb 蒸蒸日上