Mysql8和Mysql5.7在字符集默认配置、部分SQL语法、系统表结构等方面存在差异,直接迁移数据容易出现兼容性问题,需要按照规范的流程操作才能保证数据完整导入。

迁移前的准备工作
首先需要确认两个数据库的基本信息,包括Mysql8的数据库名称、需要迁移的表清单,Mysql5.7的目标数据库是否已经创建,同时要保证两个数据库的服务都处于正常运行状态,且操作账号拥有对应的读写权限。
还需要注意Mysql8默认字符集是utf8mb4,而Mysql5.7部分旧实例默认字符集是utf8,提前统一字符集可以减少后续导入的报错概率。
从Mysql8导出数据
导出数据时不能使用默认参数,需要指定兼容Mysql5.7的配置,避免导出文件中包含Mysql5.7不支持的语法。
推荐使用mysqldump命令导出,具体参数如下:
# 导出指定数据库的所有表结构和数据,兼容Mysql5.7 mysqldump -h 127.0.0.1 -P 3306 -u root -p --databases test_db --set-gtid-purged=OFF --default-character-set=utf8mb4 --compatible=mysql5.7 > /tmp/mysql8_data.sql
参数说明:
- --set-gtid-purged=OFF:关闭GTID相关语句导出,Mysql5.7如果未开启GTID会报错
- --compatible=mysql5.7:指定导出的SQL语法兼容Mysql5.7版本
- --default-character-set=utf8mb4:指定导出文件的字符集,避免中文乱码
处理导出文件的兼容性问题
导出的SQL文件可能还存在部分Mysql5.7不支持的内容,需要手动或者批量处理:
- 检查文件中是否有
CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci相关内容,Mysql5.7不支持utf8mb4_0900_ai_ci排序规则,需要替换为utf8mb4_general_ci - 删除文件中Mysql8特有的系统函数或者语法,比如
JSON_TABLE等Mysql5.7不支持的函数调用
可以使用sed命令批量替换排序规则:
# 批量替换排序规则为Mysql5.7支持的版本 sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' /tmp/mysql8_data.sql sed -i 's/utf8mb4/utf8/g' /tmp/mysql8_data.sql
导入数据到Mysql5.7
处理完SQL文件后,就可以将数据导入到Mysql5.7中,导入前先确认目标数据库已经创建,且字符集配置为utf8mb4。
导入命令如下:
# 将处理后的SQL文件导入到Mysql5.7 mysql -h 127.0.0.1 -P 3306 -u root -p test_db < /tmp/mysql8_data.sql
如果导入过程中出现报错,可以根据报错信息针对性处理:
- 如果是表结构已存在报错,可以先删除目标库的对应表再重新导入
- 如果是字符集报错,检查导入命令是否指定了正确的字符集,或者目标库的字符集配置
- 如果是语法报错,定位到SQL文件中对应的语句,修改为Mysql5.7支持的语法
导入后验证
导入完成后需要验证数据完整性,避免数据丢失:
- 对比两个库的表数量是否一致
- 抽查部分表的数据行数,确认和Mysql8中的数据一致
- 测试业务常用的查询语句,确认功能正常
如果验证过程中发现数据缺失,可以重新检查导出和导入的步骤,确认是否有步骤遗漏或者参数配置错误。