如何将MySQL5.7平滑就地升级到MySQL8.0

酷瑶小哥_2919

酷瑶小哥_2919

2026-11-11

803人浏览

原创

就地升级生产环境风险极高,必须先执行mysqlcheck --check-upgrade停写检查及util.checkForServerUpgrade深度扫描,修复所有ERROR级问题,并清理废弃参数、MyISAM系统表与残留配置后,方可启动8.0。

如何将mysql5.7平滑就地升级到mysql8.0

就地升级(in-place upgrade)在生产环境风险极高,不建议直接操作;必须先确认是否真有必要——绝大多数场景应选迁移升级(新实例 + dump/restore + 切流),而非覆盖二进制文件。

mysqlcheck --check-upgrade 必须在停写后执行

这是唯一能提前暴露表结构级不兼容的命令,不是可选项。它校验的是 5.7 表定义是否满足 8.0 元数据要求,比如:

  • ENUM 字段默认值为空字符串(DEFAULT '')→ 升级后报 The table does not comply with the current version of MySQL
  • TEXT 或 BLOB 字段显式设了 DEFAULT '' → 8.0 不允许
  • 列名或存储过程名撞上 rank、json、group 等 8.0 保留字
  • 存在孤立 .frm 文件或 MyISAM 分区表 → 启动卡死在 “Starting MySQL”

执行前务必停写(FLUSH TABLES WITH READ LOCK + 关闭应用写入),否则检查结果不可靠。命令格式:

mysqlcheck -u root -p --all-databases --check-upgrade

加 --fix-db-names 和 --fix-table-names 仅修正大小写,不解决语义问题,别依赖它们自动修复 ERROR。

util.checkForServerUpgrade() 报 ERROR 必须清零

这个检查比 mysqlcheck 深得多,专扫跨大版本语义变更,比如 NO_AUTO_CREATE_USER、utf8mb3 字符集、RocksDB 分区、系统库字段名变更等。它才是 Oracle 官方唯一推荐的前置动作。

关键实操点:

  • 必须用目标版本的 MySQL Shell(如升到 8.0.42,就得用 mysql-shell-8.0.42),混用 5.7 的 shell 会漏检
  • 连接必须带 socket 路径:./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()"
  • 报告里 overallStatus 不是 OK 就不能继续;任何 ERROR 级条目(非 WARNING)都必须逐条修复,例如:Usage of utf8mb3 charset → 改库/表字符集;Column name 'rank' is a reserved keyword → 重命名列
  • 检查结果有效期仅 24 小时,超时得重跑

my.cnf 中残留废弃参数会导致 mysqld 直接退出

MySQL 8.0 启动时会对配置项做严格校验,遇到已移除参数会静默失败,日志只报 unknown variable,不指明哪一行。最常踩坑的有:

win可用的mysql指令skill
win可用的mysql指令skill

安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。

下载
  • query_cache_type、query_cache_size → 8.0 已完全移除
  • expire_logs_days → 替换为 binlog_expire_logs_seconds
  • explicit_defaults_for_timestamp → 8.0 默认 true,且该参数已被弃用
  • innodb_file_format、log_warnings → 启动报错退出

此外,这两项必须手动设好:

  • default_authentication_plugin=mysql_native_password → 否则老 PHP/Java 客户端连不上,报错 Client does not support authentication protocol
  • sql_mode 中删掉 NO_AUTO_CREATE_USER → 8.0 启动时校验失败,直接退出

替换二进制后启动失败,90% 是数据字典或权限表没清理干净

不是磁盘满了,也不是内存不够,而是 8.0 启动时自动执行数据字典升级,一旦发现底层不一致就拒载。典型表现是进程秒退、error log 里出现 Failed to initialize DD tables 或空日志。

排查重点:

  • 确认 /var/lib/mysql 下没有残留的 MyISAM 系统表:运行 SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM' AND TABLE_SCHEMA = 'mysql',结果非空就得先用 skip-grant-tables 启动 5.7,再执行 ALTER TABLE mysql.plugin ENGINE=InnoDB
  • 检查 SELinux 上下文是否仍绑定旧路径:ls -Z /usr/local/mysql,若显示 context 错误,需用 semanage fcontext 重置并 restorecon
  • 确认 /etc/my.cnf.d/ 下无隐藏配置文件残留,rpm -qa | grep -i mysql(RHEL/CentOS)或 dpkg -l | grep mysql(Ubuntu)确保无旧包残留
  • 导入业务库前,确认目标 8.0 实例的 mysql 库是全新初始化的——绝不能从 5.7 导出再导入 mysql 库,否则权限模型直接崩

真正危险的不是升级动作本身,而是你以为只是换了个二进制,其实 mysqld 启动那一刻就在后台重构整个数据字典和权限体系——这个过程不可中断、不可回退、不写 slow log,全靠 error log 排查,而 error log 里往往只有模糊提示。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4923

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

1011

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1289

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6961

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3623

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6940

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9681

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1310

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1152

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 196人学习