降级MySQL必须用mysqldump逻辑导出+手动改SQL+重装5.7导入;禁用GTID、表空间、扩展插入等8.0特性;导出后需替换三类内容,否则导入失败。

不能直接降级,必须用 mysqldump 逻辑导出 + 手动改 SQL + 重装 5.7 导入。任何试图复用 8.0 data/ 目录的操作都会失败或损坏数据。
mysqldump 导出时必须加的关键参数
默认导出会带 GTID、表空间、扩展插入、新认证语法等 5.7 不认的内容,必须显式禁用:
-
--set-gtid-purged=OFF:避免导入时因 GTID 冲突报错 -
--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 -u root -p 会直接中断在第一张表。
-
utf8mb4_0900_ai_ci→utf8mb4_general_ci(最常见报错:Unknown collation: 'utf8mb4_0900_ai_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
字符集替换只是第一步;真正容易被忽略的是权限表引擎——8.0 的 mysql.user 默认是 InnoDB,而 5.7 要求 MyISAM。导入前务必确认备份文件中没保留 ENGINE=InnoDB 在系统库建表语句里,否则 mysql 命令会静默跳过权限表,导致 root 登录失败。


















