不推荐mysql 5.5直接升级到5.7,必须经5.6中转;因元数据格式、系统表结构、sql模式等不兼容,跳过5.6会导致mysql_upgrade失败、复制中断或启动报错。

MySQL 5.5 直接升级到 5.7 不推荐
MySQL 官方明确不支持跨大版本跳升,5.5 → 5.7 属于跳过 5.6 主要中间版本,会触发大量兼容性检查失败、元数据格式不兼容、SQL 模式变更等问题。你执行 mysqld --upgrade 很可能卡在 mysql_upgrade 阶段,报错如 Table 'mysql.proc' doesn't exist 或 Unknown column 'plugin' in 'mysql.user' —— 这些不是数据损坏,而是系统表结构根本对不上。
实操建议:
- 必须经过
5.6中转:先升到5.6.40+(最后一个稳定5.6版本),完成全部mysql_upgrade和权限表转换,再升到5.7.39+ - 跳过
5.6的“捷径”(如 dump/reload)看似快,但会丢失5.6引入的 GTID、InnoDB 元数据改进等过渡层适配,后续在5.7中更容易触发隐式类型转换错误或复制中断 - 所有升级前务必关闭
sql_mode中的STRICT_TRANS_TABLES和ONLY_FULL_GROUP_BY(临时),否则5.6启动时就可能拒绝加载旧表定义
5.5 → 5.6 升级时最关键的三件事
这步是整个链条最脆弱的环节,5.6 开始强制校验 innodb_file_format 和 innodb_large_prefix,且 mysql.user 表结构已扩展,但 5.5 的数据字典不会自动适配。
实操建议:
- 升级前用
mysqldump --all-databases --skip-triggers --routines --events > full.sql备份,不要依赖物理拷贝;5.5的ibdata1无法被5.6直接识别 - 启动
5.6时加参数--skip-grant-tables+--skip-networking,手动运行mysql_upgrade -u root -p --force,否则权限系统初始化失败会导致后续所有操作被拒 - 检查
SELECT VERSION(), @@innodb_file_format, @@sql_mode;,确认innodb_file_format已变为Barracuda,且sql_mode中不含NO_ZERO_DATE(5.5默认允许,5.6开始警告)
5.6 → 5.7 升级前必须清理的 SQL 模式陷阱
5.7 默认启用严格模式,ONLY_FULL_GROUP_BY 和 STRICT_TRANS_TABLES 会直接让大量 5.5/5.6 下能跑的 GROUP BY 查询报错,比如 SELECT id, name FROM user GROUP BY id(name 未在 GROUP BY 或聚合函数中)。
实操建议:
- 升级前在
5.6环境中临时设置SET GLOBAL sql_mode='';,然后执行SELECT @@sql_mode;查看当前生效值,把结果记下来,升级后需手动还原并逐条剔除不兼容项 - 重点检查应用日志里的
Truncated incorrect DOUBLE value、Invalid default value for 'xxx'类错误——这些在5.6只是 warning,在5.7是 error -
5.7废弃了mysql.time_zone_name表的 MyISAM 引擎,如果用过mysql_tzinfo_to_sql导入时区,必须先在5.6中执行ALTER TABLE mysql.time_zone_name ENGINE=InnoDB;,否则5.7启动失败
升级后验证哪些表结构和权限才真正可靠
很多人以为 mysql_upgrade 成功就完事了,其实它只改系统表,业务表的 ROW_FORMAT、CHARACTER_SET、COLLATION 仍停留在旧状态,后续 DDL 或备份恢复时可能暴露问题。
实操建议:
- 运行
SELECT table_schema, table_name, row_format, create_options FROM information_schema.tables WHERE engine='InnoDB' AND row_format != 'Dynamic';,5.7要求所有新表默认Dynamic,老表建议重建:ALTER TABLE t1 ENGINE=InnoDB ROW_FORMAT=Dynamic; - 检查
SELECT user, host, plugin FROM mysql.user;,5.7要求plugin字段非空(如mysql_native_password),5.5升上来的账户若为'',需手动更新:UPDATE mysql.user SET plugin='mysql_native_password' WHERE plugin=''; FLUSH PRIVILEGES; - 用
mysqldump --no-data --databases your_db | grep "CHARSET\|COLLATE"确认字符集是否统一为utf8mb4,5.7对utf8(即utf8mb3)已标记为 deprecated
最常被忽略的是 information_schema 视图的列顺序变化:比如 INNODB_TRX 在 5.6 有 trx_weight,5.7 改成 trx_mysql_thread_id,监控脚本里硬写列索引会直接取错字段。











