不能直接 yum update mysql-server 升级,因该包名已废弃且仅支持同源小版本更新;跨主版本必须切换仓库启用目标源、停服务、全库备份、检查磁盘空间,再执行 yum update mysql-community-server 并手动运行 mysql_upgrade -u root -p。

不能直接 yum update mysql-server 跨大版本升级,必须先切换仓库、停服务、备份,再执行 yum update mysql-community-server 并运行 mysql_upgrade —— 否则服务起不来、数据不可读、权限错乱是常态。
为什么 yum update mysql-server 会失败或静默跳过?
CentOS/RHEL 的 mysql-server 包名早已废弃,实际对应的是 MariaDB 或旧版兼容包;真正要升级的包是 mysql-community-server。Yum 默认只更新当前启用仓库内的小版本(如 5.7.39 → 5.7.40),跨主版本(5.7 → 8.0)必须显式启用目标仓库。
-
yum repolist enabled | grep mysql输出为空或含多个enabled段,说明仓库冲突,yum update会拒绝操作 - 若
/etc/yum.repos.d/mysql-community.repo中多个[mysqlXX-community]段都设了enabled=1,Yum 会报错退出 - 未停
mysqld就执行yum update,可能卡在文件锁,或跳过二进制替换步骤
如何正确切换到目标 MySQL 版本仓库?
以从 5.7 升级到 8.0 为例:先确认当前启用的仓库,再禁用旧版、启用新版,最后验证生效。
- 查现状:
yum repolist all | grep mysql,看哪些段标记为enabled - 禁用旧版:
yum-config-manager --disable mysql57-community - 启用新版:
yum-config-manager --enable mysql80-community - 验证:
yum repolist enabled | grep mysql应只输出一行,且数字 > 0 - 编辑
/etc/yum.repos.d/mysql-community.repo也可行,但需确保其他版本段全为enabled=0
升级前必须做的三件事,缺一不可
跳过任意一项,轻则启动失败,重则系统表损坏、无法登录。
- 完整备份:
mysqldump -u root -p --all-databases --routines --triggers --single-transaction > backup.sql,别只靠cp /var/lib/mysql - 停止服务:
systemctl stop mysqld,不是kill -9,避免 InnoDB 崩溃恢复异常 - 检查磁盘空间:
df -h /var/lib/mysql,升级过程需额外 2GB+ 空闲空间,否则mysql_upgrade会静默失败,日志无报错
mysql_upgrade 为什么必须手动运行?
MySQL 5.6 → 5.7 或 5.7 → 8.0 升级后,系统表结构(如 mysql.user、mysql.plugin)有变更,不运行 mysql_upgrade 会导致登录后任何 SQL 都报错,或权限失效。
- 必须在
systemctl start mysqld之前执行:mysql_upgrade -u root -p - 若提示
Access denied,说明 root 密码不对或 socket 路径不对,加--socket=/var/lib/mysql/mysql.sock显式指定 - MySQL 8.0.16+ 启动时会自动触发升级逻辑,但手动跑一遍仍是强建议,尤其跨大版本时
- 升级后首次登录,
SELECT VERSION();和SHOW VARIABLES LIKE 'version%';必须一致,否则说明升级未生效
最易被忽略的是磁盘空间检查和 mysql_upgrade 的执行时机——它看起来像可选步骤,实则是跨版本升级能否成功的关键断点。升级脚本里漏掉这一行,重启后服务看似 running,实际所有客户端连接都会卡住或报错。











