MySQL跨主版本升级(如5.7→8.0)必须手动切换仓库并显式安装新包,不能依赖yum update或apt upgrade;升级前须停服务、完整备份数据目录和配置文件;升级后需运行mysqld --upgrade并验证兼容性断点(如sql_mode、认证插件、权限模型等);官方不支持回滚,物理备份或快照是唯一安全恢复手段。
直接 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/ 下)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-serve
r(不是 mysql,那是客户端包)sudo mysqld --upgrade(MySQL 8.0+ 自动触发,但建议显式执行)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/)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 有大量破坏性变更,不验证会直接导致应用报错或查询结果异常。
sql_mode 默认值变了:8.0 启用了 STRICT_TRANS_TABLES 和 NO_ZERO_DATE,老 SQL 插入非法日期可能被拒绝caching_sha2_password,旧客户端(如 MySQL 5.7 客户端、某些 JDBC 驱动)连不上,需在用户创建时显式指定 IDENTIFIED WITH mysql_native_password
sudo mysqld --upgrade 后检查错误日志(/var/log/mysqld.log),确认 mysql.help_topic 等表已重写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 包 → 启动FLUSH TABLES WITH READ LOCK + systemctl stop)