17370845950

mysql使用yum与apt进行版本升级的步骤
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 --versionrpm -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-communitysudo yum-config-manager --enable mysql80-community
  • 执行升级:sudo yum update mysql-community-serve

    r
    (不是 mysql,那是客户端包)
  • 启动前运行升级工具:sudo mysqld --upgrade(MySQL 8.0+ 自动触发,但建议显式执行)

MySQL 用 apt 升级(Ubuntu/Debian)

apt upgrade 同样只做小版本更新。跨主版本升级需更换 APT 源并使用 apt install 显式指定包名,否则 apt upgrade 会跳过主版本变更。

  • 查当前状态:mysql --versiondpkg -l | grep mysql-server
  • 停止服务:sudo systemctl stop mysql
  • 完整备份:/var/lib/mysql + /etc/mysql/(含 my.cnfconf.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 --initializemysql_upgrade(MySQL 8.0.16+ 已弃用该命令,改由启动时内建升级逻辑处理)

升级后必验的兼容性断点

MySQL 主版本升级不是平滑过程,尤其 5.7 → 8.0 有大量破坏性变更,不验证会直接导致应用报错或查询结果异常。

  • sql_mode 默认值变了:8.0 启用了 STRICT_TRANS_TABLESNO_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