结论:用 dnf 从 MySQL 官方仓库安装最稳妥省事,因其自动处理依赖、systemd 服务、权限初始化及 SELinux 配置,避免手动 rpm 安装易出现的初始化失败、权限错误和静默退出等问题。

直接上结论:用 dnf 从 MySQL 官方仓库安装是最稳妥、最省事的方式,避免 rpm 包依赖冲突和手动初始化踩坑。源码编译或离线 rpm 手动安装在 CentOS Stream 9 上容易卡在 mysqld --initialize 权限、systemd 单元文件缺失或 SELinux 上下文错误上。
为什么优先选官方仓库 + dnf 而不是 rpm 包手动装?
CentOS Stream 9 默认使用 dnf(而非旧版 yum),MySQL 官方为 el9 提供了适配的 mysql80-community-release 仓库包,它会自动处理:mysql-community-server 及其所有依赖(mysql-community-common、mysql-community-client 等)的版本对齐;预置正确的 systemd service 文件;设置好默认 datadir 和日志路径权限;并跳过手动 mysqld --initialize 的风险步骤。
常见翻车点包括:
- 手动 rpm 安装顺序错(比如先装
server再装client,但server依赖client-plugins) -
mysqld --initialize时没指定--user=mysql或chown不彻底,导致启动失败报Can't open the mysql.plugin table - SELinux 未禁用或未设布尔值,
systemctl start mysqld静默退出无日志
dnf 安装 MySQL 8.0 的实操步骤(三步到位)
执行以下命令(无需提前创建用户、解压 tar、改环境变量):
- 添加官方仓库:
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm - 启用 MySQL 8.0 并禁用旧版(可选但推荐):
sudo dnf config-manager --disable mysql57-community;sudo dnf config-manager --enable mysql80-community - 安装服务:
sudo dnf install -y mysql-community-server
安装完成后,mysqld 服务已注册,/var/lib/mysql 目录自动初始化,初始密码写入 /var/log/mysqld.log —— 这一步是 dnf 方式和手动 rpm 最关键的区别:它调用了 %post 脚本完成初始化,你不用碰 mysqld --initialize。
启动失败?先盯住这三项检查
如果 systemctl start mysqld 报 failed,别急着重装,按顺序查:
- 确认 SELinux 已关:
getenforce输出必须是Disabled;若为Enforcing,执行sudo setenforce 0并修改/etc/selinux/config中SELINUX=disabled - 检查端口占用:
sudo ss -tlnp | grep :3306,确保没其他进程(如残留的 mariadb)占着 3306 - 看真实错误:
sudo journalctl -u mysqld -n 50 -xe,重点关注含Can't start server或Table 'mysql.plugin' doesn't exist的行 —— 前者多因 SELinux,后者多因初始化不完整(此时删掉/var/lib/mysql重来比修权限更快)
首次登录后必须做的三件事
拿到临时密码后,mysql -u root -p 登录,立刻执行:
- 改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass!123';(密码需含大小写字母、数字、特殊字符) - 开远程访问(如需):
CREATE USER 'admin'@'%' IDENTIFIED BY 'AnotherStrongPass!456'; GRANT ALL ON *.* TO 'admin'@'%'; FLUSH PRIVILEGES; - 切认证插件(Navicat/Workbench 连不上?):
ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'AnotherStrongPass!456';
注意:bind-address 默认是 127.0.0.1,要允许远程连,必须编辑 /etc/my.cnf 在 [mysqld] 下加一行:bind-address = 0.0.0.0,然后 systemctl restart mysqld。
最后提醒一句:官方仓库方式装完,mysql 命令和 mysqld 都已在 PATH,不需要手动配 PATH 或 basedir。真正容易被忽略的是 firewalld —— 即使开了 3306 端口,MGR 场景下还必须开 33061,否则节点间握手直接超时。


















