mysqldump导出时必须加--default-auth=mysql_native_password参数,否则默认按服务端caching_sha2_password生成连接逻辑,导致旧客户端因认证协议不匹配而连接失败。

MySQL 8.4 中 mysqldump 默认使用 caching_sha2_password,旧驱动连不上——不是备份文件坏了,是认证协议不匹配。
mysqldump 导出时是否启用 --default-auth=mysql_native_password
MySQL 8.4 默认禁用 mysql_native_password 插件,但部分老版本客户端(如 MySQL 5.7 客户端、某些 JDBC 驱动 8.0.22 之前)仍依赖它认证。如果导出时没显式指定认证方式,mysqldump 会按服务端默认插件生成连接参数,导致后续导入或验证时报错 Error 1524 (HY000): Plugin 'mysql_native_password' is not loaded。
- 导出前确认目标从库或测试实例允许该插件加载(不推荐长期启用,仅用于兼容过渡)
- 导出命令必须加
--default-auth=mysql_native_password参数,例如:mysqldump -u root -p --all-databases --default-auth=mysql_native_password > backup_84.sql
- 若已导出且未加该参数,可在导入前手动在目标 8.4 实例中临时启用插件:
INSTALL PLUGIN mysql_native_password SONAME 'auth_socket.so';(注意:仅限测试,生产环境应升级驱动)
验证备份文件能否被 MySQL 8.4 客户端正确解析
逻辑备份(mysqldump 输出)本质是 SQL 脚本,其“兼容性”首先取决于语句是否能被 8.4 的 SQL 解析器接受。常见断裂点不是语法错误,而是隐式行为变更:
-
CREATE TABLE中省略ENGINE=InnoDB仍可执行,但 8.4 默认存储引擎为InnoDB,无需额外处理 - 若备份含
TYPE=MyISAM(已弃用),导入会报错Unknown table option 'TYPE',需提前替换为ENGINE=MyISAM - 检查备份头是否含
/*!*/条件注释,如/*!50718 SET NAMES utf8mb4 */—— 8.4 支持到/*!80013,旧注释会被忽略,不影响执行 - 用
mysql --no-defaults -u root -p -e "SELECT VERSION();"确认客户端版本 ≥ 8.0.23,否则可能无法识别 8.4 新增的保留字(如system)
用 mysql 客户端导入时是否指定 --default-auth
即使备份文件本身没问题,导入环节也可能因客户端认证方式不匹配失败。8.4 客户端默认尝试 caching_sha2_password,而目标用户若只授权了 mysql_native_password 方式,就会卡在连接阶段。
- 导入命令必须显式指定认证插件:
mysql --default-auth=mysql_native_password -u root -p dbname
- 若目标用户是用
caching_sha2_password创建的(推荐方式),则导入时不能加--default-auth,否则会报Authentication plugin 'mysql_native_password' cannot be loaded - 最稳妥做法:在 8.4 中统一用
ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'pwd';重建用户,并确保客户端驱动支持该插件(JDBC 需 8.0.23+,Connector/NET 需 8.0.25+)
备份验证必须在同版本 MySQL 8.4 实例中完成
用 8.0 或 8.3 的实例导入 8.4 的备份,可能成功但掩盖真实问题:比如 8.4 新增的 JSON 函数、窗口函数语法,在低版本里被当作普通字符串跳过,实际执行时却会报错。
- 验证环境必须是干净的 MySQL 8.4 实例(建议小版本号一致,如 8.4.3)
- 导入后立即运行:
mysqlcheck -u root -p --check --all-databases,重点看是否提示Table is read only(可能因 datadir 权限或read_only=ON) - 对含 JSON 字段的表,执行
SELECT JSON_VALID(col) FROM t LIMIT 1;,8.4 对 JSON 校验更严格,旧备份中非法 JSON 可能被 8.0 忽略,但在 8.4 报错 - 不要只查行数,要查关键业务字段值是否可读、索引是否生效(
EXPLAIN SELECT ...)、触发器是否自动激活
真正难测的不是语法兼容,而是字符集隐式转换、时区处理、JSON 空值语义这些“静默变更”。哪怕 mysqlcheck 显示 OK,也得跑一遍核心业务 SQL 才算过关。











