MySQL和服务器连接不上,通常就卡在四个地方:网络不通、端口没放行、MySQL只监听了本机、用户权限不对,先按“ping→telnet→看监听→查用户表”的顺序走一遍,多数情况能快速定位。
先分清报错代码,别一上来就重装
连接失败时,客户端给出的报错代码比“连不上”三个字有用得多,不同代码指向完全不同的排查方向,先把方向找准,能少走很多弯路。
- 2003/10060/10061:TCP连接失败,网络不通或端口没开。
- 1045:用户名或密码错误,也可能是认证插件不匹配。
- 1130:主机不被允许连接,用户host字段限制。
- 1040:连接数已满,服务器暂时拒绝新连接。
下表可以帮你快速对号入座:
| 报错代码 | 常见提示语 | 优先排查点 |
|---|---|---|
| 2003 | Can’t connect to MySQL server on ‘xx’ | 网络、防火墙、安全组、MySQL监听 |
| 10060 | 连接超时 | 云安全组、服务器防火墙、bind-address |
| 10061 | 连接被拒绝 | MySQL未启动、端口错、只监听本机 |
| 1045 | Access denied for user | 密码、认证插件、用户host |
| 1130 | Host ‘xx’ is not allowed | mysql.user表的host字段 |
多数情况下,2003和10060是最容易出现在远程连接场景里的,优先检查网络层。
mysql远程连接不上服务器怎么解决:先查防火墙和安全组
远程连接出问题,不要先怀疑MySQL本身,客户端到服务器3306端口之间,隔着至少三层过滤:服务器本地防火墙、云平台安全组、MySQL自身的监听地址,任何一层卡住,都会表现为“连不上”。
云服务器安全组是重灾区,简米云服务器mysql连接不上多半卡在这
现在相当一部分MySQL部署在云服务器上,简米云、酷番云这类平台的安全组规则默认只开放22端口和80端口,3306端口基本不会自动放行,很多用户以为装了MySQL就能远程连,结果一直被安全组挡在门外。
排查步骤如下:
- 登录云服务器控制台,找到实例对应的安全组。
- 查看入方向规则,确认有没有TCP 3306端口。
- 如果没有,就添加一条规则:协议选择TCP,端口填3306,源地址填0.0.0.0/0或你办公网络的固定IP。
- 保存后等待规则生效,再尝试连接。
如果服务器上装了宝塔面板,还要在宝塔的“安全”页面里放行3306端口,否则面板防火墙会继续拦截。
服务器本地防火墙怎么放行3306
云安全组放行之后,服务器内部的firewalld、ufw或iptables仍然可能拦截,不同系统命令略有差异:
- CentOS/RHEL:
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanentsudo firewall-cmd --reload- 查看已放行端口:
sudo firewall-cmd --list-ports
- Ubuntu/Debian:
sudo ufw allow 3306/tcp- 查看状态:
sudo ufw status
如果防火墙本身处于关闭状态,可以跳过这一步,但安全起见,不建议直接关闭防火墙,放行端口即可。
改掉MySQL只监听本机的设置
即使防火墙和安全组都放行了,MySQL默认配置里还有一个坑:bind-address = 127.0.0.1,这个参数会让MySQL只监听本机回环地址,外部客户端根本连不进来。
检查配置文件:
- Debian/Ubuntu通常位于
/etc/mysql/mysql.conf.d/mysqld.cnf - CentOS/RHEL通常位于
/etc/my.cnf或/etc/my.cnf.d/mysql-server.cnf
找到类似这行:
bind-address = 127.0.0.1
改成:
bind-address = 0.0.0.0
或者直接注释掉该行,同时检查有没有 skip-networking 参数,如果有,也注释掉,它会让MySQL彻底禁用TCP/IP连接。
改完重启服务:
sudo systemctl restart mysql
重启后验证监听地址:
sudo netstat -tlnp | grep 3306
看到 0.0.0:3306 而不是 0.0.1:3306,就说明监听正常了。
mysql连接本地服务器失败:用户权限与认证插件在作怪
如果服务器本机敲命令行能登录,但用Navicat、DBeaver等客户端连本地或远程都失败,问题大概率出在用户权限和认证插件上。
本地root登录不进去,可能是auth_socket插件
Debian和Ubuntu的MySQL安装包默认给root用户使用auth_socket认证插件,这个插件的特性是:只有操作系统root用户通过sudo才能登录MySQL,用密码登录会被直接拒绝,客户端报1045错误。
检查方式:
sudo mysql -u root
如果能登录,看一下用户表:
SELECT user, host, plugin FROM mysql.user;
如果root的plugin是auth_socket,客户端用密码连接自然失败,解决方法是改成密码认证插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
MySQL 8.0默认使用caching_sha2_password,一些老客户端驱动不兼容,也会导致连接失败,同样可以用上面的命令改成mysql_native_password。
远程用户被拒:1130 Host not allowed
就算防火墙全放行,MySQL用户表里host字段不对,照样连不上,很多新手只创建了'user'@'localhost'用户,客户端从其他机器连过来,MySQL匹配不到任何用户,直接报1130错误。
查看现有用户的host:
SELECT user, host, plugin FROM mysql.user;
如果host列全是localhost或127.0.0.1,就需要为远程连接创建专门用户:
CREATE USER 'dev'@'%' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON database_name. TO 'dev'@'%';
FLUSH PRIVILEGES;
表示允许任何主机连接,如果只允许固定IP,把换成'192.168.1.100'这类具体地址,安全性更高。
网络层排查:telnet和nc是最快的验尸官
当配置和权限都查过,还是连不上,就需要回到网络层,用最简单的工具判断数据包到底卡在哪一跳。
- 第一步:在客户端执行
ping 服务器IP,如果不通,可能是网络问题或者服务器禁ping,但不能完全说明TCP不通。 - 第二步:执行
telnet 服务器IP 3306,如果出现Connected to xx,说明TCP通了,问题在MySQL认证层;如果一直卡住或提示超时,问题在防火墙、安全组或MySQL监听。 - 第三步:在服务器上执行
ss -tlnp | grep 3306或netstat -tlnp | grep 3306,确认3306端口处于LISTEN状态,并且监听地址是0.0.0.0。
也可以用nc命令快速测试端口:
nc -zv 服务器IP 3306
成功会显示Connection to 服务器IP 3306 port [tcp/mysql] succeeded!,失败则显示超时或拒绝。
根据测试结果,可以进一步缩小范围:
| 测试结果 | 可能原因 | 下一步动作 |
|---|---|---|
| ping不通 | 网络不通或禁ping | 检查网络、安全组出方向、ICMP规则 |
| ping通但telnet不通 | 防火墙/安全组拦截3306 | 检查云安全组、本地防火墙、监听地址 |
| telnet通但认证失败 | 用户权限或密码问题 | 查mysql.user表、认证插件 |
| telnet通且认证通过 | 驱动或SSL问题 | 检查客户端驱动版本、SSL配置 |
其他高频原因:连接数满了和DNS反解析
有些“连不上”不是完全连不上,而是时好时坏、连接很慢最后超时,这类问题往往容易被忽略。
max_connections连接数用尽
MySQL默认最大连接数通常是151,如果业务请求量较大,或者有连接泄漏,很容易把连接数占满,客户端报错类似Too many connections,新连接被直接拒绝。
临时解决:
SET GLOBAL max_connections = 500;
永久生效需要修改my.cnf:
[mysqld]
max_connections = 500
改完重启MySQL,不过单纯调大上限治标不治本,还得排查是否有连接未释放。
DNS反向解析拖慢连接
如果客户端telnet能通,但实际连MySQL时总要等十几秒甚至更久才连上,可能是MySQL在反解析客户端主机名,默认开启主机名解析,遇到DNS慢或不通的环境,连接建立就会卡住。
解决办法是在[mysqld]配置段加上:
skip-name-resolve
重启MySQL后生效,这个参数会让MySQL直接使用IP地址匹配用户host,不再反解析主机名,客户端配置里需要写IP而不是主机名,否则可能匹配不到用户。
connect_timeout设置过短
默认连接超时是10秒,网络质量差的环境里可能不够用,可以适当调大:
[mysqld]
connect_timeout = 30
但连接慢的本质原因还是要从网络层去找,调大超时只是缓冲。
关于mysql和服务器连接不上的常见问题
mysql连接不上服务器10060错误是什么意思?
10060是Windows客户端的连接超时错误,表示客户端发出的连接请求在指定时间内没有到达服务器3306端口,优先检查云安全组、服务器防火墙和MySQL的bind-address,用telnet验证端口连通性,能最快确认是不是网络层问题。
本地mysql连接不上服务器怎么快速定位?
先确认服务是否启动:systemctl status mysql,没启动就启动它,启动失败看错误日志:tail -f /var/log/mysql/error.log,服务正常再查用户表:SELECT user, host, plugin FROM mysql.user;,本地客户端连不上,多半是root用户用了auth_socket插件,或者host字段不匹配。
mysql连接服务器很慢最后超时怎么处理?
如果telnet到3306端口秒通,但MySQL客户端连接要等很久才失败,大概率是DNS反解析在拖时间,在my.cnf的[mysqld]下加入skip-name-resolve,重启MySQL,之后用户host匹配只认IP,客户端要用IP连接,该参数会禁用主机名解析,能明显改善连接速度。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/646410.html





