在AlmaLinux 8上部署生产级MySQL 8.0,必须用官方YUM仓库+dnf安装+手动初始化配置,禁用AppStream模块(版本滞后、无SELinux上下文、缺validate_password),清旧包后执行:dnf install https://dev.mysql.com/get/mysql80-community-release-el8-7.noarch.rpm -y && dnf install mysql-community-server -y && systemctl enable --now mysqld。

直接上结论:在AlmaLinux 8上部署生产级MySQL 8.0,**必须用官方YUM仓库 + dnf安装 + 手动初始化配置**,跳过AppStream默认模块(它版本滞后、组件不可控),也别碰手动解压RPM包或tar包——那些方式无法保证服务注册、systemd单元完整性与SELinux上下文自动适配。
为什么不能用dnf module enable mysql:8.0装生产环境
AlmaLinux AppStream里的mysql模块虽然标着“8.0”,但实际是冻结快照版(比如8.0.28),不接收上游安全更新;更重要的是,它把mysqld进程以mysql用户身份启动,却没预置/var/lib/mysql的SELinux类型(mysqld_db_t),导致后续开启SELinux时服务反复失败。生产环境要的是可审计、可升级、可加固的路径,不是“能跑就行”的快照。
- 查当前模块状态:
dnf module list mysql,看到[d]不等于“推荐” - AppStream版不带
validate_password组件,密码强度策略形同虚设 - 它的
my.cnf模板里bind-address默认是127.0.0.1,但没加skip-networking=OFF显式声明,容易被误认为已禁用网络
正确安装流程:四步锁定关键动作
所有命令在root或sudo下执行,顺序不能乱:
- 清旧库:
rpm -qa | grep -E '^(mysql|mariadb)' | xargs -r rpm -e --nodeps(--nodeps必要,否则mariadb-libs卸载失败会卡住后续) - 加官方源:
dnf install https://dev.mysql.com/get/mysql80-community-release-el8-7.noarch.rpm -y(注意el8,不是el9;AlmaLinux 8对应el8) - 装服务:
dnf install mysql-community-server -y(不要加@mysql组,那会拉进一堆非必需组件如mysql-shell) - 启服务:
systemctl enable --now mysqld(--now确保立即启动,避免漏掉首次初始化)
这一步完成后,mysqld会自动生成临时root密码到/var/log/mysqld.log,且自动设置SELinux上下文(chcon -t mysqld_db_t /var/lib/mysql已内建)。
mysql_secure_installation必须改的三项
运行mysql_secure_installation只是起点,以下三项不手动干预,等于没加固:
- 密码策略:默认
validate_password要求含大小写+数字+特殊字符+8位,但生产环境常需对接LDAP或统一密码策略,此时应先执行SET GLOBAL validate_password.policy = LOW;再设密码,而非直接卸载组件 - 认证插件:如果应用用老JDBC驱动(
mysql-connector-java:5.1.x)或PHPmysqli扩展,必须在初始化后立刻执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password'; - 远程访问:向导默认禁用远程root,但业务库通常需要
app_user@'10.10.20.%'这类受限账号,得手工创建:CREATE USER 'app_user'@'10.10.20.%' IDENTIFIED BY 'p@ssw0rd'; GRANT SELECT,INSERT,UPDATE ON mydb.* TO 'app_user'@'10.10.20.%';
配置文件里最容易被忽略的三个坑
/etc/my.cnf不是写完就生效,MySQL 8.0读取顺序和参数语义变了:
-
character-set-server=utf8mb4必须配在[mysqld]段,且要同步加collation-server=utf8mb4_unicode_ci;只写前者会导致INFORMATION_SCHEMA里部分元数据排序异常 -
max_connections=500这类值,得结合系统ulimit -n检查——若系统限制是1024,而max_connections * wait_timeout / 60估算连接内存超限,服务会在高并发时静默崩溃 -
log-error=/var/log/mysqld.log路径必须存在且mysql用户可写,否则systemctl start mysqld会报Failed to start mysqld.service: Unit not found(实际是日志路径权限失败,错误信息误导)
改完配置必须用systemctl restart mysqld,systemctl reload mysqld对大多数参数无效。


















