离线内网批量安装mysql 8.0的核心障碍源于三件事未落实:未卸载mariadb-libs导致符号文件冲突而硬拦截安装;未补systemtap-sdt-devel这一隐性依赖致使rpm静默失败;未严格按common→libs→libs-compat→client-plugins→client→icu-data-files→server顺序安装引发依赖错误。

离线内网批量安装 MySQL 8.0 的核心障碍不是“装不上”,而是 rpm -ivh 静默失败、mysqld --initialize 报错退出、或首次启动卡死——这些问题 90% 源于三件事没做:没清 mariadb-libs、没补 systemtap-sdt-devel、没按顺序装包。
卸载 mariadb-libs 是强制前置动作,不是可选项
几乎所有 CentOS/Rocky/AlmaLinux 7–9 都预装 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,输出必须为空
必须手动补全 systemtap-sdt-devel 这个“隐形依赖”
mysql-community-server RPM 在安装时会做 build-time probe 校验,硬性要求 systemtap-sdt-devel 存在,但它不写在 Requires: 字段里,所以:
-
rpm -qpR mysql-community-server-*.rpm | grep -i stap查不到该依赖 -
yum localinstall会报 “systemtap-sdt-devel is needed by mysql-community-server-”,但不提示从哪装 - 在 Rocky/AlmaLinux 8+ 上,它在 appstream 仓库;CentOS 7 在 extras 仓库
解决办法:在同版本联网机上执行:
dnf download --resolve --destdir=./deps systemtap-sdt-devel
(CentOS 7 改用 yumdownloader --resolve systemtap-sdt-devel)
按严格顺序安装 RPM,别信“通配符一键装”
Bundle 包解压后有十几个 RPM,但真正必须按序安装的只有以下 7 个(缺一不可,顺序不能调):
mysql-community-commonmysql-community-libsmysql-community-libs-compatmysql-community-client-pluginsmysql-community-client-
mysql-community-icu-data-files(MySQL 8.0.28+ 必须) mysql-community-server
别用 rpm -ivh *.rpm 或 yum localinstall *.rpm —— 前者因依赖未满足静默失败,后者在纯离线环境会尝试联网解析依赖并报错。统一用:
rpm -ivh --force --nodeps mysql-community-common-*.rpm
逐个执行,每步确认返回无 Failed dependencies。
初始化前必须修正 /var/lib/mysql 权限与 SELinux 上下文
装完 mysql-community-server 后,mysqld --initialize 失败或 systemctl start mysqld 卡住,根本原因往往不是配置文件,而是:
-
/var/lib/mysql目录属主不是mysql:mysql:执行chown -R mysql:mysql /var/lib/mysql - SELinux 启用状态下,
mysqld无法写入数据目录:临时关闭验证setenforce 0,或永久设为 permissive 模式 - 若使用自定义数据目录(如
/data/mysql),需额外执行semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"并restorecon -Rv /data/mysql
初始化成功后,日志中会输出临时 root 密码,位置固定:grep 'temporary password' /var/log/mysqld.log。这个密码只在首次启动时有效,后续必须用 ALTER USER 修改,否则连接会因认证插件不匹配被拒绝。











