直接就地升级可行但必须完成三件事:备份、兼容性扫描(mysqlcheck --check-upgrade)、配置预检(移除废弃参数并校验认证插件与密码策略),缺一不可,否则易致启动失败或数据字典损坏。

直接就地升级(in-place upgrade)可行,但必须做完三件事:备份、兼容性扫描、配置预检——缺一不可,否则启动失败或数据字典损坏大概率发生。
必须先做 mysqlcheck --check-upgrade 扫描
这不是可选项。MySQL 5.7 自带的 mysqlcheck 工具能提前发现表结构、存储引擎、分区定义等不兼容项,比如使用了已被移除的 YEAR(2) 或含 OLD_PASSWORD() 的视图。
- 运行命令:
mysqlcheck -u root -p --all-databases --check-upgrade - 它会输出类似
error : The storage engine for the table is not supported in this version of MySQL的提示,必须逐条修复 - 注意:该检查不检测 SQL Mode 或字符集隐式转换问题,需另查
确认 my.cnf 中没有被移除或重命名的参数
MySQL 8.0 移除了至少 12 个 5.7 支持的配置项,例如 query_cache_type、expire_logs_days(已由 binlog_expire_logs_seconds 替代),若保留在配置文件中,mysqld 启动时直接报错退出。
- 启动前务必执行:
mysqld --defaults-file=/etc/my.cnf --verbose --help | grep "Deprecated" - 重点核对:
innodb_file_format、max_connect_errors、slave_skip_errors(部分值已失效) - 8.0 默认启用
skip_log_bin,若原配置显式关闭 binlog,需确认是否仍需开启
用户认证插件和密码策略要提前对齐
5.7 默认用 mysql_native_password,8.0 默认改用 caching_sha2_password。如果应用连接器(如旧版 MySQL Connector/J 5.x、PHP mysqli)不支持后者,连接会静默失败,错误日志里只显示 Access denied for user,根本看不出是插件问题。
- 升级前在 5.7 中批量修改用户(避免升级后手动改):
ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 或者在 8.0 启动后立即执行:
SET GLOBAL default_authentication_plugin = 'mysql_native_password';(仅影响新建用户) -
validate_password插件在 8.0 中默认启用且策略更严,若已有弱密码用户,升级后可能无法登录,需提前调整策略或重置密码
就地升级最危险的盲区是:你以为只是换二进制文件,其实 mysqld 启动时会自动执行数据字典升级、系统表重构、权限表迁移——这个过程不可中断、不可回退,且不写入 slow log 或 general log,出错只能靠 error log 定位。务必确保磁盘空间充足(临时需要 2 倍 datadir 空间)、SELinux/AppArmor 策略已放行新版本路径、systemd service 文件里的 User= 和 Group= 与数据目录属主一致。


















