0
1
0
0
博客/.../

mysql 迁移TiDB问题(1)—— sql_mode配置导致的数据不一致问题

 TiDBer_1bJAfgfv  发表于  2026-03-13
原创

概述

对于存在自增 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环境数据显示如下:

image.png

使用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 导出的数据文件如下:

image.png

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

image.png

配置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'

image.png

0
1
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论