sync_diff_inspector在进行核对时,显示核对失败,但其实数据是一致的


如图所示,对比结果显示需要新增9424条数据,同时删除9424条数据。但是我从fix-on-target的目录里抽查了10几条不一致的数据,同时在MySQL和TiDB上查询了下,两者其实是一样的。

分析后发现fix-sql里,有两个文件(应该代表两个不同的核对批次),分别有一条DELETE FROM和REPLACE INTO语句,感觉应该在分批核对时候,找错索引了。

# Diff Configuration.

######################### Global config #########################
check-thread-count = 2
export-fix-sql = true
check-struct-only = false
dm-addr = "http://******:8261"
dm-task = "task1"

######################### Task config #########################
[task]
        output-dir = "./diff_dir"
        target-check-tables = ["db.tb"]

1赞

破案了,是COLLATE导致的,TiDB默认是utf8mb4_bin,区分大小写;而MySQL默认是utf8_unicode_ci,不区分大小写,所以会导致同样的where条件,在MySQL里和TiDB里获取到的数据不一样,所以对比失败了。

1赞

统一了COLLATE后,结果是一致了?

额,还是不可以,发现即便是utf8mb4_unicode_ci,TiDB也是会区分大小写。。

复现方法:

CREATE TABLE `test`.`t1` (
  `name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
insert into test.t1 values ('a357cd6b934f4f9ca600951f73fd4316'), ('WA-TRADEAVQ79KJUNBGD');


image

https://docs.pingcap.com/zh/tidb/stable/tidb-configuration-file#new_collations_enabled_on_first_bootstrap

是没有开启这个导致,5.X(包括)以下是默认关闭的,不管设置哪个collation,TiDB都是二进制比较