根本原因是目标机器缺少依赖包,而yum install在离线环境下无法自动下载;正确做法是用yumdownloader --resolve在同版本联网机下载完整依赖链,再用yum localinstall安装,并处理gpg密钥和selinux上下文问题。

离线安装 RPM 包时提示 Failed dependencies
根本原因是目标机器缺少依赖包,而 yum install 在离线环境下无法自动下载。别指望 --nodeps 一招鲜——强行跳过依赖大概率导致数据库服务启动失败或功能异常。
正确做法是把依赖链完整“拖”下来:
- 在一台联网、系统版本和架构(如
x86_64)完全一致的机器上,用yumdownloader --resolve下载主包及其所有依赖:yumdownloader --resolve mysql-community-server
- 注意:必须加
--resolve,否则只下本体;不加--destdir会下到当前目录,建议显式指定:yumdownloader --resolve --destdir=./mysql-rpms mysql-community-server
- 下载后整个目录拷到离线机,用
yum localinstall(不是rpm -i)一次性装全:yum localinstall ./mysql-rpms/*.rpm
yum localinstall 报 Public key not imported
这是 GPG 签名校验失败,常见于首次离线安装或系统未导入发行方密钥。RPM 包本身没问题,只是没被信任。
临时解决(仅限可信源):
yum localinstall --nogpgcheck ./mysql-rpms/*.rpm但更稳妥的是提前导入密钥:
- 从联网机导出:
rpm -qi gpg-pubkey | grep "Key ID" | awk '{print $3}' | xargs -I{} rpm -q gpg-pubkey-{} --dump | grep -A1 "gpg-pubkey" | grep "MD5" | cut -d' ' -f1 | xargs -I{} rpm -q --dump gpg-pubkey-{} | grep -A1 "gpg-pubkey" | head -1 | awk '{print $1}' | xargs rpm -e——太绕,直接用:rpm -qa gpg-pubkey* | xargs rpm -e
再重装密钥:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
(路径依发行版而异,CentOS 7 是RPM-GPG-KEY-CentOS-7,Rocky/AlmaLinux 是RPM-GPG-KEY-rockyofficial) - 离线机若无密钥文件,就从联网机复制
/etc/pki/rpm-gpg/下对应文件过来
MySQL RPM 包名差异导致版本混乱
不同来源的包命名规则不统一:mysql-community-server(Oracle 官方)、mariadb-server(默认 CentOS/RHEL 8+)、mysql80-community-release(仅是 YUM 源配置包,不带服务)。装错一个,后面 systemctl start mysqld 就会找不到服务单元。
确认你要装的是哪个:
- 查清目标数据库类型:MySQL 还是 MariaDB?官方版还是社区版?
- 用
rpm -qpi *.rpm | grep "Name\|Version"批量看包信息,重点核对Name字段是否含server,且不含client或common - 安装前先清理残留:
rpm -qa | grep -E "(mysql|mariadb)" | xargs rpm -e --nodeps
,否则旧包冲突会导致mysqld启动报Can't open shared library
装完 mysqld 启动失败,日志里只有 Permission denied
离线环境常忽略 SELinux 和文件权限继承问题。RPM 包安装时不会自动恢复 SELinux 上下文,尤其当 /var/lib/mysql 是手动创建或从其他系统拷贝而来。
检查并修复:
- 确认 SELinux 状态:
sestatus,若为enforcing,运行:restorecon -Rv /var/lib/mysql
- 确保目录属主是
mysql:mysql:chown -R mysql:mysql /var/lib/mysql
- 别漏掉
/etc/my.cnf权限——如果它是从别处拷来的,得设成644,否则mysqld --initialize会拒绝读取
事情说清了就结束。最麻烦的永远不是下载几个 RPM,而是依赖链深度、GPG 密钥状态、SELinux 上下文这三者在离线场景下互相咬死——少查一项,就卡在启动那一步。










