一、前言
本次将MySQL8.0.30版本升级至8.0.46官方稳定版,核心目的是修复旧版本已知漏洞、优化数据库性能、提升系统稳定性与安全性,适配业务长期稳定运行需求。本次升级采用前置不停机准备+短停机窗口升级的平滑升级方案,前期准备工作无需停机,核心程序切换、数据迁移阶段必须停机。升级核心改造为程序与数据目录分离,彻底解决旧版软链接路径依赖问题。操作全程需保留旧版本程序目录用于应急回滚,升级前必须完成全量数据、数据目录备份、配置文件备份,严格按停机窗口规范执行操作,所有校验全部通过后方可恢复业务流量,杜绝数据丢失与业务异常风险。二、前置准备(业务正常运行,无需停机)
本阶段为升级前置筹备工作,全程无需停机、不影响线上业务,主要完成依赖安装、新版程序下载部署、全量数据及配置备份,预留完整旧版本环境用于后续应急回滚。核心数据迁移、程序切换等高危操作统一在停机窗口执行
1、安装依赖组件
# 执行命令安装MySQL运行所需依赖,已安装可直接跳过yuminstalllibaio-y2、下载MySQL8.0.46官方安装包
# 创建工具目录,下载适配系统的官方安装包,并校验文件完整性mkdir-p/opt&&cd/opt# 官方归档下载安装包wget--no-check-certificate-chttps://cdn.mysql.com/Downloads/MySQL-8.0/mysql-8.0.46-linux-glibc2.17-x86_64.tar.xz# 校验安装包是否完整下载ls-lhmysql-8.0.46-linux-glibc2.17-x86_64.tar.xz3、解压部署新版程序
部署完成后,服务器共存新旧两个程序目录:
mysql-8.0.30-el7-x86_64(旧版,用于回滚)、mysql-8.0.46(新版,待升级)
# 将安装包解压至指定目录,标准化目录名称,配置运行用户权限,实现新旧程序目录共存,旧目录禁止删除# 解压程序至/data目录tar-Jxvfmysql-8.0.46-linux-glibc2.17-x86_64.tar.xz-C/home# 重命名目录mv/home/mysql-8.0.46-linux-glibc2.17-x86_64 /home/mysql-8.0.46# 授权运行用户权限chown-Rmysql:mysql /home/mysql-8.0.464、全库逻辑备份
/home/mysql/bin/mysqldump\--single-transaction\--source-data=2\--set-gtid-purged=OFF\--routines\--triggers\--events\--hex-blob\--quick\--column-statistics=0\--default-character-set=utf8mb4\--max-allowed-packet=1G\--databasesorange\-h192.168.11.133\-P3306\-umysql-p\2>/data/db_bak/mysql8030_dump_$(date+%F).err\>/data/db_bak/mysql8030_full_$(date+%Y%m%d).sql5、备份配置及启停脚本
可选,有的话就不用备份
cp/home/mysql/my.cnf /data/my.cnf.bak.$(date+%Y%m%d)cp/home/mysql/startMysql.sh /data/startMysql.sh.bakcp/home/mysql/stopMysql.sh /data/stopMysql.sh.bak6、创建独立数据、binlog日志目录
mkdir-pv/home/mysql_datachown-Rmysql.mysql /home/mysql_datamkdir-p/home/mysql_binlogchown-Rmysql:mysql /home/mysql_binlog三、停机窗口升级操作
本阶段需短暂停止数据库服务,完成数据目录迁移、软链接切换、配置文件修改,实现程序与数据分离改造
1、停止MySQL服务并清理残留进程
注意:进入停机窗口后,优先关停所有连接该MySQL实例的业务服务、应用程序、定时任务,彻底断开数据库读写连接,避免存在活跃事务、长连接导致数据库无法正常停机、数据备份不一致、升级异常等问题。确认业务全部停止、无新增数据库连接后,再执行数据库停机操作
su- mysql# 正常停止数据库sh/home/mysql/stopMysql.sh# 检查残留进程ps-ef|grepmysqld# 存在残留进程则强制查杀pkill-9mysqld2、迁移数据与binlog日志目录(程序数据分离)
冷备份迁移旧版数据、binlog日志至独立固定目录,彻底脱离程序目录依赖
# 迁移业务数据文件cp-a/home/mysql-8.0.30-el7-x86_64/data/* /home/mysql_data/# 迁移二进制日志文件cp-a/home/mysql-8.0.30-el7-x86_64/binlog/* /home/mysql_binlog/3、 切换程序软链接至新版(root用户执行)
# 删除旧版本软链接rm-f/home/mysql# 创建新版程序软链接ln-s/home/mysql-8.0.46 /home/mysql# 校验权限chown-Rmysql:mysql /home/mysql4、同步配置文件并修改路径参数
su- mysql# 进入旧版目录,拷贝配置、启停脚本至新版目录cd/home/mysql-8.0.30-el7-x86_64cp-amy.cnf startMysql.sh stopMysql.sh../mysql-8.0.46# 进入新版目录,创建日志目录cd/home/mysql-8.0.46&&mkdirlog# 修改数据目录绝对路径sed-i's#datadir = /home/mysql/data#datadir = /home/mysql_data#g'/home/mysql/my.cnf# 修改binlog日志绝对路径sed-i's#log-bin=/home/mysql/binlog/mysql-bin.log#log-bin=/home/mysql_binlog/mysql-bin.log#g'/home/mysql/my.cnf5、校验配置修改结果
# 校验数据目录配置grepdatadir /home/mysql/my.cnf# 预期输出:datadir = /home/mysql_data# 校验日志目录配置greplog-bin /home/mysql/my.cnf# 预期输出:log-bin=/home/mysql_binlog/mysql-bin.log# 检验配置修改没问题,删除旧日志索引文件(存在索引文件还是会找以前的binlog日志会报错)rm-f/home/mysql_binlog/mysql-bin.index6、启动数据库并自动升级数据字典
# 启动MySQL服务sh/home/mysql/startMysql.sh# 实时监控日志,确认升级无报错、升级完成tail-f/home/mysql/log/mysqld.err四、升级后校验(必做,全部通过方可放开业务)
1、校验数据库版本
mysql--version# 预期输出:mysql Ver 8.0.46 for Linux on x86_64 (MySQL Community Server - GPL)2、校验业务数据完整性
校验标准:业务库、核心表数据行数与升级前一致,存储过程、触发器、定时任务无缺失、无异常
# 登录数据库(都是mysql用户执行)mysql-umysql-h内网-P3306-p# 核对业务库数据USE 业务库;SELECT COUNT(*)FROM 核心业务表;# 校验存储过程、触发器、事件正常SHOW PROCEDURE STATUS;SHOW TRIGGERS;五、升级故障完整回滚方案
若升级后出现启动异常、数据错误、业务报错等问题,需优先关停所有关联业务服务、断开数据库连接,再立即执行以下回滚操作,恢复旧版数据库环境,避免回滚过程中存在读写请求引发数据异常
su- mysql# 1. 停止新版MySQL服务sh/home/mysql/stopMysql.sh# 2. 删除新版软链接,切回旧版8.0.30程序(root用户执行)rm-f/home/mysqlln-s/home/mysql-8.0.30-el7-x86_64 /home/mysql# 3. 修复目录权限chown-Rmysql:mysql /home/mysql# 4. 启动旧版数据库恢复业务su- mysqlsh/home/mysql/startMysql.sh六、Mysql启动优化(用systemctl管理)
1、mysqld.service 完整文件
cat>/usr/lib/systemd/system/mysqld.service<<EOF [Unit] Description=MySQL 8.0.46 Database Server Documentation=https://dev.mysql.com/doc/refman/8.0/en/ After=network.target [Service] User=mysql Group=mysql Basedir=/home/mysql ExecStart=/home/mysql/bin/mysqld --defaults-file=/home/mysql/my.cnf ExecStop=/home/mysql/bin/mysqladmin --defaults-file=/home/mysql/my.cnf shutdown PIDFile=/home/mysql/mysqld.pid Restart=on-failure RestartSec=5 LimitNOFILE=100000 LimitSTACK=256M [Install] WantedBy=multi-user.target EOF2、生效服务配置
# 重载systemd配置systemctl daemon-reload# 设置开机自启systemctlenablemysqld3、日常运维命令
# 启动MySQLsystemctl start mysqld# 优雅停止MySQLsystemctl stop mysqld# 重启MySQLsystemctl restart mysqld# 查看运行状态systemctl status mysqld# 实时跟踪数据库日志journalctl-umysqld-f# 查看最近100行日志journalctl-umysqld-n100# 取消开机自启systemctl disable mysqld# 查看是否开机自启systemctl is-enabled mysqld4、配套校验说明
1、切换软链接升级 / 回滚 MySQL 版本,无需修改此service文件;2、LimitNOFILE=100000解决启动时 max_open_files 警告;3、使用 mysqladmin 优雅关闭,避免强制kill丢失事务;4、运行用户固定 mysql,和 my.cnfuser=mysql 匹配,权限统一七、整体操作注意事项
- 前置准备阶段全程无业务影响,必须完整执行备份操作,备份文件需确认生成成功; - 旧版本程序目录禁止删除,全程保留,作为唯一回滚环境; - 核心升级操作必须在业务低峰期停机窗口执行,前置准备可不停机操作,严禁不停机执行服务停止、数据迁移、软链接切换等高危操作; - 配置文件路径修改必须核对无误,避免目录权限、路径错误导致启动失败; - 升级后必须完成全量校验,未全部通过严禁放开业务流量; - 回滚操作需快速执行,回滚完成后立即校验业务可用性,排查异常原因。