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 或连接地址用错(内网地址用了公网、代理地址写了只读地址),去控制台核对连接串与访问白名单即可,服务端参数无从调整。