Dm同步mysql报错

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0
  • 【问题描述】:tidb通过dm工具同步线上数据,遇到pt工具改表报错,

1、pt脚本如下:

Db=aaa Tab=aaa Master_Host=10.10.30.136 Product=ceshi Port=3324 Charset=utf8mb4 User=aaa Passwd=‘X4yQMQ0yJc’ Base_Dir=/home/mysql/online/nice Data_Dir=${Base_Dir}/data/$(date +%F) Log_Dir=${Base_Dir}/logs Log_File=${Log_Dir}/${Product}.log

[[ -d “$Data_Dir” ]] || mkdir -p $Data_Dir [[ -d “$Log_Dir” ]] || mkdir -p $Log_Dir

/bin/pt-online-schema-change --sleep=2 --max-lag=10000 --max-load Threads_running=5000 --critical-load Threads_running=500 --user=$User --password=$Passwd -h $Master_Host -P $Port --no-check-replication-filters D=$Db,t=$Tab --charset=$Charset --alter=" add index idx_name (name) ;" --execute >> $Log_File 2>> $Log_File

2、aaa表结构如下: mysql> show create table aaaG *************************** 1. row *************************** Table: aaa Create Table: CREATE TABLE aaa ( id int(10) NOT NULL AUTO_INCREMENT, name varchar(20) NOT NULL DEFAULT ‘’ COMMENT ‘name’, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 1 row in set (0.00 sec)

3、报错信息: “msg”: "[code=36022:class=sync-unit:scope=internal:level=high] current pos (mysql-bin|000001.000045, 123289903): ddl on multiple table: RENAME TABLE aaa.aaa TO aaa._aaa_old, aaa._aaa_new TO aaa.aaa not supported

/bin/pt-online-schema-change 用来修改 TiDB ?
TiDB rename不支持同时修改多个表

修改的不是tidb,是tidb的上游同步mysql

您好: 请问上游mysql和下游tidb对应的这张aaa表, 是一对一还是,多对一?

一对一的关系,

新的测试:环境与上面的相同,数据表时一对一的关系,脚本如下:

数据表: CREATE TABLE kk_user_settings ( id int(11) unsigned NOT NULL AUTO_INCREMENT, uid int(11) NOT NULL, option enum(‘vibrate’,‘night_mode’,‘mobile_find’,‘chat_limit’,‘push_sound’,‘local_logo’,‘only_friend_at’,‘allow_other_save’,‘allow_mobile_recommend’,‘private_account’,‘notice_on_chat’,‘notice_on_follow’,‘notice_on_comment’,‘notice_on_like’,‘notice_on_save’,‘notice_on_at’,‘chat_bottle_on’,‘chat_bottle_view’,‘notice_on_live’,‘allow_friends_behavior’,‘notice_on_brand_like’,‘allow_show_map’,‘notice_on_story’,‘sync_to_have’,‘seller_new_auto_online’,‘seller_sec_auto_online’,‘want_first_online’,‘want_lower_sell_price’,‘want_new_bid_price’,‘bid_lower_sell_price’,‘bid_higher_bid_price’,‘bid_new_bid_price’,‘sell_lower_sell_price’,‘sell_higher_bid_price’,‘sell_new_bid_price’,‘want_new_sec_product’,‘want_bid_max_price’,‘storage_buyer_deal_price’,‘storage_higher_bid_price’,‘want_sale_increase’,‘resale_buyer_deal_price’,‘sync_sale_dynamic’,‘sync_purchase_dynamic’,‘sync_have_dynamic’,‘sync_want_dynamic’,‘sell_sec_new_want’) NOT NULL DEFAULT ‘vibrate’, value enum(‘yes’,‘no’) NOT NULL DEFAULT ‘yes’, last_modify_time int(10) NOT NULL DEFAULT ‘0’ COMMENT ‘最后更新时间’, PRIMARY KEY (id), UNIQUE KEY option (uid,option), KEY uid (uid) ) ENGINE=InnoDB AUTO_INCREMENT=42536671 DEFAULT CHARSET=utf8;

操作:使用pt工具删除索引uid pt脚本内容: Db=dm_test Tab=kk_user_settings Master_Host=10.10.30.136 Product=ceshi Port=3324 Charset=utf8mb4 User=aaa Passwd=‘XQMQ0yJc’

/bin/pt-online-schema-change --sleep=3 --max-lag=10000 --max-load Threads_running=5000 --critical-load Threads_running=500 --user=$User --password=$Passwd -h $Master_Host -P $Port --no-check-replication-filters D=$Db,t=$Tab --charset=$Charset --alter=" drop index uid ;" --execute

测试过程中报主键冲突的错误 “msg”: “[code=10006:class=database:scope=not-set:level=high] execute statement failed: commit: Error 1062: Duplicate entry ‘4588329’ for key ‘PRIMARY’ngithub.com/pingcap/dm/pkg/terror.(*Error).Delegate /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/terror/terror.go:267ngithub.com/pingcap/dm/pkg/conn.(*BaseConn).ExecuteSQLWithIgnoreError /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/conn/baseconn.go:164ngithub.com/pingcap/dm/syncer.(*DBConn).executeSQLWithIgnore.func2 /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/db.go:258ngithub.com/pingcap/dm/pkg/retry.(*FiniteRetryStrategy).Apply /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/retry/strategy.go:71ngithub.com/pingcap/dm/pkg/conn.(*BaseConn).ApplyRetryStrategy /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/conn/baseconn.go:180ngithub.com/pingcap/dm/syncer.(*DBConn).executeSQLWithIgnore /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/db.go:253ngithub.com/pingcap/dm/syncer.(*DBConn).executeSQL /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/db.go:280ngithub.com/pingcap/dm/syncer.(*Syncer).sync.func3 /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:970ngithub.com/pingcap/dm/syncer.(*Syncer).sync /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1002ngithub.com/pingcap/dm/syncer.(*Syncer).Run.func2 /home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1081 runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1357”, “error”: null

  1. DM 限制了不允许在一条 DDL 语句中对多个 table 进行变更
  2. 为支持 pt-osc 的 online DDL change 语句,需要配置 online-ddl-scheme ,检查下是否配置了
  3. 其他问题请另开一个帖子,尽量在一个帖子里回答一个问题比较好,多谢

1、online-ddl-scheme这个怎么配置,有没有相关说明文档 2、不明白为什么会主键冲突,pt改表的时候都是从老表中copy的,一行数据应该不会反复copy

能否手工尝试先指定一张表修改? 你的脚本是不是一次会修改多张表?

只修改一个表


如果不存在分表的情况是不是不推荐使用dm同步数据

不分表可以使用,这是最常见的。 这个问题,麻烦发一下inventory.ini, dm-master,dm-worker 和task的配置,以及报错的dm-worker的日志,多谢

我们用二进制包安装的,所以没有inventory.ini文件,其他三个文件内容见附件dm-master.toml (1.7 KB) dm-worker.toml (960 字节) task.yaml (3.3 KB)
报错日志:
[2019/12/04 15:28:45.067 +08:00] [INFO] [relay.go:564] [“flush meta finished”] [component=“relay log”] [meta="master-uuid = 7569236d-f56b-11e9-a332-20040ff3f4e9.000001, relay-binlog = (mysql-bin.000047, 434715003), relay-binlog-gtid = "]
[2019/12/04 15:28:45.249 +08:00] [WARN] [task_checker.go:348] [“task can’t auto resume”] [component=“task checker”] [task=test] [“paused duration”=15m10.00002691s]
[2019/12/04 15:28:50.249 +08:00] [WARN] [task_checker.go:348] [“task can’t auto resume”] [component=“task checker”] [task=test] [“paused duration”=15m15.000179911s]
[2019/12/04 15:28:55.249 +08:00] [WARN] [task_checker.go:348] [“task can’t auto resume”] [component=“task checker”] [task=test] [“paused duration”=15m20.000036551s]
[2019/12/04 15:29:00.249 +08:00] [WARN] [task_checker.go:348] [“task can’t auto resume”] [component=“task checker”] [task=test] [“paused duration”=15m24.999986383s]
[2019/12/04 15:29:05.249 +08:00] [WARN] [task_checker.go:348] [“task can’t auto resume”] [component=“task checker”] [task=test] [“paused duration”=15m30.000008664s]
[2019/12/04 15:29:10.249 +08:00] [WARN] [task_checker.go:348] [“task can’t auto resume”] [component=“task checker”] [task=test] [“paused duration”=15m35.00001772s]
[2019/12/04 15:29:15.067 +08:00] [INFO] [relay.go:564] [“flush meta finished”] [component=“relay log”] [meta="master-uuid = 7569236d-f56b-11e9-a332-20040ff3f4e9.000001, relay-binlog = (mysql-bin.000047, 442544996), relay-binlog-gtid = "]
[2019/12/04 15:29:15.249 +08:00] [WARN] [task_checker.go:348] [“task can’t auto resume”] [component=“task checker”] [task=test] [“paused duration”=15m39.999951458s]
[2019/12/04 15:29:20.249 +08:00] [WARN] [task_checker.go:348] [“task can’t auto resume”] [component=“task checker”] [task=test] [“paused duration”=15m44.999950603s]

报错内容:
“msg”: “[code=10006:class=database:scope=not-set:level=high] execute statement failed: commit: Error 1062: Duplicate entry ‘4585082’ for key ‘PRIMARY’
github.com/pingcap/dm/pkg/terror.(*Error).Delegate
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/terror/terror.go:267
github.com/pingcap/dm/pkg/conn.(*BaseConn).ExecuteSQLWithIgnoreError
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/conn/baseconn.go:164
github.com/pingcap/dm/syncer.(*DBConn).executeSQLWithIgnore.func2
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/db.go:258
github.com/pingcap/dm/pkg/retry.(*FiniteRetryStrategy).Apply
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/retry/strategy.go:71
github.com/pingcap/dm/pkg/conn.(*BaseConn).ApplyRetryStrategy
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/conn/baseconn.go:180
github.com/pingcap/dm/syncer.(*DBConn).executeSQLWithIgnore
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/db.go:253
github.com/pingcap/dm/syncer.(*DBConn).executeSQL
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/db.go:280
github.com/pingcap/dm/syncer.(*Syncer).sync.func3
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:970
github.com/pingcap/dm/syncer.(*Syncer).sync
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1002
github.com/pingcap/dm/syncer.(*Syncer).Run.func2
/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1081
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1357”,

你好: 报错是 commit: Error 1062: Duplicate entry ‘4585082’ for key ‘PRIMARY’。 这个日志不够多,看起来是某个数据在提交的时候报错了吗? 能否检查下,是否有数据的重复? 主键冲突了?。 请先在上游查看是否存在冲突的数据

在tidb里查询的时候数据确实有了 问题来了,为什么会两次写入同一行数据呢

你的意思是上游mysql只有这一条数据,但是tidb已经导入了,又要导入一次? 能否先排查下业务上可能有重复这种情况? 另外当前这个是在loader阶段,还是syncer阶段?

人为向自增列写入值后 TiDB 分配自增值时报 “Duplicate entry” 错误的处理方法: 在集群中有多个 tidb-server 时,人为向自增列写入值之后,可能会导致 TiDB 分配自增值冲突而报 “Duplicate entry” 错误: 假设有这样一个带有自增 ID 的表:create table t(id int unique key auto_increment, c int); TiDB 实现自增 ID 的原理是每个 tidb-server 实例缓存一段 ID 值用于分配(目前会缓存 30000 个 ID),用完这段值再去取下一段。 假设集群中有两个 tidb-server 实例 A 和 B(A 缓存 [1,30000] 的自增 ID,B 缓存 [30001,60000] 的自增 ID),依次执行如下操作: 客户端向 B 插入一条将 id 设置为 1 的语句 insert into t values (1, 1),并执行成功。 客户端向 A 发送 Insert 语句 insert into t © (1),这条语句中没有指定 id 的值,所以会由 A 分配,当前 A 缓存了 [1, 30000] 这段 ID,所以会分配 1 为自增 ID 的值,并把本地计数器加 1。而此时数据库中已经存在 id 为 1 的数据,最终返回 Duplicated Entry 错误。 处理该问题只需要调大表上的 AUTO_INCREMENT 属性值即可让所有 tidb-server 重新获取一段自增 ID: 确认表上自增值的最大值:show create table t; 修改表上的自增值最大值到一个更大的值:alter table t AUTO_INCREMENT=120000;

syncer阶段

这个表是同步的线上业务表,不存在手动修改的情况,只是单纯的同步线上的ddl、dml操作。

经过测试发现: 1、使用dm工具全量同步该表时数据正常写入 2、使用dm工具增量同步该表时写入数据报错

所以,问题有没有可能是:dm执行事务异常,事务已经提交成功但dm判断为执行失败,然后执行retry,导致主键冲突

  1. 麻烦看下Gin的答复是否相符
  2. 如果是其他问题,请把完整的dm-worker的日志上传。 另外查一下dm_meta库下会有你的 syncer 的表,把这几个表的查询结果反馈下,多谢