离线安装mysql 8.0 rpm包的核心难点是卸载mariadb-libs、补齐libaio/numactl-libs/openssl/perl依赖、严格按顺序安装common→client-plugins→libs→icu-data-files→client→server,并初始化后修正/var/lib/mysql权限与selinux上下文。

离线安装 MySQL 8.0 的 RPM 包,核心难点不在安装命令本身,而在于依赖完整性、包顺序和冲突清理——漏掉任意一环,rpm -ivh 都会失败,且报错信息往往不指向真实原因。
必须先卸载 mariadb-libs,否则所有 rpm 安装都会被阻断
CentOS 7 默认预装 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 都会卡在同一个错误上,且不会提示“请先卸载 mariadb”。
基础依赖必须提前装好,不能靠 rpm 自动解决
RPM 包本身不带 libaio、numactl-libs、openssl、perl 这些运行时依赖。离线环境下,yum install 不可用,所以你得提前把它们的 RPM 包拷过来并手动装:
-
libaio:MySQL 异步 I/O 必需,缺失会导致mysqld启动失败,日志里出现undefined symbol: aio_read -
numactl-libs:非严格必需,但缺了会影响 NUMA 架构服务器上的内存访问性能 -
perl:MySQL 初始化脚本mysqld --initialize内部调用 Perl,没它会报/usr/bin/perl: No such file or directory - 验证方式:
rpm -qa | grep -E 'libaio|numactl|openssl|perl',缺哪个补哪个
安装顺序不能乱,尤其 client-plugins 和 icu-data-files 是新版本关键依赖
MySQL 8.0.19+ 引入了插件化认证和 ICU 排序支持,mysql-community-client-plugins 和 mysql-community-icu-data-files 已成硬依赖,且必须在 mysql-community-server 之前安装。错序会导致:
-
mysql-community-server安装时报 “Failed dependencies: mysql-community-client-plugins is needed” - 或启动后无法加载
caching_sha2_password插件,导致客户端连不上
正确顺序(仅列必需):
rpm -ivh mysql-community-common-*.rpm<br>rpm -ivh mysql-community-client-plugins-*.rpm<br>rpm -ivh mysql-community-libs-*.rpm<br>rpm -ivh mysql-community-icu-data-files-*.rpm<br>rpm -ivh mysql-community-client-*.rpm<br>rpm -ivh mysql-community-server-*.rpm
注意:mysql-community-libs-compat 也建议装上,避免老程序链接失败;mysql-community-devel 按需选装。
初始化后必须立刻处理 SELinux 和权限,否则服务起不来
mysqld --initialize 生成数据目录后,/var/lib/mysql 所有者是 root,SELinux 上下文也不对。systemd 启动 mysqld 时会因权限不足静默失败:
- 改属主:
chown -R mysql:mysql /var/lib/mysql - 恢复 SELinux 上下文:
restorecon -Rv /var/lib/mysql(若 SELinux 是 enforcing 模式) - 检查日志确认:
journalctl -u mysqld -n 50 --no-pager,常见失败线索是Can't open the mysql.plugin table或Permission denied
临时关闭 SELinux(setenforce 0)能绕过问题,但生产环境不应依赖此操作——真正要 fix 的是上下文,不是关防护。
最容易被忽略的是 mysql-community-client-plugins 和 mysql-community-icu-data-files 这两个包,它们在旧版 MySQL 文档里不显眼,但在 8.0.19+ 是启动前置条件;另外,perl 缺失导致初始化失败时,错误日志里根本不会提“perl”,只报“子进程退出”,得往 PATH 和依赖方向排查。











