首页/数据/数据库速查/连接报错 2003 Can't connect to MySQL server

连接报错 2003 Can't connect to MySQL server

ERROR 2003 表示客户端建立不了 TCP 连接,排查顺序:服务是否启动、端口是否监听、bind-address、防火墙与云安全组。

数据库速查数据更新于 2026-10-13

2003 是什么

ERROR 2003 (HY000) Can't connect to MySQL server 出现在认证之前:客户端连服务端的端口这一步就没成功,跟账号口令完全无关。原因集中在四类——服务没起来、监听地址不对、防火墙或安全组拦截、端口被改或被别的进程占用。排查顺序按服务状态、端口监听、网络策略、监听参数自下而上推进,比对着一堆参数乱改快得多。

基本信息

错误码ERROR 2003 (HY000)
含义客户端建立不了到服务端口的 TCP 连接
与 1045 区别2003 发生在认证之前,与账号口令无关
排查顺序服务状态 → 端口监听 → 防火墙与安全组 → bind-address
常见诱因服务未启动、只监听本机、安全组未放行、端口冲突
适用场景自建 MySQL 5.7 / 8.0 与云数据库白名单排查

典型使用场景

  • 应用发布后连不上库,日志里就是 2003,先确认服务进程是否在运行
  • 云主机迁移后连不上:安全组没放行数据库端口,或只放行了内网网段
  • 调整过 bind-address 后本机能连、远程连不上,需要确认监听地址与重启是否生效
  • 容器里跑数据库只能从容器内访问,宿主机连不上,多数是端口映射没做
  • 实例端口被改成非默认值,客户端仍按 3306 连接
  • 实例被内存不足杀掉后没有自动重启,对外表现为连接被拒或超时

逐层排查

逐层排查
systemctl status mysqld   # 第一步看服务是否在运行、是否反复重启
ss -lntp | grep 3306   # 第二步看端口监听状态与监听地址
ss -lntp | grep mysqld   # 端口被改过时按进程名查实际监听
telnet 10.0.0.5 3306   # 第三步从客户端侧验证可达性
nc -vz 10.0.0.5 3306   # 没有 telnet 时用它,同样只测端口
firewall-cmd --list-all   # 第四步查本机防火墙是否放行(CentOS 7 及以上)
mysql -uroot -p -e "SHOW VARIABLES LIKE 'bind_address'; SHOW VARIABLES LIKE 'port';"   # 确认实际生效的监听参数

现象对照排查

现象可能原因下一步
Connection refused端口没人监听,服务未启动或端口写错先查服务状态与监听端口
Connection timed out数据包被丢弃查本机防火墙、云安全组与网络策略
Can't connect through socket走的是本地 socket 路径,与 2003 不同源核对 socket 文件路径与目录权限
本地能连、远程 2003只监听了 127.0.0.1调整 bind-address 并确认重启后生效
容器内能连、宿主连不上端口未映射或映射到本机回环地址检查容器端口映射与网络模式
启动日志报端口被占同机已有实例占用同一端口查占用进程或改端口并同步客户端配置

相关配置

相关配置
[mysqld]
bind-address = 0.0.0.0
port = 3306
skip-networking = 0
把 bind-address 改成 0.0.0.0 只是打开网卡监听,必须同时配好防火墙来源限制与账号来源约束(例如 'app'@'10.0.%'),否则端口一通就等于把数据库摆到网络上,很快会被扫描到。
ERROR 2003 属网络层问题,Can't connect through socket 属本地 socket 层问题,两者排查路径完全不同;先看清楚报错里写的是主机端口还是 socket 路径,再决定查网络还是查文件与权限。
云数据库上的 2003 基本是白名单没放行当前来源 IP 或连接地址用错(内网地址用了公网、代理地址写了只读地址),去控制台核对连接串与访问白名单即可,服务端参数无从调整。

易错点

  • 只在本机防火墙放行就以为通了:云上有安全组与网络 ACL,两头都要核对,否则客户端仍然 2003
  • 改完 bind-address 或 port 没有重启也没验证:ss 看到的还是旧监听,误判配置已生效并继续往下查错方向
  • 为解决 2003 直接把监听改成全网段、账号又用 % 配弱口令:端口开放当天就可能被扫描并尝试爆破
  • 用 ping 是否通判断数据库可达:ping 走 ICMP,与 TCP 端口开放是两件事,必须用 telnet 或 nc 测端口
  • 同机跑多个实例时端口冲突:日志里端口被占与连接被拒交替出现,先确认端口归属再改配置

数据来源与参考

  • MySQL 8.0 Reference Manual: Connection Errors and Problems

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌