目录
背景
Mysql出现拒绝服务漏洞(CVE-2023-21912),影响范围:5.0.0<=Oracle MySQL<=5.7.41和8.0<=Oracle MySQL<=8.0.30。线上系统使用的mysql都在此版本内,所以需要处理这个漏洞。
注:本文使用方法不敢完全保证正确,目前升级到发文时间,已过一个多月,没有任何问题。有错误的地方,欢迎指正
解决办法
升级mysql到最新版本(本文升级到的是8.0.33)
系统现状
目前系统部署了好几个生产环境,mysql方式有好几种部署方式(历史遗留问题)
- 原生部署(压缩包)
- yum部署
- docker部署
思考
线上部署的方式不同,但是都是8.0.xx版本,考虑是小版本的升级,可以考虑覆盖应用。(这里没有完全验证猜想,慎用)。
- docker升级 这个比较简单,直接改镜像版本
- yum部署、原生部署就是本文的操作流程
升级过程(离线)
目前生产环境是离线环境,此处升级主要是离线升级的处理。
1. 查看 Centos 版本
cat /etc/centos-release
2.查看数据库版本
# 连接mysql数据,执行语句
SELECT VERSION()
3. 数据库离线下载地址
https://dev.mysql.com/downloads/mysql/
centos 对应 Red Hat Enterprise Linux / Oracle Linux
注:不知道linux对应Mysql版本,可以问ChatGPT
4. 解压安装包
在生产环境下加压安装包,在当前目录执行操作
5. 停止mysql服务
注意:如果mysql的配置修改的是/etc/my.cnf,升级之后,这个要覆盖
systemctl stop mysqld
5. 备份数据库文件
有镜像备份,可以忽略
# 注意:保存data文件,这里有两种路线,一种是通过生成sql,另外一种是数据文件保存(类似docker的挂载)
# 我选择第二种,因为感觉小版本是兼容的
# my.conf重新设定路径,那就修改到对应地址
cp -R /var/lib/mysql /var/lib/mysql_backup
6. 卸载当前数据库版本
这一步有点小坑,我通过Chatgpt得到的答案是:yum remove mysql mysql-server
但是实际上,安装的时候有多个包,所以我操作的过程采用的是列举包,依次删除,删除过程中包之间的依赖,我都强制删除。
# 列举以安装版本的mysql
rpm -qa | grep -i mysql
# 删除
yum remove mysql-community-xxx.x86_64
原生安装
如果是原生解压包安装的,目前的处理(这个是同事帮忙处理,我没有校验,仅作参考,慎用):
# 注释mysql路径
vim /etc/profile
# 配置生效
source /etc/profile
7. 本地安装
# 按顺序执行安装
# 下面是centos的mysql版本8.0.33版本安装顺序,包的名称自行根据系统版本修改
rpm -ivh mysql-community-common-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.33-1.el7.x86_64.rpm
8. 启动mysql
# 注:如果/etc/my.conf配置有设定,要先覆盖此文件,因为重新安装mysql之后,/etc/my.cnf会被覆盖
systemctl start mysqld
# 检查状态
systemctl status mysqld
# 查看日志
journalctl -u mysqld
辅助操作
查看含有mysql文件路径
find / -name mysql
查找mysql配置文件
mysql --help | grep /my.cnf | xargs ls
// 配置优先级 /etc/my.cnf > /etc/mysql/my.cnf > $basedir/my.cnf > ~/my.cnf
// 默认配置文件地址 /etc/my.cnf
// 默认日志路径 /var/log/mysqld.log
查看文件占用大小 当前目录
du -h --max-depth=1
查看应用日志
journalctl -u 服务名称
小结
由于不是专业运维,对Linux不是很熟悉,对mysql的版本和运行原理也不精通;所以被要求短时间内升级mysql版本,采取的是尽可能疑问排除,采用最简单、快速的方法。
升级之前,自己没有太大把握,我尽量把自己的疑问整理了一下:
- mysql版本升级会影响什么?大版本和小版本会不会有区别?
- 如何备份mysql数据,出错如何快速恢复?
- 不同版本的linux对应的mysql版本如何确认?
我是询问ChatGPT,但是没有进一步求证 - 离线安装会不会遇到系统缺失部分基础包的问题?
这个在离线安装的docker遇到过,所以特别忌惮 - 升级完成后,如何判断mysql是正常呢?
下面是自己升级的过程,自己存在很多疑问和不懂之处,虽然目前升级没有问题,但是过程正确比结果正确更重要。
1. 排查线上系统版本和安装的mysql版本
实践中,有多个服务器的mysql升级的,做好表格记录。包括:系统版本、mysql版本、安装方式等。
因为升级过程中,就遇到有一台服务器的Mysql是解压安装的;然而测试环境实践中,没有考虑这个情况,结果临时将全局路径剔除来解决。
2. 确认mysql版本影响
目前处理的是mysql 8.0.29、mysql 8.0.20到mysql 8.0.33的情况,这个没有查找太多资料,完全凭经验判断(错误示范)。
3. 下载安装包
官方地址:https://dev.mysql.com/downloads/mysql/
5. 借助ChatGPT
通过ChatGPT来获取解决方案。ChatGPT给出了一个貌似“正确”的答案。
4. 测试环境实践
将ChatGPT的答案在测试环境数据库进行升级,备份my.cnf配置,操作顺利。准备好脚本,正式环境升级备用。
5. 测试环境运行一段时间
项目开发人员开发一天,没有问题,就着手升级
6. 升级
首要考虑备份,这个集团有运维人员,负责网络虚拟机的运维,提前预定时间,到点备份镜像。在这之前上传好各个服务器的安装包,检查一遍脚本,备份mysql配置。时间点到了,开始按步骤升级。实际操作过程中,还是有出错,就是自己疏忽,没有三台mysql服务器,只校验了其中两台,其他有一台是解压包安装的,等到操作到这台,才发现找到不yum安装包,最后还是旁边同事帮忙一起处理。
最后,这次升级,有多少Linux知识盲区,自己可以去补充,后续等工作放缓一点,再回来重新校验和补充。
参考
- MySQL数据库配置文件之优先级
- ChatGPT