必须先确认目标系统版本和架构再下载rpm包离线安装mysql,否则易因包与系统不匹配(如el7与el9混用)导致依赖错误;需下载完整bundle包并手动补全systemtap-sdt-devel等隐性依赖。

确认目标系统版本和架构再下载RPM包
离线安装 MySQL 最容易翻车的地方,就是 RPM 包和系统不匹配。必须先在目标机器上执行 cat /etc/redhat-release(或 cat /etc/os-release)确认发行版及大版本,再用 uname -m 看是 x86_64 还是 aarch64。MySQL 官网的 RPM 包分 mysql-community-server、mysql-community-client、mysql-community-common、mysql-community-libs 四个核心包,缺一不可;但它们之间有强依赖关系,且不同 MySQL 版本(如 8.0.33 vs 8.0.37)对应的依赖版本可能不同。
实操建议:
- 优先从 MySQL 官网归档页 下载对应版本的
mysql-{version}-el{major}.x86_64.rpm-bundle.tar(例如mysql-8.0.37-el9.x86_64.rpm-bundle.tar),解压后可得全部官方 RPM 包,省去逐个找的麻烦 - 不要混用 el7 和 el9 的包,CentOS 7 / Rocky 8 / AlmaLinux 9 的 glibc、systemd 版本差异足以导致
error: Failed dependencies - 若目标机无网络但能临时连外网,可用
yum install --downloadonly --downloaddir=./mysql-rpms mysql-community-server直接拉下本机适配的全套 RPM 及依赖
手动补全 systemtap-sdt-devel 等隐性依赖
MySQL 8.0+ 的 mysql-community-server RPM 在安装时会检查 systemtap-sdt-devel 是否存在——这不是 MySQL 自己声明的 Requires,而是构建时嵌入的 probe 宏导致的运行时校验。很多内网环境默认没装这个包,rpm -ivh 会卡在 “error: Failed dependencies” 且不提示具体缺哪个,只报 systemtap-sdt-devel is needed by mysql-community-server-...。
常见错误现象:
-
rpm -ivh mysql-community-server-*.rpm报错退出,但rpm -qpR mysql-community-server-*.rpm | grep -i stap看不到该依赖(因为它是 build-time 检查,非 RPM header 声明) - 用
yum localinstall也失败,提示找不到systemtap-sdt-devel,而该包不在 MySQL bundle 中
解决办法:
- 去对应系统的 baseos/appstream 镜像源找:
systemtap-sdt-devel属于基础开发工具链,Rocky/AlmaLinux 8/9 中它在appstream仓库,CentOS 7 在extras仓库 - 提前下载:
dnf download --resolve --destdir=./deps systemtap-sdt-devel(需在同版本联网机执行) - 该包体积小(通常
安装顺序和初始化要点
RPM 包之间有严格安装顺序,不能直接 rpm -Uvh *.rpm 全量覆盖。尤其是 mysql-community-common 必须最先装,否则其他包会因找不到 /usr/share/mysql-8.0/charsets/ 等路径而失败。
正确步骤:
- 先装基础四件套(按此顺序):
mysql-community-common→mysql-community-libs→mysql-community-client→mysql-community-server - 跳过 GPG 校验(内网无密钥):加
--nodigest --nochecksig参数,例如rpm -ivh --nodigest --nochecksig mysql-community-common-*.rpm - 服务首次启动前,务必运行
mysqld --initialize --user=mysql生成初始数据目录和临时密码;若跳过这步直接systemctl start mysqld,日志里只有Can't open the mysql.plugin table这类模糊错误 -
mysql-community-serverRPM 不会自动创建mysql用户,需手动groupadd mysql && useradd -r -g mysql -s /bin/false mysql,否则初始化失败
防火墙、SELinux 和 my.cnf 的离线适配
内网部署常忽略运行时策略限制。MySQL 默认监听 127.0.0.1:3306,但若需其他内网机器访问,要改 bind-address,而这个配置项在 RPM 安装后位于 /etc/my.cnf,但该文件是空的——真正的模板在 /usr/my.cnf 或 /etc/my.cnf.d/mysql-server.cnf,RPM 只放骨架。
关键细节:
- SELinux 若为 enforcing 模式,
mysqld无法绑定非标准端口或访问自定义 datadir(如挂载到/data/mysql),需提前准备semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"并restorecon -Rv /data/mysql,这些命令也要离线准备好 - firewalld 默认不放行 3306,内网虽无外网风险,但跨段通信仍需
firewall-cmd --permanent --add-port=3306/tcp,否则应用连不上 - 首次登录用
grep 'temporary password' /var/log/mysqld.log提取密码,立即执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx';,否则后续连接会因密码过期拒绝
离线环境最耗时间的往往不是下载或安装,而是某条 SELinux 策略没生效、或 my.cnf 里少写了一个 = 导致服务反复崩溃。建议把最终验证过的完整配置、用户创建语句、SELinux 命令全部存成 deploy.sh 一起拷过去。











