MySQL跨主版本升级(如5.7→8.0)必须手动切换仓库并显式安装新包,不能依赖yum update或apt upgrade;升级前须停服务、完整备份数据目录和配置文件;升级后需运行mysqld --upgrade并验证兼容性断点(如sql_mode、认证插件、权限模型等);官方不支持回滚,物理备份或快照是唯一安全恢复手段。

MySQL 用 yum 升级(RHEL/CentOS/Fedora)
直接 yum update mysql 通常不会升级主版本(比如从 5.7 到 8.0),它只更新当前主版本内的小版本(如 8.0.33 → 8.0.34)。真要跨主版本,必须手动切换仓库并显式安装新包。
- 先确认当前版本:
mysql --version和rpm -qa | grep mysql - 停服务:
sudo systemctl stop mysqld - 备份数据目录(默认
/var/lib/mysql)和配置文件(/etc/my.cnf或/etc/my.cnf.d/下) - 添加新版官方仓库(例如 MySQL 8.0):
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
(注意 el9/el8/el7 要匹配系统) - 禁用旧仓库、启用新仓库:
sudo yum-config-manager --disable mysql57-community,sudo yum-config-manager --enable mysql80-community - 执行升级:
sudo yum update mysql-community-server(不是mysql,那是客户端包) - 启动前运行升级工具:
sudo mysqld --upgrade(MySQL 8.0+ 自动触发,但建议显式执行)
MySQL 用 apt 升级(Ubuntu/Debian)
apt upgrade 同样只做小版本更新。跨主版本升级需更换 APT 源并使用 apt install 显式指定包名,否则 apt upgrade 会跳过主版本变更。
- 查当前状态:
mysql --version、dpkg -l | grep mysql-server - 停止服务:
sudo systemctl stop mysql - 完整备份:
/var/lib/mysql+/etc/mysql/(含my.cnf和conf.d/) - 下载新版 APT 配置包(如 MySQL 8.0):
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
,然后sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb(安装时选中目标版本仓库) - 更新源列表:
sudo apt update - 卸载旧服务包(保留数据):
sudo apt remove mysql-server(不加--purge!) - 安装新版服务:
sudo apt install mysql-server(APT 会自动拉取对应仓库的最新主版本) - 首次启动会自动运行
mysqld --initialize和mysql_upgrade(MySQL 8.0.16+ 已弃用该命令,改由启动时内建升级逻辑处理)
升级后必验的兼容性断点
MySQL 主版本升级不是平滑过程,尤其 5.7 → 8.0 有大量破坏性变更,不验证会直接导致应用报错或查询结果异常。
PinPHP是一套基于LAMP技术架构(Linux+Apache/Nginx+MySQL+PHP)的、免费的、开源的社会化分享系统!同时PinPHP分享系统V3.0正式版在V2.2正式版的基础上,对“网站架构”、“负载性能”等几大方面,进行了全面升级。注意事项:1、V3.0采用全新的代码结构与数据库结构,不可以进行版本
-
sql_mode默认值变了:8.0 启用了STRICT_TRANS_TABLES和NO_ZERO_DATE,老 SQL 插入非法日期可能被拒绝 - 认证插件变更:8.0 默认用
caching_sha2_password,旧客户端(如 MySQL 5.7 客户端、某些 JDBC 驱动)连不上,需在用户创建时显式指定IDENTIFIED WITH mysql_native_password - 系统表结构升级:运行
sudo mysqld --upgrade后检查错误日志(/var/log/mysqld.log),确认mysql.help_topic等表已重写 - 权限模型微调:8.0 的
CREATE USER不再隐式授权,GRANT必须显式执行;旧 dump 文件里的CREATE USER ... IDENTIFIED BY语句在 8.0 可能失败
为什么不能跳过备份直接升级
MySQL 官方明确说明:主版本升级不保证回滚能力。一旦 mysqld --upgrade 执行完成,数据字典(mysql.ibd、系统表空间)即按新格式重写,5.7 的 mysqld 进程再也无法识别该目录。
- 物理备份(
cp -r /var/lib/mysql /backup/mysql-57-before-upgrade)比逻辑备份(mysqldump)更可靠,因为后者可能漏掉不可见的元数据变更 - 升级失败后,唯一安全恢复方式是:停服务 → 替换整个
/var/lib/mysql目录 → 重装旧版mysql-community-server包 → 启动 - 如果用 LVM 或快照,可在升级前打快照,比文件拷贝更快,但同样要确保快照时 MySQL 已静默(
FLUSH TABLES WITH READ LOCK+systemctl stop)








