MySQL 8.0在CentOS 8/9需通过官方Yum源安装,初始化后启动服务并运行mysql_secure_installation;须配置firewalld放行3306、bind-address设为0.0.0.0、SELinux启用mysqld_can_network。

MySQL 8.0 在 CentOS 8/9 上的安装与初始化
CentOS 8+ 默认不再提供 mysql-server 包,直接 yum install mysql-server 会失败。必须改用官方 MySQL Yum Repository 或启用 AppStream 模块(仅限部分版本)。
- 推荐方式:下载并安装 MySQL 官方 repo:
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el$(rpm -E '%{?rhel}%{!?rhel:8}')-1.noarch.rpm再执行sudo dnf install mysql-community-server - 安装后首次启动前,先初始化数据目录:
sudo mysqld --initialize --rpm(自动写入临时 root 密码到/var/log/mysqld.log) - 启动服务并设为开机自启:
sudo systemctl start mysqld、sudo systemctl enable mysqld - 运行
sudo mysql_secure_installation修改 root 密码、禁用匿名用户、关闭远程 root 登录等 —— 这步跳过会导致后续连接被拒绝
CentOS 防火墙放行 MySQL 端口(firewalld)
默认 firewalld 会拦截 3306 端口,即使 MySQL 正常运行,外部也连不上。不能只靠 systemctl stop firewalld 临时关闭,生产环境必须精准放行。
- 确认当前 zone(通常是
public):sudo firewall-cmd --get-active-zones - 永久放行 3306 端口:
sudo firewall-cmd --permanent --add-port=3306/tcp - 重载规则生效:
sudo firewall-cmd --reload - 验证是否生效:
sudo firewall-cmd --list-ports应显示3306/tcp - 注意:如果使用了自定义端口(如 3307),必须同步修改
mysqld.cnf中的port并在防火墙中放行对应端口
MySQL 绑定地址与远程访问配置
即使防火墙开了、服务也跑了,bind-address = 127.0.0.1(默认值)仍会拒绝所有非本地连接。这不是权限问题,是网络层拦截。
- 编辑配置文件:
sudo vi /etc/my.cnf.d/mysql-server.cnf - 在
[mysqld]段下添加或修改:bind-address = 0.0.0.0(允许所有 IPv4 地址)或指定内网 IP(如192.168.1.100) - 重启服务:
sudo systemctl restart mysqld - 然后创建远程用户(不能只用 root):
CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPass123!';<br>GRANT ALL ON mydb.* TO 'appuser'@'%';<br>FLUSH PRIVILEGES;
- 检查监听状态:
sudo ss -tlnp | grep :3306,输出中应含*:3306而非127.0.0.1:3306
SELinux 对 MySQL 端口的限制(CentOS 特有)
firewalld 放行 + bind-address 改对了,还是连不上?很可能是 SELinux 阻止了 mysqld 访问非标准端口或网络绑定。CentOS 默认启用 SELinux,这点常被忽略。
- 检查是否启用:
sestatus,若为enabled就需处理 - 查看当前 mysqld 策略布尔值:
getsebool -a | grep mysql,重点关注mysqld_connect_any和mysqld_can_network - 临时开启网络访问:
sudo setsebool -P mysqld_can_network=on - 如果改了端口(比如用了 3307),还需将该端口加入 mysqld 端口类型:
sudo semanage port -a -t mysqld_port_t -p tcp 3307(需先装policycoreutils-python-utils)
MySQL 的“能连”和“连得上”之间,隔着 firewalld、bind-address、SELinux 三层关卡。少调其中任意一个,都会表现为“Connection refused”或超时,但错误日志里往往不报具体原因。










