必须先确认系统版本和架构,再下载匹配的mysql 8.0完整bundle包,并手动补全隐性依赖systemtap-sdt-devel,否则rpm安装会因依赖失败静默退出。

离线安装 MySQL 8.0 的 RPM 包,不是把几个 mysql-*.rpm 拷过去 rpm -ivh 就完事——漏掉任何一个隐性依赖或装错顺序,rpm 会静默失败,报错信息却只显示“Failed dependencies”,根本看不出缺什么。
先确认系统版本和架构,再下载对应 bundle 包
MySQL 官方 RPM 包严格绑定发行版大版本(如 el7 / el8 / el9)和 CPU 架构(x86_64 或 aarch64)。混用会导致 glibc 或 systemd 版本冲突,直接报错退出。
- 在目标机器上执行:
cat /etc/os-release看ID和VERSION_ID(如rocky+8.10) - 执行:
uname -m确认是x86_64还是aarch64 - 去 MySQL 官网归档页下载完整 bundle:
mysql-8.0.43-el8.x86_64.rpm-bundle.tar(版本号和 elX 要完全匹配) - 别用单个包拼凑——bundle 包里已含
mysql-community-common、libs、client、server、client-plugins、icu-data-files等全部必需组件
必须手动补全 systemtap-sdt-devel 这个“隐形依赖”
mysql-community-server RPM 在安装时会做 build-time probe 校验,硬性要求 systemtap-sdt-devel 存在,但它不写在 Requires: 字段里,所以 rpm -qpR 查不到,yum localinstall 也报不出具体缺啥,只会卡在“Failed dependencies”。
- 这个包不在 MySQL bundle 中,属于系统基础开发工具链
- Rocky/AlmaLinux 8+:它在
appstream仓库;CentOS 7:在extras仓库 - 在同版本联网机上执行:
dnf download --resolve --destdir=./deps systemtap-sdt-devel(CentOS 7 用yumdownloader) - 该包体积小(通常 mysql-community-server 死活装不上
卸载 mariadb-libs 是强制前置动作,不是可选项
几乎所有 CentOS/Rocky/欧拉系统都预装或残留 mariadb-libs,它和 mysql-community-libs 提供完全相同的符号文件(如 /usr/lib64/libmysqlclient.so.18),RPM 包管理器会直接拒绝安装,错误类似:
file /usr/lib64/libmysqlclient.so.18 from install of mysql-community-libs conflicts with file from package mariadb-libs
- 先查:
rpm -qa | grep mariadb - 强制卸载(版本号替换成实际输出):
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 - 再查一次:
rpm -qa | grep mariadb,输出必须为空,否则后续所有rpm -ivh都会失败 - 别指望
--force或--nodeps绕过——这不是警告,是 RPM 层的硬拦截
按顺序安装 RPM,别用 yum localinstall
离线环境下 yum localinstall 会尝试联网解析依赖,反而触发元数据缺失错误;统一用 rpm -ivh 手动控制更可靠。顺序错一个,就会因未满足依赖而中断:
- 必须按此顺序执行(顺序不可调):
mysql-community-common→mysql-community-icu-data-files→mysql-community-client-plugins→mysql-community-libs→mysql-community-client→mysql-community-server - 可选但强烈建议加装:
mysql-community-libs-compat(兼容旧客户端)、mysql-community-devel(如果后续要编译驱动) - 每个包都加
--force(覆盖已有配置文件);仅当明确知道冲突可忽略时,才对libs或server加--nodeps - 装完
server后别急着启动——先chown -R mysql:mysql /var/lib/mysql,再检查 SELinux 上下文是否为mysqld_db_t
真正卡住人的从来不是命令本身,而是 systemtap-sdt-devel 这种不声不响的构建期依赖,以及 mariadb-libs 卸载后残留的配置文件(比如 /etc/my.cnf.d/client.cnf 里还留着 socket=/var/lib/mysql/mysql.sock,但新 MySQL 默认用 /var/run/mysqld/mysqld.sock)——这些细节不提前验证,初始化日志里只会反复打印 “Can't start the server”,不会告诉你哪行配置错了。











