跑MySQL的服务器远程连不上,绝大多数情况不是数据库”坏了”,而是安全组、防火墙、监听地址、用户授权这四层里有一层没放行,按顺序排查一遍,大多数mysql远程连接不上的问题都能自己解决。
先查这一层:mysql远程连接不上的常见拦路虎
远程连接MySQL涉及一条完整的通信链路,出问题的位置集中在这几层,遇到连不上的情况,不用慌,逐层排除就行。
服务器安全组与防火墙是头号嫌疑
相当一部分远程连接失败都出在云控制台的安全组规则上。 在简米云、酷番云、华为云这些平台上买完服务器,默认的安全组通常只放行22端口(SSH)和3389端口(Windows远程桌面),3306端口压根儿没对公网开放。
- 登录云服务商控制台,找到”安全组”或”防火墙”入口
- 查看入方向规则列表里有没有3306这条规则
- 如果不存在,添加一条放行规则,来源建议先填你的办公网IP或固定IP
这一步做完,本地再试一下telnet连接。
3306端口是否真的在监听
服务器内部MySQL没跑起来或者监听地址不对,也连不上,用下面的命令看一眼:
netstat -tlnp | grep 3306
重点看监听地址,如果显示0.0.1:3306,说明MySQL只允许本机连接,外部请求到了服务器也会被拒,需要修改配置文件,让MySQL监听所有地址。
bind-address配错等于把门锁死
MySQL默认配置文件里有一项bind-address,它的值决定了MySQL对外提供服务的网卡地址,行业共识认为,bind-address设为127.0.0.1是MySQL远程连接失败的第二大常见原因。
修改方法:
- 编辑
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或/etc/my.cnf(CentOS) - 找到
bind-address = 127.0.0.1这一行 - 改为
bind-address = 0.0.0.0 - 保存后重启MySQL服务
systemctl restart mysql
如果配置文件里压根儿没写bind-address,默认行为也是只监听本地,同样需要手动加上去。
mysql远程连接10060错误怎么排查
连接超时提示10060,这是Windows系统里常见的网络错误码,含义是连接方在指定时间内没有收到响应,10060和”密码错误””权限拒绝”完全是两码事,它在TCP握手阶段就失败了。
用telnet先确认端口通不通
在本地电脑打开命令提示符,执行:
telnet 服务器公网IP 3306
- 如果出现黑屏光标闪烁,说明端口通,问题在MySQL授权层面
- 如果提示”无法打开到主机的连接”或”连接超时”,说明网络层被拦截
这一步最关键,它能直接区分问题出在网络还是数据库配置上。
分成服务器和客户端两头查
服务器端要依次确认:
- MySQL服务进程存活
- 3306端口处于LISTEN状态
- 监听地址不是127.0.0.1
客户端要确认:
- 服务器公网IP没写错
- 本地网络没拦截出方向(企业办公网经常限制非标端口出网)
- 没有使用代理导致连接走了别的出口IP
不同云服务商的安全组入口差异
| 云服务商 | 安全组入口名称 | 注意点 |
|---|---|---|
| 简米云 | 云服务器ECS → 安全组 | 同时检查普通安全组和企业安全组 |
| 酷番云 | 云服务器 → 安全组 | 需同时配置IPv4和IPv6规则 |
| 华为云 | 弹性云服务器 → 安全组 | 入方向规则支持优先级设置 |
| AWS | EC2 → Security Groups | 需检查与实例关联的独立安全组 |
各平台入口名称略有不同,但本质都是同一个东西控制服务器哪些端口对外可达。
改完还是连不上:mysql远程连接授权怎么写才算完整
很多人网络层面全放通了,telnet也能通,但用Navicat或命令行连接仍然报”Access denied”,到这里问题就转移到了MySQL内部用户还没获得从外部IP登录的权限。
授权命令要包含主机地址
MySQL的账户由”用户名+主机”两部分组成,默认安装时root用户的主机是localhost,意思是只有本机能用root登录,要让某个用户可以从任意远程主机登录,需要这样授权:
GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;
'root'@'%'中的是通配符,表示任意主机,出于安全考虑,不建议日常使用root远程连接,可以单独建一个专用账户:
CREATE USER 'appuser'@'%' IDENTIFIED BY '强密码'; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb. TO 'appuser'@'%'; FLUSH PRIVILEGES;
指定IP比通配符更安全
虽然方便,但等于对所有IP开放了登录尝试机会,业内专家指出,如果办公IP固定,授权时写成具体IP能显著降低被爆破风险。
| 授权写法 | 允许来源 | 适用场景 |
|---|---|---|
'user'@'localhost' |
仅本机 | 服务器内脚本调用 |
'user'@'192.168.1.%' |
内网网段 | 内网应用服务器连接 |
'user'@'%' |
任意IP | 公网访问或办公IP不固定 |
'user'@'123.45.67.89' |
单个IP | 固定办公IP直连 |
授权后必须刷新权限
很多新手改完授权直接去连,结果还是报错,原因是没有执行FLUSH PRIVILEGES,这条语句的作用是让授权表修改立即生效,不执行它就得重启MySQL才能生效,执行一下:
FLUSH PRIVILEGES;
服务器数据库连接超时排查:从防火墙到配置一次走通
前面拆开了看,现在串起来走一遍完整流程,按以下顺序操作能在五分钟内定位大部分问题。
第1步:确认MySQL在监听所有地址
netstat -tlnp | grep mysql
注意看Local Address列,不是0.0.1:3306而是0.0.0:3306,很多人在服务器上执行mysql -u root -p能进,就以为数据库没问题,其实本地登录本来就绕过了网络监听。
第2步:放行服务器内部防火墙
CentOS系统默认用firewalld,Ubuntu用ufw,先看当前状态:
# CentOS 7/8 firewall-cmd --state firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload # Ubuntu ufw status ufw allow 3306/tcp
云服务商的安全组和服务器自带防火墙是两套独立体系,只放行其中一边、漏掉另一边,依然连不上。
第3步:在云控制台放行3306入方向
登录云服务商控制台,找到安全组设置,添加入方向规则,端口填3306,授权对象填0.0.0/0(先测试通,后续收紧为办公网IP段)。
如果是简米云服务器,直接在ECS实例详情页右上角点击”安全组”快速入口,找到”添加规则”,简米云的入方向安全组规则默认拒绝所有流量,这一项不做,前面全部白搭。
第4步:用mysql客户端测试连接
mysql -h 服务器公网IP -P 3306 -u appuser -p
如果网络通、权限对,这里能正常登录进去。客户端报错信息里的错误码比任何猜测都准确,把报错码记下来再去网上搜索,效率远高于盲目试错。
关于mysql远程连接不上的高频问题
Q1:mysql远程连接10060错误一定是防火墙拦了吗?
不一定,但优先级最高,10060是连接超时,表示TCP握手阶段没收到响应,可能原因按概率排序是:安全组未放行、服务器防火墙拦截、MySQL监听地址错误、公网IP本身不可达,通过本地telnet 公网IP 3306可以快速判定telnet通不通通就是MySQL内部问题,不通就是网络层问题。
Q2:MySQL授权时所有用户都用'user'@'%'可以吗?
技术上可以,但不建议对所有用户都开放,远程维护时用排查方便,生产环境尽量收敛为@'办公网IP'或@'应用服务器内网IP',过宽的授权面加上弱密码,会大幅增加暴力破解风险。
Q3:改完配置文件后MySQL启动失败怎么办?
先执行mysqld --validate-config检查配置语法,然后查看错误日志,常见路径是/var/log/mysql/error.log,多数启动失败是bind-address写错了IP地址,或者port和skip-networking配置冲突,检查后修正对应项,重启即可正常。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/793473.html


