概述
对于存在自增 ID 的表,若在mysql端存在ID=0的此类不规范数据行。需要在使用 lightning进行历史数据导入时,在tidb环境为sql_mode 添加 “NO_AUTO_VALUE_ON_ZERO ”设置。不然,对于ID=0的行,该行ID值会在tidb环境中,自增为表中最大的 ID 值,导致迁移历史数据时,两个环境数据不一致。
情况描述:业务逻辑上依赖自增ID的连续自增做排序。迁移数据到tidb 之后,由于ID值的改变,测试没有通过,排查后发现此问题。
mysql版本:Server version: 5.6.28
tidb版本:v7.1.1
dumpling版本:v7.4.0
lightning版本:v7.4.0
DM版本:v7.4.0
mysql中数据准备
#sql_mode ,
mysql> show variables like 'sql_mode';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| sql_mode | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+
1 row in set (0.00 sec)
#在mysql创建测试表
create table sync_test(
id int auto_increment primary key,
domain int ,
col char(10),
unique key idx_domain(domain)
)engine=innodb CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;
#插入测试数据
insert into sync_test select 0,0,'测试数据0';
insert into sync_test (domain,col)values(1,'测试数据1'),(2,'测试数据2'),(3,'测试数据3'),(4,'测试数据4');
update sync_test set id=0 where id=1;
最终测试需要的数据,mysql环境数据显示如下:

使用dumpling+lightning 进行数据迁移
#使用dumpling导出全量数据
tiup dumpling -u${mysql_user} -h${mysql_ip} -P3311 -p'****' -o /home/tidb/fate --filetype csv -T backup.sync_test
#使用lightning导入全量数据
tiup tidb-lightning -config tidb-lightning.toml
/***
[lightning]
# 日志
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
# 选择使用的导入模式
backend = "tidb"
# 设置排序的键值对的临时存放地址,目标路径需要是一个空目录
sorted-kv-dir = "/home/tidb/sorted-kv-dir"
[mydumper]
# 源数据目录。
data-source-dir = "/home/tidb/fate"
# 配置通配符规则,默认规则会过滤 mysql、sys、INFORMATION_SCHEMA、PERFORMANCE_SCHEMA、METRICS_SCHEMA、INSPECTION_SCHEMA 系统数据库下的所有表
# 若不配置该项,导入系统表时会出现“找不到 schema”的异常
filter = ['*.*', '!mysql.*', '!sys.*', '!INFORMATION_SCHEMA.*', '!PERFORMANCE_SCHEMA.*', '!METRICS_SCHEMA.*', '!INSPECTION_SCHEMA.*']
[tidb]
# 目标集群的信息
host = "${tidb_ip}"
port = 4000
user = "root"
password = "eeeeeeee"
# 表架构信息在从 TiDB 的“状态端口”获取。
status-port = 10080
# 集群 pd 的地址
pd-addr = "${pd_ip}:2379"
#两个环境的sql_mode 需要配置一样,这里多一个配置,为了处理id=0 问题,测试中,先把这里注释掉
#sql-mode='**,NO_AUTO_VALUE_ON_ZERO'
***/
执行记录:(无报错或警告)
#tidb sql_mode 需要配置与与mysql环境一致。
tidb@testdb-pd:~/lightning_import$ tiup tidb-lightning -config tidb-lightning.toml
tiup is checking updates for component tidb-lightning ...
A new version of tidb-lightning is available:
The latest version: v8.5.4
Local installed version: v7.4.0
Update current component: tiup update tidb-lightning
Update all components: tiup update --all
Starting component `tidb-lightning`: /home/tidb/.tiup/components/tidb-lightning/v7.4.0/tidb-lightning -config tidb-lightning.toml
Verbose debug logs will be written to tidb-lightning.log
+---+----------------------------------------------+-------------+--------+
| # | CHECK ITEM | TYPE | PASSED |
+---+----------------------------------------------+-------------+--------+
| 1 | Source csv files size is proper | performance | true |
+---+----------------------------------------------+-------------+--------+
| 2 | the checkpoints are valid | critical | true |
+---+----------------------------------------------+-------------+--------+
| 3 | Cluster version check passed | critical | true |
+---+----------------------------------------------+-------------+--------+
| 4 | Lightning has the correct storage permission | critical | true |
+---+----------------------------------------------+-------------+--------+
tidb lightning exit successfully
dumpling 导出的数据文件如下:

以上配置导入历史数据,数据不一致,tidb环境数据显示如下:

配置sql_mode为NO_AUTO_VALUE_ON_ZERO(0不触发自增),历史数据导入结果如下:
sql-mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_AUTO_VALUE_ON_ZERO'
