在 CentOS 上 MySQL 连不上 是很常见的问题,通常可以归为以下几类原因。我按「最常见 → 较少见」给你一个排查清单,你可以一条条对照。
systemctl status mysqld
# 或
systemctl status mariadb
如果没启动:
systemctl start mysqld
systemctl enable mysqld
ss -lntp | grep 3306
如果没有,说明:
firewall-cmd --list-all
如果没有 3306:
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
编辑配置文件:
vi /etc/my.cnf
# 或
vi /etc/my.cnf.d/*.cnf
看是否有:
bind-address = 127.0.0.1
如果是,远程连接会被拒绝。
✅ 改为:
bind-address = 0.0.0.0
然后重启:
systemctl restart mysqld
即使端口通了,用户也可能不允许远程登录。
登录 MySQL:
mysql -u root -p
查看用户 host:
SELECT user, host FROM mysql.user;
如果用户是:
root | localhost
说明 只能本机登录
✅ 创建远程用户:
CREATE USER 'test'@'%' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%';
FLUSH PRIVILEGES;
getenforce
如果是 Enforcing,可能拦截 MySQL 网络。
临时测试:
setenforce 0
如果连上了,说明是 SELinux 问题。
✅ 永久解决(允许 MySQL 联网):
setsebool -P mysql_connect_any 1
检查:
localhost(走 socket 而不是 TCP)例如:
mysql -h 127.0.0.1 -u root -p
| 报错 | 原因 |
|---|---|
Can't connect to MySQL server |
服务没起 / 防火墙 |
Access denied for user |
用户权限问题 |
Unknown MySQL server host |
IP / DNS 错误 |
Connection refused |
端口没监听 |
systemctl status mysqld
ss -lntp | grep 3306
firewall-cmd --list-all
mysql -h 127.0.0.1 -u root -p
如果你愿意,可以把:
发给我,我可以帮你精确判断是哪一步的问题。