必须先修改SQL再导入,关键参数包括--set-gtid-purged=OFF、--no-tablespaces、--skip-routines --skip-events --skip-triggers、--default-character-set=utf8mb4、--skip-extended-insert、--column-statistics=0;导出后须将utf8mb4_0900_ai_ci替换为utf8mb4_general_ci、utf8mb4_0900_bin替换为utf8mb4_bin,并删除所有含IDENTIFIED WITH的CREATE/ALTER USER语句。

不能直接还原,必须先改SQL再导入;不处理三类语法,mysql -u root -p 会卡在第一张表报错退出。
mysqldump 导出时必须加哪些参数
默认导出会带 8.0 特有语法,5.7 解析失败。关键参数缺一不可:
-
--set-gtid-purged=OFF:否则导入时报GTID_PURGED cannot be changed -
--no-tablespaces:跳过CREATE TABLESPACE(5.7 不支持) -
--skip-routines --skip-events --skip-triggers:避免存储过程、事件、触发器里的 8.0 新语法 -
--default-character-set=utf8mb4:统一字符集,后续替换更可控 -
--skip-extended-insert:每行一条INSERT,方便 grep 或 sed 定位和修改 -
--column-statistics=0:禁用列统计(8.0 新增,5.7 解析直接中断)
导出后必须批量替换的三处内容
不改这三项,mysql 命令执行到第一个 CREATE TABLE 就停住,错误类似:Unknown collation: 'utf8mb4_0900_ai_ci' 或 Incorrect user name or password。
-
utf8mb4_0900_ai_ci→ 全局替换成utf8mb4_general_ci -
utf8mb4_0900_bin→ 全局替换成utf8mb4_bin - 所有含
IDENTIFIED WITH caching_sha2_password或IDENTIFIED WITH mysql_native_password的CREATE USER/ALTER USER行——整行删掉,5.7 只认SET PASSWORD FOR 'user'@'host' = PASSWORD('xxx')
推荐用 sed 一次性处理:sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g; s/utf8mb4_0900_bin/utf8mb4_bin/g' backup.sql
再手动或脚本删掉所有含 IDENTIFIED WITH 的行。
卸载 8.0 后残留配置会导致 5.7 启动失败
宝塔“卸载”按钮不会清理这些,遗漏就会 systemctl start mysqld 直接退出:
-
/www/server/mysql目录残留(尤其data/非空,5.7 初始化拒绝覆盖) -
/etc/my.cnf或/www/server/mysql/etc/my.cnf里还留着default_authentication_plugin=caching_sha2_password(5.7 不识别该参数) -
/etc/systemd/system/mysqld.service中ExecStart=仍指向 8.0 的二进制路径,如/www/server/mysql/bin/mysqld
安全做法是卸载后手动执行:rm -rf /www/server/mysql /etc/my.cnf /etc/systemd/system/mysqld.servicesystemctl daemon-reload
权限表引擎不兼容是隐藏最深的坑
字符集替换只是表层问题。真正容易被忽略的是:mysql.user 表在 8.0 默认用 InnoDB 引擎,而 5.7 要求 MyISAM。导出时加 --skip-extended-insert 并删 ENGINE=InnoDB 不够——你得确保导入前 mysql 库本身是空的,且导入语句里没硬编码 ENGINE=InnoDB 到系统表定义中。最稳妥方式是先导出业务库(--databases db1 db2),再单独重置权限:安装好 5.7 后用 mysql_secure_installation 初始化,再手动 GRANT 授权。


















