← ← Back to Blog

一次扫描报出58个漏洞?MySQL高危漏洞修复实录与避坑指南

郑州晋元网络科技有限公司 · 运维案例 | 2026年10月

导读

安全扫描一次性报出 58 个漏洞、5 个高危,很多运维第一反应是头皮发麻:这要修到什么时候?本文记录一次真实的 MySQL 服务器漏洞修复过程——从拿到扫描报告到全部漏洞清零,实际只做了两件事,停机窗口不到 30 分钟。中间踩过的坑(Innovation 版没有安全补丁、datadir 藏在 basedir 里、systemd 单元文件的隐藏依赖)全部写出来,希望对遇到同样问题的同行有用。

一、现场:58 条漏洞的扫描报告

某企业内网一台 MySQL 数据库服务器(Linux x86_64),季度安全扫描后被通报:

风险等级数量主要涉及组件
高危5MySQL/OpenSSL、MySQL/Curl、MySQL Server 资源管理、RPCBIND 服务
中危53Oracle MySQL Server 各组件

粗看吓人,逐条分析后发现漏洞只有两个根因:

根因一:MySQL 版本是 9.4.0 Innovation(创新版),该分支从发布起就不再有任何补丁版本,2025 年 7 月之后 Oracle 季度安全公告(CPU)里的所有 CVE 都一直背着——57 条漏洞全部来自这一个原因。

根因二:主机开着 rpcbind/portmap 服务(111 端口 TCP+UDP 对外),但这台机器根本没有 NFS 业务——典型的服务装完没清理,高危 CVE-1999-0632。

结论:不需要逐条修 58 个漏洞,只需要「升级 MySQL 到带补丁通道的版本」+「关掉 rpcbind」两个动作。

二、版本选型:为什么 Innovation 版是坑

MySQL 官方现在有两条发布线,很多团队装机时没注意,随手装了 Innovation:

分支版本号形态安全补丁适合谁
Innovation 创新版9.x / 26.x(按年月)无!只在下个新版里带修复尝鲜、测试环境
LTS 长期支持版8.4.x / 9.7.x每季度跟 Oracle CPU 出补丁版生产环境(唯一正确选择)

关键认知:Innovation 版没有 9.4.1 这种东西。你装了 9.4.0,它永远是 9.4.0,漏洞只会随时间越积越多,扫描器每次都会报得更难看。生产库必须用 LTS。

本次选型:9.4.0 → 9.7.4 LTS。这是官方支持的升级路径(9.x 系内),数据字典自动迁移,不用导库,停机窗口最短。以后每季度跟一个补丁版(9.7.5、9.7.6……),漏洞随补丁清零,一劳永逸。

三、升级前勘察:三个决定成败的细节

这台机器的布局有三个特殊点,直接决定了操作方案(照抄网上通用教程会翻车):

# 实际环境
basedir  = /usr/local/mysql-9.4.0/
datadir  = /usr/local/mysql-9.4.0/mysql   # ★数据目录在basedir里面
socket   = /var/lib/mysql/mysql.sock
systemd  = ExecStart=/usr/sbin/mysqld
ExecStartPre=+/usr/bin/mysqld_pre_systemd  # ★rpm带来的钩子

细节一:datadir 藏在 basedir 里面。意味着升级时不能动 basedir 目录结构,也意味着旧版本目录永远不能删(数据在里面)。备份策略、回滚策略都要围绕这一点设计。

细节二:/usr/sbin/mysqld 是手工部署的软链,而 systemd 单元文件里还有一个 ExecStartPre=/usr/bin/mysqld_pre_systemd——这是 rpm 包配套的检查脚本,和 /usr/local 手工布局混搭。它检查的路径和实际 datadir 不一致时会阻塞启动,升级前必须确认。

细节三:升级前排查 mysql_native_password 老认证插件账号(9.x 默认禁用该插件):SELECT user,host,plugin FROM mysql.user; 有命中的账号,升级后要逐个验证业务驱动能否登录。

四、实施:六步走完,停机 28 分钟

第 1 步 · 全量备份并验证(服务在线时做)

mysqldump --all-databases --routines --triggers --events \
--single-transaction -uroot -p > all_databases.sql
# 验证:最后一行必须是 Dump completed
tail -1 all_databases.sql
# 输出: -- Dump completed on 2026-10-26 12:23:14  ✓

第 2 步 · datadir 冷备(回滚的命根子)

systemctl stop mysqld
tar czf datadir_940.tar.gz -C /usr/local/mysql-9.4.0 mysql
tar tzf datadir_940.tar.gz | head -3   # 能列出文件才算备份成功

为什么冷备这么重要:MySQL 9.7 首次启动会把数据字典单向升级,启动过新版本的 datadir 就永远回不去 9.4 了。冷备验证不通过,绝不启动新版本——这是本次操作的铁律。

第 3 步 · 部署新二进制(datadir 原地不动)

tar xf mysql-9.7.4-linux-glibc2.28-x86_64-minimal.tar.xz -C /usr/local/
ln -sfn /usr/local/mysql-9.7.4-linux-glibc2.28-x86_64-minimal /usr/local/mysql-9.7.4
# /etc/my.cnf 只改一行: basedir=/usr/local/mysql-9.7.4/
# datadir 是绝对路径,跨 basedir 继续有效,不用动
ln -sfn /usr/local/mysql-9.7.4/bin/mysqld /usr/sbin/mysqld
ln -sfn /usr/local/mysql-9.7.4/bin/mysql  /usr/bin/mysql
chown -R mysql:mysql /usr/local/mysql-9.7.4-linux-glibc2.28-x86_64-minimal

第 4 步 · 处理 systemd 钩子后启动

# mysqld.service 里注释掉 rpm 时代的检查脚本:
# ExecStartPre=+/usr/bin/mysqld_pre_systemd
systemctl daemon-reload && systemctl start mysqld
# 盯错误日志等数据字典迁移完成:
tail -f /usr/local/mysql-9.4.0/mysql/*.err
# 成功标志: ready for connections. Version: '9.7.4'

第 5 步 · 验证

mysql -V                              # Ver 9.7.4
mysqladmin -uroot -p status
mysql -uroot -p -e "SELECT VERSION(); SHOW DATABASES;"
mysql -uroot -p -e "CHECK TABLE mysql.user;"
# 业务侧: 应用连接测试 + 老插件账号逐个登录验证

第 6 步 · 同窗口关掉 rpcbind(消第二条高危)

systemctl stop rpcbind rpcbind.socket
systemctl disable rpcbind rpcbind.socket
ss -tlnp | grep 111    # 无输出=成功
ss -ulnp | grep 111    # 无输出=成功

五、结果与复扫

项目修复前修复后
MySQL 版本9.4.0 Innovation(无补丁通道)9.7.4 LTS(季度补丁通道)
MySQL 系 CVE57 条(4高危+53中危)0 条
rpcbind 111端口TCP+UDP 对外开放服务已停止并禁用
停机时长—28 分钟
数据安全—双备份(逻辑+冷备)在手,未触发回滚

安全组复扫确认全部漏洞清零。等保答复口径一并归档(版本升级修复+服务停用+备份验证+长效跟进机制四要素)。

六、可复用的避坑清单

1. 扫描器报的版本类漏洞(OpenSSL/Curl/Server 一大批 CVE)先别逐条看——九成是同一个组件版本落后,升级一个版本全消。先找根因再动手,58 条漏洞的实际工作量是 2 个动作。

2. 生产 MySQL 只用 LTS 版。Innovation 版没有补丁通道,装了就是给未来埋雷。已经装了 Innovation 的,尽早规划迁移到 LTS。

3. 升级前必查 datadir 位置。数据目录在 basedir 里面的布局(本案就是),旧目录永远不能删;回滚完全依赖冷备,冷备验证通过前不许启动新版本。

4. 手工部署+systemd 混搭的机器,升级前 cat 一遍单元文件里的每一行——ExecStartPre 这种 rpm 遗留钩子是启动失败的头号暗雷。

5. 9.x 默认禁用 mysql_native_password,升级前 SELECT plugin FROM mysql.user 排查老账号,否则升级完老应用的连接会批量报错。

6. LTS 的长效维护节奏:每季度 Oracle CPU 公告后一个月内跟一个小版本(9.7.5≈2027年1月、9.7.6≈4月),每次都是「备份→换软链→重启」15 分钟窗口,漏洞永远不积压,扫描报告永远干净。

服务说明

郑州晋元网络科技有限公司提供数据库/Linux 安全加固与漏洞修复服务:漏洞扫描报告解读、升级方案设计与风险评估、停机窗口内实施、等保整改答复材料编写。本案例完整操作单(含回滚预案)可按需提供模板。

www.cnaibot.com