错误2003表示MySQL客户端无法建立网络连接,根源在于服务未运行、bind-address配置不当(如127.0.0.1限制本地)或防火墙/网络阻断,与账号密码、权限无关。

MySQL报错2003:Can't connect to MySQL server on 'xxx' (111)
这个错误表示客户端根本没连上 MySQL 服务端,不是账号密码错、不是权限问题,而是网络层面的连接被拒绝或超时。常见于本地开发环境、Docker 容器、云服务器或远程数据库访问场景。
检查 mysqld 是否真的在运行
很多情况下,MySQL 服务压根没启动,或者启动失败后自动退出了。别急着改配置,先确认进程是否存在:
- Linux/macOS:
sudo systemctl status mysql或ps aux | grep mysqld - Windows:打开「服务」管理器,查找
MySQL80(或你安装时命名的服务名)是否为「正在运行」 - 如果状态是
inactive (dead)或failed,直接执行sudo systemctl start mysql;若启动失败,看日志:sudo journalctl -u mysql --since "1 hour ago"
确认 bind-address 和 skip-networking 配置
MySQL 默认可能只监听本地 socket(localhost)或绑定到 127.0.0.1,导致远程连接被拒。关键配置项在 my.cnf(通常位于 /etc/mysql/my.cnf、/etc/my.cnf 或 /usr/local/etc/my.cnf)中:
- 检查
bind-address:若设为127.0.0.1,则仅接受本机 TCP 连接;设为0.0.0.0才允许所有 IP(注意防火墙) - 确认没有启用
skip-networking—— 一旦开启,mysqld 将完全禁用 TCP/IP 连接,只支持 socket - 修改后必须重启服务:
sudo systemctl restart mysql,且确保配置文件无语法错误(可用mysqld --validate-config检查)
验证端口、防火墙与网络可达性
即使 mysqld 启动且绑定了 0.0.0.0,也可能被中间环节拦截:
- 默认端口是
3306,确认没被其他程序占用:sudo lsof -i :3306或netstat -tuln | grep :3306 - Linux 防火墙(如
ufw)可能屏蔽该端口:sudo ufw status→ 若 active,需添加规则:sudo ufw allow 3306 - Docker 场景下,检查是否漏掉
-p 3306:3306映射,以及容器内bind-address是否设为0.0.0.0 - 远程连接时,在客户端机器执行:
telnet your-server-ip 3306或nc -zv your-server-ip 3306—— 若连不上,说明网络层不通,和 MySQL 本身无关
mysql -h 127.0.0.1 -P 3306 -u root -p # 注意:-h 127.0.0.1 走 TCP;-h localhost 默认走 socket,行为不同
最容易被忽略的是:错误 2003 从不涉及用户认证逻辑,所以改密码、授权、flush privileges 全部无效。重点永远在「服务是否活着」「是否监听正确地址」「网络是否通」这三层。尤其在 Docker 或云主机上,bind-address = 127.0.0.1 加 ufw 默认 deny 是高频组合陷阱。










