直接用navicat还原mysql 5.7备份到8.0大概率失败,需先修改认证插件为mysql_native_password、调整sql_mode和字符集(utf8mb4_0900_ai_ci)、运行sql文件时勾选“遇到错误继续”,并还原后验证表数量、数据一致性及表结构。

直接用 Navicat 还原 MySQL 5.7 的备份 SQL 文件到 MySQL 8.0,大概率会失败或数据异常——不是 Navicat 不行,而是 MySQL 8.0 默认启用了更严格的 SQL 模式、新认证插件、新默认排序规则,而 Navicat 导出的 SQL 文件仍按 5.7 规则生成,两者不兼容。
还原前必须改掉 MySQL 8.0 的 caching_sha2_password 认证
Navicat 连接 MySQL 8.0 时若报错 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded,说明认证方式不匹配。MySQL 5.7 默认用 mysql_native_password,而 8.0 改为 caching_sha2_password,但老版本客户端(包括部分 Navicat 版本)不支持后者。
- 连上 MySQL 8.0 后执行:
USE mysql;→ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 如果要允许远程连接,把
'localhost'换成'%',并确认已执行FLUSH PRIVILEGES; - 这步不做,Navicat 根本连不上,后续所有还原操作都卡在第一步
还原 SQL 文件时必须手动调整 sql_mode 和字符集
Navicat 导出的 SQL 文件通常包含 CREATE DATABASE 和 CREATE TABLE 语句,其中字符集和 SQL 模式若与目标库不一致,会导致建表失败、中文乱码或字段被截断。
- 在 MySQL 8.0 中执行:
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; - 新建数据库时显式指定:
CREATE DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;(不能只写utf8mb4,否则默认用旧的utf8mb4_general_ci,索引可能失效) - 如果导出的 SQL 文件里有
DEFAULT CHARSET=utf8,需全局替换为DEFAULT CHARSET=utf8mb4;有COLLATE=utf8_general_ci的也建议改为utf8mb4_0900_ai_ci
用 Navicat “运行 SQL 文件” 还原时的关键设置
别用“还原备份(.nb3)”功能来跨版本迁移——它本质是 Navicat 自有格式,不解决底层 SQL 兼容性问题。应使用“运行 SQL 文件”,并控制执行行为。
- 右键目标数据库 →
运行 SQL 文件→ 选中从 MySQL 5.7 导出的.sql文件 - 务必勾选
遇到错误继续:MySQL 8.0 对TIMESTAMP DEFAULT CURRENT_TIMESTAMP、ENUM值长度、JSON字段语法更敏感,单条建表失败不应中断全部导入 - 不要勾选
停止于错误:这个选项一旦开启,碰到第一个Invalid default value for 'created_at'就停住,你得手动删掉那行再重跑 - 若 SQL 文件里含
CREATE DATABASE,确保目标实例没有同名库,或提前删掉;否则会报Can't create database 'xxx'; database exists
还原后必须验证的三项事实
Navicat 显示 [Msg] Finished - Successfully 只代表 SQL 执行完,不代表数据可用。很多问题要查完才知道:
- 执行
SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_db';,比对源库表数量是否一致 - 挑几张关键表,执行
SELECT MD5(GROUP_CONCAT(CONCAT_WS('|', *)) ORDER BY id) FROM your_table;(需确保有排序字段),和源库结果比对,确认数据未丢、未乱序 - 对任意一张表执行
SHOW CREATE TABLE your_table\G,重点看ENGINE、CHARSET、COLLATE、TIMESTAMP默认值是否符合预期——特别是TIMESTAMP字段在 8.0 中若没设NULL或DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,可能被静默转为空值
最容易被忽略的是:MySQL 8.0 的 utf8mb4_0900_ai_ci 排序规则对大小写和重音更敏感,如果业务 SQL 里写了 WHERE name = 'ABC' 却期望匹配 'abc',不加 COLLATE utf8mb4_general_ci 就会查不到——这不是还原失败,是规则升级带来的行为变化,得代码层适配。











