内网离线安装mysql需严格匹配系统版本、清除mariadb-libs冲突包、补全libaio依赖,再按common→libs→libs-compat→client-plugins→client→icu-data-files→server顺序安装rpm包,最后清空并授权/var/lib/mysql、手动配置my.cnf、执行mysqld --initialize初始化。

内网环境离线安装 MySQL,不能走 yum 或 dnf 在线源,必须用 RPM Bundle 包本地安装。核心难点不是“能不能装”,而是依赖顺序错、旧包没清干净、libaio 缺失这三类问题会直接卡在 rpm -ivh 阶段。
确认目标系统版本并下载对应 Bundle 包
Bundle 包名里带 el7、el8、el9 字样,必须和你内网机器的发行版严格匹配。比如 mysql-8.4.0-1.el9.x86_64.rpm-bundle.tar 只能用于 RHEL/CentOS/AlmaLinux/Rocky 9;用在 el8 上会报 libc.so.6(GLIBC_2.34) 找不到。
- 查系统版本:
cat /etc/redhat-release或rpm -q --queryformat '%{VERSION}\n' centos-release 2>/dev/null || rpm -q --queryformat '%{VERSION}\n' rocky-release 2>/dev/null - 去官网 https://downloads.mysql.com/archives/community/ 手动选版本 → 操作系统选 “Red Hat Enterprise Linux” → 版本选对应数字(如 9)→ 下载类型选 “RPM Bundle”
- 别信“通用版”或“noarch”,Bundle 必须是
.rpm-bundle.tar后缀,不是单个.rpm
解压后必须按固定顺序安装 RPM
Bundle 解压出来一堆 mysql-community-*.rpm,但不能随便 rpm -ivh *.rpm。顺序错会导致 Failed dependencies 错误,尤其是 mysql-community-server 依赖前面所有包。
- 先解压:
tar -xvf mysql-8.4.0-1.el9.x86_64.rpm-bundle.tar - 按以下顺序逐个安装(缺一不可,不能跳):
mysql-community-common→mysql-community-libs→mysql-community-libs-compat→mysql-community-client-plugins→mysql-community-client→mysql-community-icu-data-files(8.0.28+ 版本需要)→mysql-community-server - 每步都加
--nodeps --force是常见做法,但仅限于内网离线场景;真实生产环境建议先rpm -qpR *.rpm查依赖再补全,而非强行覆盖
安装前必须清理冲突包和基础依赖
CentOS/RHEL 默认自带 mariadb-libs,它和 mysql-community-libs 冲突,不卸载就会报 file /usr/lib64/libmysqlclient.so.18 from install of mysql-community-libs conflicts with file from package mariadb-libs。
- 查冲突包:
rpm -qa | grep -i 'mariadb\|mysql' - 强制卸载:
rpm -e --nodeps mariadb-libs(注意不是mariadb主包,只删 libs) - 检查基础依赖:
ldd /usr/lib64/mysql/libmysqlclient.so.21 | grep "not found",若提示libaio.so.1找不到,需提前准备libaio-0.3.112-1.el9.x86_64.rpm并rpm -ivh安装(该包通常不在 Bundle 中) - 别漏掉 SELinux 策略残留:如果之前装过 MySQL,
/var/lib/mysql目录权限可能被 SELinux 标记为mariadb_var_lib_t,导致mysqld启动失败,此时要restorecon -Rv /var/lib/mysql
安装后初始化与启动失败的典型原因
systemctl start mysqld 失败,90% 不是配置问题,而是数据目录残留或权限不对。MySQL 8.0+ 的 mysqld --initialize 会拒绝在非空目录下生成 root 密码。
- 首次启动前清空数据目录:
rm -rf /var/lib/mysql/*(不是删目录本身,是删里面内容) - 确保
/var/lib/mysql所属用户是mysql:mysql:chown -R mysql:mysql /var/lib/mysql - 启动后立刻查临时密码:
grep 'temporary password' /var/log/mysqld.log,别指望默认无密码 - 如果
systemctl status mysqld显示failed to initialize database,大概率是/var/lib/mysql下有残留文件(比如 .err、.pid),删干净再试
最易被忽略的是:Bundle 包里的 mysql-community-server 安装后不会自动创建 /etc/my.cnf,得手动从 /usr/my.cnf 或 /usr/share/mysql/my-default.cnf 拷一份过去,否则 mysqld 启动时读不到配置,可能用默认参数跑出意料外行为。











