Linux 安装 MySQL 8(CentOS / Rocky / Alma):官方源、临时密码与 SELinux

在 RHEL 系列发行版上装 MySQL,比 Ubuntu 多三道坎:系统自带的 MariaDB 会跟它抢文件、官方源需要手动装、SELinux 会拦你不该拦的东西。这篇按 Rocky Linux 9 / AlmaLinux 9 / CentOS Stream 9 讲,8 系列和 CentOS 7 的差异单独标出来。

一、先确认没有 MariaDB 占坑

MariaDB 是 MySQL 的分支,两者提供同名文件和命令,同时装会直接冲突。

rpm -qa | grep -i -E 'mariadb|mysql'
sudo dnf remove -y mariadb-server mariadb      # 有就先卸
sudo rm -rf /var/lib/mysql                     # 确认无数据后再删

注意:MariaDB 的数据文件 MySQL 8 是不能直接接管的。如果你有存量 MariaDB 数据,先 mysqldump 导出,再在新库里导入,别指望改个目录就能起来。

二、装官方源并安装

官方源 rpm 的版本号会随小版本更新,最新的链接去 MySQL 官网的 YUM 仓库下载页复制(页面会给出对应 el7 / el8 / el9 的包名),装法是把那个 rpm 直接喂给 dnf:

# 以 RHEL 9 系为例,实际包名以官网下载页为准
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf clean all && sudo dnf makecache
dnf repolist enabled | grep mysql        # 确认 mysql80-community 已启用

RHEL 8 / 9 系列有个必做的前置动作:系统 AppStream 里自带一个叫 mysql 的 module(默认指向 MySQL 8.0),不禁用它安装会报冲突或装到意外版本:

sudo dnf module disable -y mysql
sudo dnf install -y mysql-community-server

装完确认版本:mysqld --version。

三、第一次启动与临时密码

和 Ubuntu 最大的不同在这里:MySQL 官方包第一次启动会给 root 生成一个随机临时密码,写在日志里。

sudo systemctl enable --now mysqld
systemctl status mysqld
sudo grep 'temporary password' /var/log/mysqld.log

拿到那串密码后立刻做安全初始化(服务名是 mysqld,不是 Ubuntu 上的 mysql):

sudo mysql_secure_installation

流程中会依次要求:输入临时密码 → 设置新密码(受 validate_password 策略约束,必须含大小写、数字、符号且够长)→ 是否改 root 密码 → 删匿名用户 → 禁 root 远程 → 删 test 库 → 重载权限表。除「改 root 密码」按需外,其余全部选是。

临时密码过期后还没改,会遇到 ERROR 1862 (HY000): Your password has expired,用 --skip-grant-tables 流程重置即可(思路和 Ubuntu 那篇一致)。

四、配置文件在哪

文件 作用
/etc/my.cnf 主配置,通常只放 !includedir
/etc/my.cnf.d/mysql-server.cnf 服务端参数([mysqld] 段写这里)
/etc/my.cnf.d/client.cnf 客户端默认参数
/var/lib/mysql 数据目录
/var/log/mysqld.log 错误日志,排障第一现场

改完配置重启:sudo systemctl restart mysqld。

常用几项:

[mysqld]
character-set-server = utf8mb4
collation-server     = utf8mb4_0900_ai_ci
bind-address         = 0.0.0.0      # 需要远程才改
max_connections      = 500
innodb_buffer_pool_size = 1G        # 独享机器建议物理内存的 50%~70%

五、防火墙:firewalld 而不是 ufw

sudo firewall-cmd --add-port=3306/tcp --permanent    # 全网放行(不推荐)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="3306" accept'   # 只放行内网段,推荐
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

云服务器还要在控制台安全组放行 3306。账户侧也要建允许远程的账号,这一步和 Ubuntu 完全一样:

CREATE USER 'appuser'@'%' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'%';
FLUSH PRIVILEGES;

六、SELinux 会拦的两件事

SELinux 在 enforcing 模式下,MySQL 只被允许使用被标记的目录和端口。默认装法不用管,改这两处时必须放行:

1. 改了监听端口(比如 3307)

sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t mysqld_port_t -p tcp 3307
sudo semanage port -l | grep mysqld

2. 把数据目录挪到了别处(比如 /data/mysql)

sudo semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
sudo restorecon -Rv /data/mysql

排障时先分清是不是 SELinux 的锅:sudo setenforce 0 临时关一次,如果问题消失,就别急着 setenforce 0 常驻,去看 /var/log/audit/audit.log 里被 deny 的记录,用 audit2allow 生成正确的策略放行。直接关掉 SELinux 是最省事也最不负责的做法。

七、五个常见报错

报错 原因 处理
Public key for mysql-community-*.rpm is not installed GPG key 未导入或已轮换 到 MySQL 官网下载页取最新 RPM-GPG-KEY,sudo rpm --import 导入
Problem: conflicting requests / module 相关 AppStream 的 mysql module 没禁用 sudo dnf module disable -y mysql 后重装
Can't create/write to file ... (Errcode: 13) 数据目录属主或 SELinux 上下文不对 chown -R mysql:mysql + restorecon -Rv
ERROR 2002 Can't connect to local MySQL server through socket 服务没起,或 socket 路径不一致 systemctl status mysqld,日志里看真实 socket 路径
Job for mysqld.service failed 多半是配置写错或端口被占 journalctl -xeu mysqld 和 /var/log/mysqld.log 一起看

八、CentOS 7 用户请注意

CentOS 7 已经在 2024 年停止维护,新机器不要再用它。存量机器如果必须装,思路一样但命令换成 yum、源换成 el7 版本,且只能装到 MySQL 8.0 的较旧小版本。长期方案是迁移到 Rocky Linux、AlmaLinux 这类 RHEL 兼容发行版,命令几乎不用改。

小结

RHEL 系装 MySQL 8 的正确顺序:卸 MariaDB → 装官方源 → 禁用 mysql module → dnf 安装 → 从日志取临时密码 → 安全初始化 → firewalld 与安全组放行 → (改端口或数据目录时)放行 SELinux。多数「装完起不来」都卡在 module 冲突和数据目录权限这两处。

👉 排障常用的在线工具:Linux 命令速查 · SSH 连通性检测 · 端口探测与 Ping

还有 65 个免费在线工具

纯前端实现,不用注册,数据不上传服务器。

浏览全部工具