先确认mysqld是否监听目标IP的3306端口:Linux用ss -tuln | grep :3306,Windows用netstat -ano | findstr :3306;若仅显示127.0.0.1:3306或无输出,需检查bind-address配置(应为0.0.0.0或具体IP)、关闭skip-networking、重启服务,并同步放行防火墙及云安全组规则。

mysql -h 192.168.x.x 连不上,先看 mysqld 到底听没听 3306
服务“正常运行”不等于它在监听你想要的地址。很多情况下 systemctl status mysql 显示 active,但 mysqld 只绑定了 127.0.0.1:3306,远程 TCP 请求根本进不来。
Linux 上立刻执行:ss -tuln | grep :3306;Windows 上用:netstat -ano | findstr :3306。
- 如果输出里只有
127.0.0.1:3306或::1:3306,说明只接受本地连接 - 如果完全没输出,说明
mysqld没启动,或配置了skip-networking = ON - 理想结果是看到
*:3306或0.0.0.0:3306(IPv4)或[::]:3306(IPv6)
bind-address = 127.0.0.1 是硬拦截,不是权限问题
这是最常被误判的一点:错误提示 Can't connect to MySQL server 不是认证失败,而是连接被操作系统直接拒绝——因为 mysqld 根本没注册监听外部 IP 的 socket。
检查配置文件(/etc/mysql/mysql.conf.d/mysqld.cnf、/etc/my.cnf 或宝塔的 /www/server/mysql/etc/my.cnf),确认 [mysqld] 下有:
-
bind-address = 0.0.0.0(允许所有 IPv4 地址) - 或明确写成服务器实际网卡 IP,比如
bind-address = 192.168.1.100 - 不要留空、不要写成
localhost、不要带多余空格(bind-address= 127.0.0.1会失效) - 顺手确认
skip-networking是否被注释掉(前面有#)
改完必须重启:systemctl restart mysql(Debian/Ubuntu)或 systemctl restart mysqld(CentOS/RHEL),reload 不生效。
防火墙和云安全组是两道独立关卡,缺一不可
即使 mysqld 监听了 0.0.0.0:3306,请求也可能在到达进程前就被丢弃。现象通常是 telnet your-ip 3306 超时,而不是 “Connection refused”。
- Linux 系统防火墙:
firewall-cmd --query-port=3306/tcp(firewalld)或ufw status(Ubuntu) - 云服务器(阿里云/腾讯云/UCloud):必须进控制台 → 安全组 → 入方向规则 → 添加 TCP:3306,来源 IP 建议设为具体办公 IP,而非
0.0.0.0/0 - 宝塔面板:自带防火墙也要放行 3306(面板后台 → 安全 → 放行端口)
- Windows 防火墙:检查“公用网络”配置是否启用,仅关闭“专用网络”防火墙不够
用户 host 权限和 MySQL 8+ 认证插件容易漏查
网络层通了,mysqld 也收到了包,但还是连不上?那大概率卡在权限校验环节。
登录 MySQL 后执行:SELECT User, Host FROM mysql.user WHERE User = 'your_user';
- 如果
Host是localhost,该用户只能从本机 socket 或 127.0.0.1 连接,远程 IP 会被直接拒绝 - 授权必须显式指定 host:
CREATE USER 'myuser'@'%' IDENTIFIED BY 'pass'; GRANT ALL ON *.* TO 'myuser'@'%'; FLUSH PRIVILEGES; - MySQL 8.0+ 默认用
caching_sha2_password插件,某些客户端不兼容;可临时切回:ALTER USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; - 已有
@'localhost'用户不能直接改Host字段,必须先DROP USER 'myuser'@'localhost';再重建
真正卡住的地方往往不是单一配置,而是 bind-address、防火墙、用户 host、认证插件这四层中任意一层没对齐——尤其注意 FLUSH PRIVILEGES 和 systemctl restart 这两个动作,漏掉任何一个,前面都白调。


















