0
0
0
0
博客/.../

MySQL8.4迁移至TiDBv8.5

 一只大芒果  发表于  2026-05-11

前期检查

-- 查询是否有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版本不一致,导致有些不兼容,报错:

image.png

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

image.png

目录各文件详细如下:

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 执行过程中输出的日志信息

image.png

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

 image.png

0
0
0
0

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

评论
暂无评论