在Linux环境中,RedHat、CentOS、Euler等发行版默认使用rpm作为软件包管理格式。当我们需要在没有外网或者需要固定版本的场景下部署MySQL时,使用官方提供的rpm包进行安装是一种稳定且可控的方案。与yum在线安装相比,rpm安装更强调手动处理依赖关系,但也因此更适用于离线环境。

一、准备工作与rpm包下载
在开始安装之前,首先要确认系统的版本以及是否已经存在其他MySQL或MariaDB组件。RedHat系发行版常自带mariadb-libs,它会与MySQL的libs包冲突,因此需要提前卸载。可以使用rpm命令查询已安装的相关包,避免后续安装时出现文件覆盖错误。
建议到MySQL官方社区下载对应系统版本的rpm捆绑包(如mysql-8.0.xx-1.el7.x86_64.rpm-bundle.tar)。解压后会得到多个单独的rpm文件,其中核心的是common、libs、client和server。我们并不需要将全部文件都安装,只要按顺序装好这四个即可满足基础运行。
# 查看是否已安装mariadb或mysql相关包 rpm -qa | grep -i mysql rpm -qa | grep -i mariadb # 如有冲突包则卸载,例如 rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 # 创建临时目录并解压bundle包 mkdir /tmp/mysql_rpm && cd /tmp/mysql_rpm tar -xvf mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar ls
二、按顺序使用rpm安装MySQL
rpm安装必须遵循依赖顺序:先装common,再装libs,接着client,最后server。如果颠倒顺序,rpm会提示缺少依赖而直接中断。很多人习惯用yum localinstall来自动解决依赖,但在纯离线环境里,手动按序rpm -ivh是最可靠的做法。
在安装server包时,系统可能会提示缺少libaio.so.1这个底层异步IO库。此时需要提前用系统盘或离线rpm装上libaio,否则mysqld启动时会出现初始化失败。下面给出一段完整的安装序列示例,假设所有rpm文件已在同一目录。
# 按顺序安装核心包 rpm -ivh mysql-community-common-8.0.36-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-8.0.36-1.el7.x86_64.rpm rpm -ivh mysql-community-client-8.0.36-1.el7.x86_64.rpm rpm -ivh mysql-community-server-8.0.36-1.el7.x86_64.rpm # 若提示libaio缺失,先装依赖(离线环境需提前准备) rpm -ivh libaio-0.3.109-13.el7.x86_64.rpm
安装完成后,可以用rpm -qa | grep mysql-community确认四个包均已写入系统数据库。此时MySQL的二进制文件、配置文件与服务脚本都已就位,但实例尚未初始化,不能直接对外提供服务。
三、初始化与启动服务
MySQL 8.0之后的rpm包不会自动初始化数据目录,需要借助mysqld --initialize生成系统表并赋予临时root密码。该密码会写入错误日志,通常位于/var/log/mysqld.log中。初始化命令执行后,必须使用mysql用户身份运行,否则权限错乱会导致启动失败。
初始化结束后,通过systemctl启动mysqld服务,并设为开机自启。若防火墙开启,还需放行3306端口,否则远程客户端无法连接。下面代码展示了初始化与启动的标准流程,以及查看临时密码的方式。
# 初始化数据目录,生成临时密码 mysqld --initialize --user=mysql # 启动服务并设置自启 systemctl start mysqld systemctl enable mysqld # 从日志中获取临时root密码 grep 'temporary password' /var/log/mysqld.log # 防火墙放行(如启用firewalld) firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload
四、修改密码与基础安全配置
首次使用临时密码登录后,MySQL会强制要求修改root密码,且新密码需包含大小写字母、数字与特殊符号。修改完成后,建议执行官方提供的安全脚本mysql_secure_installation,关闭匿名用户、禁止远程root登录、删除测试库,从而降低暴露风险。
如果业务需要远程访问,可在修改密码后创建专用账号并授权,而不是直接放开root的远程权限。以下示例演示了登录、改密与建库授权的常见操作,注意所有SQL语句需以分号结束。
# 使用临时密码登录 mysql -uroot -p # 登录后执行SQL改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123'; # 创建业务库与远程账号 CREATE DATABASE app_db DEFAULT CHARSET utf8mb4; CREATE USER 'appuser'@'%' IDENTIFIED BY 'App@pass123'; GRANT ALL PRIVILEGES ON app_db.* TO 'appuser'@'%'; FLUSH PRIVILEGES;
五、常见问题与处理思路
使用rpm安装MySQL时,最常见的报错是依赖缺失与端口占用。依赖问题大多集中在libs阶段,提示需要perl或libaio;端口问题则表现为启动后本地能连、远程不能连,多为防火墙或bind-address配置限制。通过systemctl status mysqld与日志可快速定位。
另一个容易忽略的点是SELinux。在强制模式下,mysqld若使用非默认数据目录会被拒绝访问。要么将目录上下文改为mysqld_db_t,要么临时设permissive模式排查。整体来看,只要按common、libs、client、server顺序安装,提前清冲突包,rpm方式比想象中更简单可控。
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| rpm -ivh server报依赖错误 | 未先装common/libs或缺libaio | 按序安装并补libaio |
| 启动后远程无法连接 | 防火墙或bind-address限制 | 放行3306并查配置 |
| 初始化报错权限不足 | 未指定--user=mysql | 用mysql用户执行初始化 |