CentOS系统下MySQL连接失败的常见原因及解决方法
若MySQL服务未运行,客户端无法建立连接。需通过以下命令检查服务状态:
sudo systemctl status mysqld
若输出显示Active: inactive (dead),则启动服务并设置开机自启:
sudo systemctl start mysqld
sudo systemctl enable mysqld
启动后再次检查状态,确认服务处于active (running)。
CentOS默认开启firewalld,可能拦截MySQL的默认端口(3306)。需开放端口并重载防火墙:
sudo firewall-cmd --add-port=3306/tcp --permanent # 永久开放端口
sudo firewall-cmd --reload # 重载配置使更改生效
也可通过firewall-cmd --list-all验证端口是否在public zone的ports列表中。
MySQL默认仅允许本地连接(bind-address = 127.0.0.1),需修改配置文件允许远程访问:
编辑/etc/my.cnf(或/etc/mysql/my.cnf),找到[mysqld]部分,将bind-address修改为0.0.0.0(允许所有IP)或服务器实际IP:
[mysqld]
bind-address = 0.0.0.0
修改后重启MySQL服务:
sudo systemctl restart mysqld
需注意:开放0.0.0.0会增加安全风险,建议仅允许可信IP连接。
默认情况下,MySQL用户仅能从localhost连接。需为用户授予远程访问权限:
登录MySQL:
mysql -u root -p
执行以下SQL命令(将username替换为目标用户名,%表示允许任意主机,password替换为强密码):
-- 创建远程用户(若用户已存在,可跳过创建步骤)
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
-- 授予所有数据库的所有权限(生产环境建议限制为特定数据库)
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';
-- 刷新权限使更改立即生效
FLUSH PRIVILEGES;
退出MySQL:exit。
若客户端与服务器不在同一网络,需检查:
ping <服务器IP>测试);traceroute <服务器IP>排查);若3306端口被其他进程占用,MySQL无法启动。需检查端口占用情况:
sudo netstat -tulnp | grep 3306
若输出显示其他进程(如mysqld_safe、mariadb)占用端口,需停止占用进程或修改MySQL端口:
sudo kill -9 <PID>(<PID>为进程ID);/etc/my.cnf,在[mysqld]部分添加port = 新端口(如port = 3307),重启服务。若以上步骤均无法解决,可通过MySQL错误日志获取详细信息:
sudo tail -f /var/log/mysqld.log
日志中会记录连接失败的具体原因(如认证失败、配置错误、资源不足等),根据日志提示针对性解决。