不推荐在 CentOS Stream 9 上从源码编译 MySQL 8.4,官方未提供源码包支持,且构建链路极不稳定;应优先使用 mysql-8.4-lts-community 模块安装或 .tar.xz 二进制包部署。

直接说结论:不推荐在 CentOS Stream 9 上从源码编译 MySQL 8.4,官方未提供源码包支持,且构建链路极不稳定;应优先使用 mysql-8.4-lts-community 模块安装或 .tar.xz 二进制包部署。
为什么官方不提供 MySQL 8.4 的源码包?
MySQL 官网(dev.mysql.com/downloads/mysql/)自 8.4 起已停止发布 mysql-8.4.x.tar.gz 或 .tar.xz 源码归档。所有 8.4.x LTS 版本仅提供预编译的 RPM 包(如 mysql-community-server-8.4.9-1.el9.x86_64.rpm)和二进制 tarball(如 mysql-8.4.9-linux-glibc2.28-x86_64.tar.xz)。尝试用旧版 CMake + Boost 构建会失败,因为:
- MySQL 8.4 强依赖
glibc 2.28+和OpenSSL 3.0+,CentOS Stream 9 默认满足,但源码构建需手动指定路径、版本及 patch,极易卡在cmake阶段报Could not find OpenSSL或Boost not found - 官方构建脚本(
build/build-binary-tarball.cmake)已移除公开访问权限,社区无等效替代方案 - 即使强行编译成功,生成的二进制文件也缺少
mysqld的 SELinux 策略标签和 systemd 单元文件,后续启动、日志、权限管理全靠手动补丁
dnf install mysql-community-server 为什么装不到 8.4?
因为默认仓库里没有启用对应模块——mysql-community-server 是通用包名,实际版本由 dnf module 控制。不显式启用 mysql:8.4-lts-community,dnf install 就会 fallback 到系统默认流(通常是 mysql:8.0 或直接报错 No match for argument: mysql-community-server)。
- 执行
dnf module list mysql,若输出中8.4-lts-community行状态不是enabled,说明模块未激活 - 必须按顺序执行:
sudo rpm -Uvh https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm→sudo dnf module reset mysql→sudo dnf module enable mysql:8.4-lts-community - 若误启用了
mysql:8.0后再切回 8.4,需先dnf module disable mysql:8.0,否则dnf install仍拉取旧包
用 .tar.xz 二进制包部署的关键动作
这是最接近“手动安装”又规避编译风险的方式,但路径、权限、配置项必须严格对齐,否则 mysqld 启动即失败。
-
/usr/local/mysql必须是解压后的顶层目录,且属主为mysql:mysql;/data/mysql(数据目录)不能与basedir混用,且需chmod 750 -
my.cnf中必须显式声明user = mysql和datadir = /data/mysql,否则初始化时会写入/var/lib/mysql并被 SELinux 拒绝 - 初始化命令必须带
--initialize-insecure(跳过随机密码)或--initialize(生成临时密码),不可省略--user=mysql参数,否则mysqld进程以 root 身份运行,后续无法降权 - 首次启动前务必执行
setenforce 0或将 SELinux 设为permissive,否则日志中会出现大量AVC denied { write } for ... comm="mysqld" name="mysql"
最容易被忽略的点:模块状态残留与日志定位
模块启用后,dnf install mysql-community-server 看似成功,但 rpm -qi mysql-community-server 显示版本仍是 8.0.x,大概率是 dnf module reset mysql 没执行彻底,或之前安装过其他 MySQL RPM 导致 rpmdb 冲突。此时应:
- 运行
sudo dnf module list mysql确认当前 stream 状态 - 检查
/var/log/dnf.log中最近的install记录,确认实际下载的 RPM 包名是否含8.4.9 - 若仍不确定,直接查服务二进制:
/usr/sbin/mysqld --version—— 这比看包名更可靠 - 所有初始化失败问题,第一反应不是重装,而是看
/var/log/mysqld.log或/data/mysql/error.log(取决于log_error配置),90% 的错误都在里面,比如InnoDB: Unable to lock ./ibdata1 error: 11就是权限没给对


















