前期检查
-- 查询是否有default(0):所有“默认值写成表达式形式”的字段
--TiDB需替换default '0'
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE COLUMN_DEFAULT LIKE '(%' AND TABLE_SCHEMA = 'db_name';
-- 查所有使用 utf16 / utf16le / utf32 的字段
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
CHARACTER_SET_NAME,
COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = '数据库名称'
AND (
CHARACTER_SET_NAME IN ('utf16','utf16le','utf32')
OR COLLATION_NAME LIKE 'utf16%'
OR COLLATION_NAME LIKE 'utf32%'
)
ORDER BY TABLE_NAME, ORDINAL_POSITION;
-- 查表级别 使用了 utf16 / utf32:有些会在表级声明
SELECT
TABLE_SCHEMA,
TABLE_NAME,
TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_name'
AND (
TABLE_COLLATION LIKE 'utf16%'
OR TABLE_COLLATION LIKE 'utf32%'
);
-- 查库级别默认字符集
SELECT
SCHEMA_NAME,
DEFAULT_CHARACTER_SET_NAME,
DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME ='db_name';
--TiDB 中执行(可选,确保配置对齐)
SET GLOBAL character_set_server = 'utf8mb4';
SET GLOBAL collation_server = 'utf8mb4_general_ci';
一、数据库分别创建各用户
1.1 MySQL8.4用于对比的用户compare_user
mysql -u root -p
-- 创建用户
CREATE USER 'compare_user'@'127.0.0.1' IDENTIFIED BY '123123123';
-- 授予只读权限
GRANT SELECT ON db_name.* TO 'compare_user'@'127.0.0.1';
-- 授予信息模式查询权限(用于表结构对比)
GRANT SHOW DATABASES, SELECT ON *.* TO 'compare_user'@'127.0.0.1';
-- 刷新权限
FLUSH PRIVILEGES;
--查看
mysql -h 127.0.0.1 -u compare_user -p -e "SHOW DATABASES;"
1.2 TIDB用于对比的用户compare_user
使用主机:1.1.1.1
mysql -h 1.1.1.1 -P 4000 -u root -p
--TIDB创建与源库同样的数据库
CREATE DATABASE IF NOT EXISTS db_name;
-- 授权所有 IP 访问(测试环境)
CREATE USER IF NOT EXISTS 'compare_user'@'%' IDENTIFIED BY '123123';
CREATE USER IF NOT EXISTS 'user01'@'%' IDENTIFIED BY '123123';
-- 3. 授予 SHOW DATABASES 权限(至少需要全局 SHOW DATABASES 权限)
GRANT SHOW DATABASES ON *.* TO 'compare_user'@'%';
-- 若需要只读所有库,授权全局 SELECT 权限(生产按需最小化)
GRANT SELECT ON *.* TO 'compare_user'@'%';
GRANT ALL PRIVILEGES ON db_name.* TO 'user01'@'%';
-- 4. 刷新权限(必须执行!)
FLUSH PRIVILEGES;
--查看
mysql -h 1.1.1.1 -P 4000 -u compare_user -p -e "SHOW DATABASES;"
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;
二、备份MySQL8.4
2.1 MySQL8.4备份到目录
ip=127.0.0.1
tiup dumpling \
-h ${ip} \ --ip地址
--port 3306 \ --端口号
-u root \ ---用户
-p ******* \ --密码
--threads 5 \
--rows 200000 \
-F 256MiB \
--database db_name \ --需备份数据库
--no-schemas \
--output '/app/****' --输出地址
2.2 MySQL8.4备份文件压缩为 tar.gz
tar -zcvf ****.tar.gz /app/****
2.3 文件传输到对应机器上
三、恢复到TIDB8.5
3.1 vim TIDB-lightning.toml
[lightning]
level = "info"
file = "TIDB-lightning.log"
[tikv-importer]
backend = "local"
sorted-kv-dir = "/opt/temp" 路径磁盘大一点
[mydumper]
data-source-dir = "/app/backup_mysql/test_db" --备份路径
[TIDB]
host = "1.1.1.1"
port = 4000
user = "root"
password = ""
status-port = 10080
pd-addr = "1.6.1.5:2379,1.6.1.6:2379,1.6.1.7:2379" --pd节点IP
3.2 执行
tiup tidb-lightning -config tidb-lightning.toml
--或者
nohup tiup tidb-lightning -config tidb-lightning.toml > nohup.out 2>&1 &
四、对比数据
4.1 vim sync-diff.toml
# sync-diff-inspector 配置文件
# 对比 MySQL 8.4 到 TIDB 8.5 的数据一致性
# 检查数据库: test_db 所有表
######################### Global config #########################
# 检查数据的线程数量
check-thread-count = 4
# 如果开启,若表存在不一致,则输出用于修复的 SQL 语句
export-fix-sql = true
# 只对比表结构而不对比数据
check-struct-only = false
######################### Datasource config #########################
[data-sources]
# 上游 MySQL 8.4
[data-sources.mysql-source]
host = "127.0.0.1" # 替换为你的 MySQL IP
port = 33060
user = "compare_user" # 替换为你的 MySQL 用户名
password = "123123" # 替换为你的 MySQL 密码
# 如果使用加密密码,可使用 Base64 编码
# password = "MTIzNDU2" # 示例: 123456 的 Base64 编码
# 下游 TIDB 8.5
[data-sources.TIDB-target]
host = "1.1.1.1" # 替换为你的 TIDB IP
port = 4000
user = "compare_user" # 替换为你的 TIDB 用户名
password = "123123" # 替换为你的 TIDB 密码
# (可选)如果使用 TIDB 的 snapshot 功能
# snapshot = "auto"
######################### Task config #########################
[task]
# 输出目录
output-dir = "/app/diff-output"
# 上游数据库
source-instances = ["mysql-source"]
# 下游数据库
target-instance = "TIDB-target"
# 对比 test_db 下的所有表
target-check-tables = ["test_db.*"]
4.2 执行
./sync-diff-inspector --config /app/sync-diff.toml
或
tiup sync-diff-inspector --config /app/sync-diff.toml
tiup list installed --查看安装工具
tiup list sync-diff-inspector --查看版本号
sync-diff-inspector工具原来版本是V9,和TIDBV8.5版本不一致,导致有些不兼容,报错:

使用sync-diff-inspector V8.5版本即可解决,执行成功之后会生成一个diff-output文件夹

目录各文件详细如下:
output/
|-- checkpoint # 保存断点续传信息
| |-- bbfec8cc8d1f58a5800e63aa73e5 # config hash 占位文件,标识该输出目录(output/)对应的配置文件
│ |-- DO_NOT_EDIT_THIS_DIR
│ └-- sync_diff_checkpoints.pb # 断点续传信息
|
|-- fix-on-target # 保存用于修复不一致的 SQL 文件
| |-- xxx.sql
| |-- xxx.sql
| └-- xxx.sql
|
|-- summary.txt # 保存校验结果的总结
└-- sync_diff.log # 保存 sync-diff-inspector 执行过程中输出的日志信息

4.3 shell脚本对比
vim compare_rowcounts.sh
#!/bin/bash
# compare_rowcounts.sh
# 设置MySQL数据库名(允许从命令行参数传入,默认test)
MYSQL_DB="${1:-test}"
# 固定TiDB数据库名为db_name
TIDB_DB="db_name"
# 连接信息
MYSQL_CONN="-h 127.0.0.1 -P 3306 -u compare_user -p123123"
TIDB_CONN="-h 1.1.1.1 -P 4000 -u compare_user -p123123"
echo "正在对比数据库: MySQL($MYSQL_DB) <==> TiDB($TIDB_DB)"
echo "表名 | MySQL行数 | TIDB行数 | 状态"
echo "---|---|---|---"
# 从MySQL获取所有表名
TABLES=$(mysql $MYSQL_CONN -N -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='$MYSQL_DB';")
if [[ -z "$TABLES" ]]; then
echo "错误: 数据库 $MYSQL_DB 中没有表,或数据库不存在"
exit 1
fi
# 初始化统计变量
consistent_count=0
error_count=0
inconsistent_count=0
for table in $TABLES; do
# 获取MySQL表行数
mysql_count=$(mysql $MYSQL_CONN -N -e "SELECT COUNT(*) FROM \`$MYSQL_DB\`.\`$table\`;")
# 获取TiDB表行数(捕获错误)
TIDB_count=$(mysql $TIDB_CONN -N -e "SELECT COUNT(*) FROM \`$TIDB_DB\`.\`$table\`;" 2>/dev/null || echo "ERROR")
# 判断状态并统计
if [[ "$TIDB_count" == "ERROR" ]]; then
status="✗ 表不存在"
error_count=$((error_count + 1))
elif [[ "$mysql_count" -eq "$TIDB_count" ]]; then
status="✓ 一致"
consistent_count=$((consistent_count + 1))
else
diff=$((TIDB_count - mysql_count))
if [[ "$diff" -gt 0 ]]; then
status="✗ TIDB多$diff行"
else
status="✗ TIDB少$((-diff))行"
fi
inconsistent_count=$((inconsistent_count + 1))
fi
# 输出每行对比结果
echo "$table | $mysql_count | $TIDB_count | $status"
done
# 汇总统计(修复原脚本统计错误)
echo -e "\n=== 汇总 ==="
total_tables=$(echo "$TABLES" | wc -w)
echo "总表数: $total_tables"
echo "一致的表: $consistent_count"
echo "行数不一致的表: $inconsistent_count"
echo "TiDB中不存在的表: $error_count"
授权
chmod +x compare_rowcounts.sh
执行
./compare_rowcounts.sh mysqldb_name
