不能直接 yum update mysql-server 升级 mysql 5.6 → 5.7,必须先切换 yum 仓库启用 mysql57-community、禁用其他版本源,再停服务、全库备份、检查磁盘空间,最后执行 yum update mysql-community-server 和 mysql_upgrade -u root -p。

不能直接 yum update mysql-server 升级 MySQL 5.6 → 5.7。Yum 默认只允许同源内小版本更新(如 5.7.33 → 5.7.39),跨主版本必须切换仓库、停服务、执行 mysql_upgrade,否则启动失败或权限表损坏。
确认当前源和版本状态
升级前不查清楚源配置,yum update 会静默跳过或报错“no package available”。关键动作是验证当前启用的 MySQL 仓库是否匹配目标版本:
- 运行
mysql --version或rpm -qa | grep mysql确认已安装的是mysql56-community还是mysql57-community - 执行
yum repolist all | grep mysql,检查输出中类似mysql57-community/x86_64是否为disabled;若mysql80-community是enabled,就必须先禁用它 - 编辑
/etc/yum.repos.d/mysql-community.repo,确保只有目标段(如[mysql57-community])含enabled=1,其余如[mysql80-community]、[mysql56-community]必须设为enabled=0 - 改完立刻运行
yum repolist enabled | grep mysql—— 输出应只有一行且数字 > 0,例如mysql57-community/x86_64 MySQL 5.7 Community Server
升级前必须停服务 + 备份 + 检查磁盘
这三步缺一不可。跳过任意一项,mysql_upgrade 可能卡住、系统表损坏、或服务无法启动:
- 停止服务:
systemctl stop mysqld(不是service mysqld stop,CentOS 7 用 systemd) - 全库备份:
mysqldump -u root -p --all-databases --single-transaction > backup_$(date +%F).sql;注意:不要省略--single-transaction,否则在写入过程中备份可能不一致 - 检查
/var/lib/mysql所在分区剩余空间:df -h /var/lib/mysql;升级过程要重写数据字典,至少预留 2GB,否则mysql_upgrade会无提示失败
执行升级并强制运行 mysql_upgrade
yum update 本身不触发元数据升级,必须手动调用 mysql_upgrade,否则登录后执行任何 SQL 都可能报错 Table 'mysql.plugin' doesn't exist 或密码验证失败:
- 运行
yum update mysql-community-server(不是mysql-server,后者在 CentOS 7 上已废弃) - 升级完成后,**不要**直接
systemctl start mysqld;先运行mysql_upgrade -u root -p,输入 root 密码 - 如果提示
Using a password on the command line interface can be insecure,说明你用了-p密码形式 —— 这不安全且某些环境会拒绝执行,务必用-p(不跟密码)让其交互输入 -
mysql_upgrade成功后才执行systemctl start mysqld;首次启动可能稍慢,因 InnoDB 要校验并重建部分内部结构
升级后验证与兼容性注意点
MySQL 5.7 引入了严格模式、JSON 类型、ONLY_FULL_GROUP_BY 默认开启等变化,应用连接后容易报错:
- 登录后立即执行
SELECT VERSION(), @@sql_mode;,确认版本是 5.7.x 且 SQL 模式不含破坏性项(如发现STRICT_TRANS_TABLES导致 INSERT 失败,可临时调整SET GLOBAL sql_mode='...') - 检查用户权限表是否正常:
SELECT host,user,plugin FROM mysql.user WHERE user='root';—— 若plugin是mysql_native_password而非caching_sha2_password,说明没被误升级到 8.0 兼容逻辑 - 旧应用若依赖
mysql_old_password或未设置default_authentication_plugin=mysql_native_password,连接会拒绝;需在/etc/my.cnf的[mysqld]下追加该配置并重启
最易被忽略的是:升级后第一次启动时,mysqld 日志(/var/log/mysqld.log)里若出现 InnoDB: Starting crash recovery 或 Table upgrade required 提示,说明 mysql_upgrade 没跑成功或跑早了——必须回到停服务状态重新执行。











