CentOS 8 安装 MySQL 5.7 需先禁用默认 mysql:8.0 模块、导入新 GPG 密钥、启用 el7 仓库,再安装服务;启动后需提取临时密码、关闭密码校验、修改密码、配置 bind-address 和防火墙,并注意 SELinux 上下文。

CentOS 8 默认不支持直接 yum install mysql-community-server 安装 MySQL 5.7 —— 因为它的官方仓库默认启用的是 MySQL 8.0 模块,且 5.7 的 repo 配置被模块化机制屏蔽了。必须先调整模块状态、指定正确源,再安装,否则会报 No match for argument: mysql-community-server 或 All matches were filtered out by modular filtering。
禁用默认 mysql 模块并启用 5.7 仓库
CentOS 8 使用 dnf module 管理多版本软件流,MySQL 5.7 不是“被删了”,而是被 mysql:8.0 模块锁住了。不执行这步,后续所有 yum install 都会失败。
- 运行
dnf module list mysql,确认当前启用的是mysql:80(即 8.0 流) - 禁用它:
dnf module reset mysql && dnf module disable mysql - 下载并安装适配 CentOS 8 的 MySQL 5.7 Yum 仓库包(注意:必须用
el7版本,el8包里不含 5.7):wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm && rpm -Uvh mysql57-community-release-el7-11.noarch.rpm - 验证 5.7 仓库已启用:
dnf repolist enabled | grep "mysql57",应看到mysql57-community
安装 mysql-community-server 并处理 GPG 密钥错误
即使仓库启用,yum install mysql-community-server 仍可能因 GPG 公钥不匹配失败,错误提示类似:Public key is not installed 或 GPG key is not applicable。这是因为 MySQL 在 2022 年后更换了签名密钥。
- 手动导入新密钥:
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 - 再安装服务:
dnf install -y mysql-community-server - 如果仍报错“no match”,检查
/etc/yum.repos.d/mysql-community.repo中[mysql57-community]段是否启用了:enabled=1;若为0,改为1并保存
启动服务并获取初始密码
MySQL 5.7 启动后会自动生成一个临时 root 密码,记录在日志中。但 CentOS 8 的 mysqld 服务默认使用 systemd,且日志路径固定,不能靠猜。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 启动服务:
systemctl start mysqld - 查看状态确认运行:
systemctl status mysqld(若报Failed to connect to bus,说明容器或精简系统未启用 systemd,需换 tar 包方式) - 提取初始密码:
grep 'temporary password' /var/log/mysqld.log—— 注意不是password,而是temporary password,漏掉这个词就找不到 - 登录:
mysql -u root -p,粘贴上一步拿到的密码
修改密码与开放远程访问的关键细节
刚装好的 MySQL 5.7 对密码强度有强制要求(至少 8 位,含大小写字母、数字、特殊字符),且默认只允许 localhost 连接。跳过这两步,开发或运维连不上数据库是常态。
- 修改密码前先关校验(否则
ALTER USER会报错):set global validate_password_policy=0;,再执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPass!2026'; - 开放远程访问不能只改
user表的host字段,还要确保:bind-address在/etc/my.cnf中设为0.0.0.0或注释掉(默认是127.0.0.1) - 执行授权语句:
CREATE USER 'root'@'%' IDENTIFIED BY 'YourPass!2026'; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;(推荐新建用户而非改localhost用户的 host) - 别忘了开放防火墙端口:
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload
最易被忽略的一点:CentOS 8 的 SELinux 默认阻止 mysqld 访问非标准路径(如 /data/mysql)。如果自定义了 datadir 却没打标签,服务会静默失败。要用 semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?" && restorecon -Rv /data/mysql 修复,否则光看 systemctl status 会误判为配置问题。










