centos stream 9 上安装 mysql 8.4 必须手动添加官方仓库并启用 mysql-8.4-lts-community 模块,否则 dnf install mysql-server 会失败或安装错误版本;需验证系统版本与架构、禁用 selinux、清空 /var/lib/mysql、启用模块后安装 mysql-community-server,再通过临时密码登录并强制修改密码及运行 mysql_secure_installation 完成安全配置。

mysql-community-server 在 CentOS Stream 9 上默认不可用,必须手动添加官方仓库并启用 8.4 LTS 模块 —— 否则 dnf install mysql-server 装出来的极大概率是 8.0 或报错“没有可用包”。
确认系统版本和架构
先确保你面对的是真实 CentOS Stream 9(不是 RHEL 或 AlmaLinux 冒充):
cat /etc/redhat-release
输出应为 CentOS Stream release 9。再确认架构:
uname -m
必须是 x86_64 或 aarch64;若为 i386,MySQL 8.4 官方不提供支持。
- 别跳过这步:有些镜像源会伪装成 CentOS Stream 9,但内核或 repo 配置不一致,后续安装会静默失败
-
dnf distro-sync建议在添加 MySQL 仓库前执行一次,避免模块冲突
添加 MySQL 8.4 官方仓库并启用模块
MySQL 8.4 在 CentOS Stream 9 中属于 mysql-8.4-lts-community 模块,不能靠 dnf install mysql-server 直接命中。正确流程是:
sudo rpm -Uvh https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm<br>sudo dnf module reset mysql<br>sudo dnf module enable mysql:8.4-lts-community
验证是否生效:
dnf module list mysql | grep -A2 "8.4-lts"
看到 enabled 状态才表示模块已激活。
- 如果执行
dnf module enable报错“no such stream”,说明下载的 RPM 包版本不对,检查 URL 中的el9-1是否匹配你的系统(不是el7或el8) - 禁用 SELinux 或设为 permissive 是必须的,否则
mysqld启动后立即被拒绝访问数据目录(日志里会出现AVC denied) - 不要运行
dnf module enable mysql:8.0后又切回 8.4 —— 模块状态残留会导致dnf install拉错包
安装与初始化 mysql-community-server
模块启用后,直接安装即可:
sudo dnf install -y mysql-community-server
启动服务前,先检查 /var/lib/mysql 是否为空:
- 非空 → 可能残留旧实例,务必清空或重命名,否则
mysqld --initialize会跳过、导致无临时密码 - 空 → 系统自动触发初始化,生成临时密码到
/var/log/mysqld.log
获取临时密码(注意空格和冒号位置):
sudo grep 'temporary password' /var/log/mysqld.log
常见错误现象:grep 无输出 → 初始化未发生 → 检查 /var/lib/mysql 是否被占用或权限不对(应属 mysql:mysql)。
- 启动失败报
Failed to start mysqld.service: Unit not found?检查是否装了mysql-community-server而非mysql-server(后者是 MariaDB 的包名) -
systemctl start mysqld后立刻退出?看journalctl -u mysqld -n 50 -e,90% 是my.cnf里写了不存在的插件或路径
首次登录与安全加固
用临时密码登录后,MySQL 8.4 强制要求改密(因默认策略 validate_password.policy=STRONG):
mysql -uroot -p
登录后立即执行(不能跳过):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPass123!';
然后运行 mysql_secure_installation,重点处理:
- 密码强度:若想临时放宽,先在
/etc/my.cnf的[mysqld]下加validate_password.policy=LOW,重启再运行脚本 - 匿名用户、test 数据库、远程 root 登录 —— 生产环境必须关
-
mysql_native_password插件:如需兼容老客户端(如某些 Zabbix Agent 或 PHP 7.x),加一行default_authentication_plugin=mysql_native_password
最后检查监听地址:
ss -tlnp | grep :3306
默认只绑 127.0.0.1;如需远程连接,改 my.cnf 中 bind-address = 0.0.0.0 并开放防火墙端口 —— 但别忘了配 GRANT 权限。
最易被忽略的一点:MySQL 8.4 默认关闭 local_infile,如果你要用 LOAD DATA INFILE 或 Zabbix 导入 SQL,得在 [mysqld] 和 [client] 两节都显式写 local_infile=ON,否则报错 ERROR 1148 且不提示原因。











