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 有大量破坏性变更,不验证会直接导致应用报错或查询结果异常。
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)
