dm同步时丢失更新

tidb有3台:日志时间为:2020/02/19 08:0
tidb.log.gz (994.8 KB)

辛苦提供下脱敏的 insert & update 语句

如下是binlog 日志,具体的sql是由程序写的不确定具体sql是怎样的。

### INSERT INTO `payment_system`.`pay_order`
### SET
###   @1=685904995 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2='2002190800704155592875' /* STRING(66) meta=65090 nullable=0 is_null=0 */
###   @3=NULL /* INT meta=0 nullable=1 is_null=1 */
###   @4='202002190800155460256595' /* VARSTRING(192) meta=192 nullable=1 is_null=0 */
###   @5=71955 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @6='' /* VARSTRING(384) meta=384 nullable=1 is_null=0 */
###   @7=145 /* INT meta=0 nullable=0 is_null=0 */
###   @8='Wechat_Dut' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @9='' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
###   @10=1500 /* INT meta=0 nullable=0 is_null=0 */
###   @11='56e482752869f7bb7f5a306695d8216b' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @12='' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @13=0 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @14='{"nickname":"15037926136","renew":1,"plan_id":"121290","user_id":12754990}' /* VARSTRING(1500) meta=1500 nullable=1 is_null=0 */
###   @15=1036 /* INT meta=0 nullable=0 is_null=0 */
###   @16=2099984205 /* INT meta=0 nullable=0 is_null=0 */
###   @17=174326623 /* INT meta=0 nullable=0 is_null=0 */
###   @18=1582070415 /* INT meta=0 nullable=0 is_null=0 */
###   @19=0 /* INT meta=0 nullable=0 is_null=0 */
###   @20=0 /* INT meta=0 nullable=0 is_null=0 */
###   @21=0 /* INT meta=0 nullable=0 is_null=0 */
###   @22=0 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @23=0 /* INT meta=0 nullable=0 is_null=0 */
###   @24=1582070415 /* INT meta=0 nullable=1 is_null=0 */
###   @25='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @26='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @27='' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @28=0 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @29='' /* STRING(51) meta=65075 nullable=0 is_null=0 */
###   @30=22 /* INT meta=0 nullable=1 is_null=0 */
###   @31=6 /* INT meta=0 nullable=1 is_null=0 */
###   @32='6.5.10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @33='' /* VARSTRING(96) meta=96 nullable=1 is_null=0 */
### UPDATE `payment_system`.`pay_order`
### WHERE
###   @1=685904995 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2='2002190800704155592875' /* STRING(66) meta=65090 nullable=0 is_null=0 */
###   @3=NULL /* INT meta=0 nullable=1 is_null=1 */
###   @4='202002190800155460256595' /* VARSTRING(192) meta=192 nullable=1 is_null=0 */
###   @5=71955 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @6='' /* VARSTRING(384) meta=384 nullable=1 is_null=0 */
###   @7=145 /* INT meta=0 nullable=0 is_null=0 */
###   @8='Wechat_Dut' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @9='' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
###   @10=1500 /* INT meta=0 nullable=0 is_null=0 */
###   @11='56e482752869f7bb7f5a306695d8216b' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @12='' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @13=0 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @14='{"nickname":"15037926136","renew":1,"plan_id":"121290","user_id":12754990}' /* VARSTRING(1500) meta=1500 nullable=1 is_null=0 */
###   @15=1036 /* INT meta=0 nullable=0 is_null=0 */
###   @16=2099984205 /* INT meta=0 nullable=0 is_null=0 */
###   @17=174326623 /* INT meta=0 nullable=0 is_null=0 */
###   @18=1582070415 /* INT meta=0 nullable=0 is_null=0 */
###   @19=0 /* INT meta=0 nullable=0 is_null=0 */
###   @20=0 /* INT meta=0 nullable=0 is_null=0 */
###   @21=0 /* INT meta=0 nullable=0 is_null=0 */
###   @22=0 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @23=0 /* INT meta=0 nullable=0 is_null=0 */
###   @24=1582070415 /* INT meta=0 nullable=1 is_null=0 */
###   @25='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @26='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @27='' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @28=0 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @29='' /* STRING(51) meta=65075 nullable=0 is_null=0 */
###   @30=22 /* INT meta=0 nullable=1 is_null=0 */
###   @31=6 /* INT meta=0 nullable=1 is_null=0 */
###   @32='6.5.10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @33='' /* VARSTRING(96) meta=96 nullable=1 is_null=0 */
### SET
###   @1=685904995 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2='2002190800704155592875' /* STRING(66) meta=65090 nullable=0 is_null=0 */
###   @3=NULL /* INT meta=0 nullable=1 is_null=1 */
###   @4='202002190800155460256595' /* VARSTRING(192) meta=192 nullable=1 is_null=0 */
###   @5=71955 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @6='' /* VARSTRING(384) meta=384 nullable=1 is_null=0 */
###   @7=145 /* INT meta=0 nullable=0 is_null=0 */
###   @8='Wechat_Dut' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @9='' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
###   @10=1500 /* INT meta=0 nullable=0 is_null=0 */
###   @11='56e482752869f7bb7f5a306695d8216b' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @12='' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @13=1 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @14='{"nickname":"15037926136","renew":1,"plan_id":"121290","user_id":12754990}' /* VARSTRING(1500) meta=1500 nullable=1 is_null=0 */
###   @15=1036 /* INT meta=0 nullable=0 is_null=0 */
###   @16=2099984205 /* INT meta=0 nullable=0 is_null=0 */
###   @17=174326623 /* INT meta=0 nullable=0 is_null=0 */
###   @18=1582070415 /* INT meta=0 nullable=0 is_null=0 */
###   @19=0 /* INT meta=0 nullable=0 is_null=0 */
###   @20=0 /* INT meta=0 nullable=0 is_null=0 */
###   @21=0 /* INT meta=0 nullable=0 is_null=0 */
###   @22=0 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @23=0 /* INT meta=0 nullable=0 is_null=0 */
###   @24=1582070415 /* INT meta=0 nullable=1 is_null=0 */
###   @25='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @26='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @27='' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @28=0 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @29='' /* STRING(51) meta=65075 nullable=0 is_null=0 */
###   @30=22 /* INT meta=0 nullable=1 is_null=0 */
###   @31=6 /* INT meta=0 nullable=1 is_null=0 */
###   @32='6.5.10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @33='' /* VARSTRING(96) meta=96 nullable=1 is_null=0 */
### UPDATE `payment_system`.`pay_order`
### WHERE
###   @1=685904995 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2='2002190800704155592875' /* STRING(66) meta=65090 nullable=0 is_null=0 */
###   @3=NULL /* INT meta=0 nullable=1 is_null=1 */
###   @4='202002190800155460256595' /* VARSTRING(192) meta=192 nullable=1 is_null=0 */
###   @5=71955 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @6='' /* VARSTRING(384) meta=384 nullable=1 is_null=0 */
###   @7=145 /* INT meta=0 nullable=0 is_null=0 */
###   @8='Wechat_Dut' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @9='' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
###   @10=1500 /* INT meta=0 nullable=0 is_null=0 */
###   @11='56e482752869f7bb7f5a306695d8216b' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @12='' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @13=1 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @14='{"nickname":"15037926136","renew":1,"plan_id":"121290","user_id":12754990}' /* VARSTRING(1500) meta=1500 nullable=1 is_null=0 */
###   @15=1036 /* INT meta=0 nullable=0 is_null=0 */
###   @16=2099984205 /* INT meta=0 nullable=0 is_null=0 */
###   @17=174326623 /* INT meta=0 nullable=0 is_null=0 */
###   @18=1582070415 /* INT meta=0 nullable=0 is_null=0 */
###   @19=0 /* INT meta=0 nullable=0 is_null=0 */
###   @20=0 /* INT meta=0 nullable=0 is_null=0 */
###   @21=0 /* INT meta=0 nullable=0 is_null=0 */
###   @22=0 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @23=0 /* INT meta=0 nullable=0 is_null=0 */
###   @24=1582070415 /* INT meta=0 nullable=1 is_null=0 */
###   @25='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @26='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @27='' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @28=0 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @29='' /* STRING(51) meta=65075 nullable=0 is_null=0 */
###   @30=22 /* INT meta=0 nullable=1 is_null=0 */
###   @31=6 /* INT meta=0 nullable=1 is_null=0 */
###   @32='6.5.10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @33='' /* VARSTRING(96) meta=96 nullable=1 is_null=0 */
### SET
###   @1=685904995 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @2='2002190800704155592875' /* STRING(66) meta=65090 nullable=0 is_null=0 */
###   @3=NULL /* INT meta=0 nullable=1 is_null=1 */
###   @4='202002190800155460256595' /* VARSTRING(192) meta=192 nullable=1 is_null=0 */
###   @5=71955 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @6='' /* VARSTRING(384) meta=384 nullable=1 is_null=0 */
###   @7=145 /* INT meta=0 nullable=0 is_null=0 */
###   @8='Wechat_Dut' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @9='4200000486202002194336752171' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
###   @10=1500 /* INT meta=0 nullable=0 is_null=0 */
###   @11='56e482752869f7bb7f5a306695d8216b' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @12='' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @13=3 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @14='{"nickname":"15037926136","renew":1,"plan_id":"121290","user_id":12754990}' /* VARSTRING(1500) meta=1500 nullable=1 is_null=0 */
###   @15=1036 /* INT meta=0 nullable=0 is_null=0 */
###   @16=2099984205 /* INT meta=0 nullable=0 is_null=0 */
###   @17=174326623 /* INT meta=0 nullable=0 is_null=0 */
###   @18=1582070415 /* INT meta=0 nullable=0 is_null=0 */
###   @19=1582070428 /* INT meta=0 nullable=0 is_null=0 */
###   @20=1582070428 /* INT meta=0 nullable=0 is_null=0 */
###   @21=0 /* INT meta=0 nullable=0 is_null=0 */
###   @22=0 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @23=0 /* INT meta=0 nullable=0 is_null=0 */
###   @24=1582070428 /* INT meta=0 nullable=1 is_null=0 */
###   @25='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @26='' /* VARSTRING(768) meta=768 nullable=0 is_null=0 */
###   @27='o9jnutzbgQehhYqKuF7JDIEFJNVg' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
###   @28=0 /* TINYINT meta=0 nullable=1 is_null=0 */
###   @29='' /* STRING(51) meta=65075 nullable=0 is_null=0 */
###   @30=22 /* INT meta=0 nullable=1 is_null=0 */
###   @31=6 /* INT meta=0 nullable=1 is_null=0 */
###   @32='6.5.10' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @33='' /* VARSTRING(96) meta=96 nullable=1 is_null=0 */

具体变更的字段,可以@13,由0,1,3的变更过程,但目前tidb的13字段为0

先给一下结论,出现这个问题并不是丢数据,而是因为更新的记录被覆盖。

在给的 91.log 里面:

[2020/02/19 08:00:06.071 +08:00] [WARN] [session.go:419] [sql] [conn=35463055] [label=general] [error=“[kv:6]Error: KV error safe to retry tikv restarts txn: Txn(Mvcc(TxnLockNotFound { start_ts: 414730262623289372, commit_ts: 414730264523833360, key: [116, 128, 0, 0, 0, 0, 0, 0, 121, 95, 105, 128, 0, 0, 0, 0, 0, 0, 1, 1, 50, 48, 48, 50, 49, 57, 48, 55, 255, 53, 57, 55, 48, 51, 55, 53, 51, 255, 50, 54, 53, 56, 54, 48, 0, 0, 253] })) [try again later]”] [txn=“Txn{state=invalid}”]
[2020/02/19 08:00:06.071 +08:00] [WARN] [session.go:611] [retrying] [conn=35463055] [schemaVersion=41099] [retryCnt=0] [queryNum=0] [sql=“START TRANSACTION”]

1)Txn(Mvcc(TxnLockNotFound 报错: 这个最常见的是二阶段提交耗时过长,而这个事务的 primary lock 对应的 kv 被其他会话查询到的时候,请求 ttl 锁超时3s 后清理掉了 primary lock,导致原先的事务在2pc 提交 primary lock 的时候失败,会出现这种报错。

2)因为 TiDB 默认开启了重试机制,所以后面在不断进行重试,根据 conn=35463055 可以查询到所有的重试过程

3)[2020/02/19 08:01:06.182 +08:00] [WARN] [expensivequery.go:160] [expensive_query] [cost_time=60.098836197s] [conn_id=35463055] [user=root] [txn_start_ts=414730264523833370] [mem_max=“0 Bytes”] [sql=COMMIT]

在重试 60s 之后事务提交

原因:
有一个 session 已经给 tidb 发出了事务请求,但是这个事务由于冲突不断重试,持续了 1 分钟之后才提交成功,覆盖了 DM 被重新拉起(DM 有内部重试机制)后接着同步的数据,并且这条数据在之后又一直没有被修改过,所以产生了更新丢失的假象。

解决办法:
可以先关闭 TiDB 里面的事务重试: tidb_retry_limit 设置为 0
https://pingcap.com/docs-cn/stable/reference/configuration/tidb-server/tidb-specific-variables/#tidb_retry_limit

这值为什么默认为10?并发时都会有这个问题吧。

重试过程中,为什么dm还能正常被update,不应该有锁吗?

当前环境只有DM有写,dm并发写导致的?

默认重试次数是 10 ,可以根据需要调整。重试过程跟 DM 没关系,DM 已经拉到数据再给下游 TiDB 写入,至于锁的问题,可以了解下 TiDB 里面的乐观锁实现。暂时的处理方式是建议关掉 TiDB 层面的重试,保证数据不会出现覆盖更新问题。

好的,已经调整了,我再继续观察下

好的,辛苦

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。