离线安装MySQL需严格匹配架构与依赖、按序安装4个RPM包、手动初始化数据库并处理密码策略。先用uname -m确认架构,rpm -qpR检查缺失依赖;依次安装common、client-plugins、client、server;创建/var/lib/mysql并赋权,运行mysqld --initialize;登录后按validate_password策略设强密码。

rpm 包离线安装 MySQL 前,先确认系统架构和依赖是否匹配
直接 rpm -ivh mysql-community-server-*.rpm 很可能报错退出,最常见的是 Failed dependencies。这不是 MySQL 本身的问题,而是 rpm 包对 systemd、libaio、openssl 等底层库有硬性要求,且严格区分 x86_64 和 aarch64。
- 用
uname -m确认机器架构,再下载对应后缀的 rpm 包(比如mysql-community-server-8.0.33-1.el9.x86_64.rpm) - 用
rpm -qpR mysql-community-server-*.rpm | grep "not found"提前筛出缺失依赖 - CentOS 7/8、Rocky/AlmaLinux 8/9 的 systemd 版本差异大,
mysql-community-common必须和server同版本,混用会启动失败
离线安装必须按顺序安装这 4 个核心 rpm 包
MySQL 官方 rpm 拆得很细,漏装或错序会导致 mysqld: unrecognized service 或 Can't connect to local MySQL server。官方不强制你用 yum install,但 rpm 依赖链是刚性的。
- 先装
mysql-community-common(提供字符集、配置模板) - 再装
mysql-community-client-plugins(否则后续 client 无法认证) - 接着是
mysql-community-client(含mysql命令行工具) - 最后才是
mysql-community-server(含mysqld服务)
顺序错一个,systemctl start mysqld 就会静默失败——日志里可能只有一行 Failed at step EXEC spawning /usr/sbin/mysqld。
初始化数据库前,必须手动创建 /var/lib/mysql 并赋权
离线安装不会自动运行 mysqld --initialize,也不会帮你建数据目录。直接 systemctl start mysqld 会卡住,journalctl 里反复出现 Can't create/write to file '/var/lib/mysql/is_writable'。
- 执行
mkdir -p /var/lib/mysql - 设属主:
chown -R mysql:mysql /var/lib/mysql - 确保 SELinux 不拦截(若启用):
semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?",然后restorecon -Rv /var/lib/mysql - 再运行
mysqld --initialize --user=mysql,临时密码会输出在 error log(默认/var/log/mysqld.log)
首次登录后立刻改 root 密码,否则下次连接直接被拒绝
MySQL 5.7+ 默认启用 validate_password 插件,且离线安装时不会跳过密码强度校验。用临时密码登录后,执行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx'; 极大概率报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
- 先查策略:
SHOW VARIABLES LIKE 'validate_password%'; - 临时调低(仅调试用):
SET GLOBAL validate_password.policy = LOW; - 再改密码,或者直接用满足要求的密码(至少 8 位,含大小写字母+数字+特殊符号)
- 注意:改完密码后,如果用
mysql -u root -p连,必须输新密码;用临时密码连过一次后,旧密码立即失效
离线环境没法联网查文档,所有路径、参数、错误信息都得靠本地 rpm 包里的 /usr/share/doc/mysql-community-server-*/ 和 mysqld --verbose --help 输出来交叉验证——别跳过这步。










