不能直接卸载重装旧版本,因升级后数据字典、InnoDB redo log格式、authentication_string加密方式及default_authentication_plugin等已被改写,强行降级将触发InnoDB: Unsupported redo log format或Table 'mysql.component' doesn't exist等错误导致实例无法启动;唯一可行回滚路径是用旧版mysqld启动升级前合规备份的干净副本并切流。

不能直接卸载新版本、重装旧版二进制再启动——99% 的失败回滚都卡在这一步。MySQL 升级后,mysql 系统库结构、innodb_redo_log_format、authentication_string 加密方式甚至 default_authentication_plugin 都可能已被改写,强行降级会触发 InnoDB: Unsupported redo log format 或 Table 'mysql.component' doesn't exist,实例根本起不来。
确认是否还能走“原地降级”路径
官方仅对极少数场景允许不还原数据的快速降级,必须同时满足全部条件:
- 是同一 major 版本内相邻小版本(如
8.0.34 → 8.0.33),跨大版本(如8.0 → 5.7或8.0 → 9.6)明确不支持 - 升级后从未启动过新实例,或仅以
--upgrade=NONE模式做过只读检查 - 没执行过
mysql_upgrade或等效的mysqld --upgrade=FORCE - 没写入任何数据(包括
INSERT/UPDATE/DDL),binlog和redo log仍是升级前状态
只要其中任一条件不满足,立刻放弃覆盖安装,切到备份恢复流程。
用逻辑备份(mysqldump)最快恢复业务
这是生产环境最可控、兼容性最强的回滚方式,前提是升级前执行过合规导出:
- 导出命令必须含
--single-transaction --routines --events --triggers --set-gtid-purged=OFF - 务必排除
sys和performance_schema库:--ignore-table=sys.% --ignore-table=performance_schema.% - 导入目标必须是旧版本
mysqld实例,且配置中default_authentication_plugin匹配(如 MySQL 5.7 要设为mysql_native_password) - 导入时加
--default-character-set=utf8mb4,避免字符集隐式转换导致乱码
示例:在旧版 MySQL 启动空实例后执行
mysql -u root -p --default-character-set=utf8mb4 your_db < pre_upgrade.sql
物理备份(xtrabackup)恢复更快但版本锁死严格
适合大库(>100GB)、RTO 要求极严的场景,但风险点更隐蔽:
-
xbbackup8.0.33备份只能用 8.0.33 或更高小版本的xtrabackup恢复,不能倒灌给 8.0.32 - 恢复后首次启动若报
Table ... doesn't exist或拒绝加载表空间,需加--innodb-force-recovery=1启动,再用mysqldump导出,最后导入干净旧实例 - 若升级涉及
mysql系统库结构变更(如 8.0 引入的数据字典表),物理备份无法绕过校验,必须走逻辑层重建
最容易被忽略的三个实操细节
很多团队回滚慢,不是技术不会,而是这三点在升级前就漏了:
- 没单独存档
my.cnf中所有显式配置项(尤其collation-server、sql_mode、lower_case_table_names),新版本默认值变化极大,漏配会导致查询结果突变而非报错 - 没验证备份可导入:导出后应在测试机用旧版
mysqld执行一次完整导入+登录+SELECT COUNT(*),否则故障时才发现--routines没生效或字符集崩了 - 没保留旧版二进制和
auto.cnf—— 回滚时若 server-uuid 变了,GTID 复制链会断裂,连主从同步都恢复不了


















