mysql局域网连接失败主因是bind-address默认为127.0.0.1、用户host未授权远程、防火墙拦截3306端口,需依次检查监听地址(ss -tlnp | grep :3306)、创建'username'@'192.168.x.%'用户并授权、放行对应网段防火墙规则。

局域网内多节点 MySQL 连接,本质不是“连不上”,而是默认配置拒绝远程访问 —— bind-address 绑定 127.0.0.1、用户权限未开放、防火墙拦截,三者占了 95% 的失败原因。
检查 MySQL 是否监听局域网地址
MySQL 默认只监听本地回环,其他机器发来的连接请求会被直接丢弃。必须确认它实际监听的是 0.0.0.0 或具体局域网 IP(如 192.168.31.36),而不是仅 127.0.0.1。
- 查当前监听地址:
ss -tlnp | grep :3306或netstat -tuln | grep :3306;若只看到127.0.0.1:3306,说明没放开 - 修改
/etc/mysql/my.cnf(或/etc/my.cnf)中的bind-address行:
→ 改为bind-address = 0.0.0.0(允许所有 IPv4 地址接入)
→ 或更安全地指定为本机局域网 IP,例如bind-address = 192.168.31.36 - 改完必须重启服务:
sudo systemctl restart mysql(Ubuntu/Debian)或sudo systemctl restart mysqld(CentOS/RHEL)
创建带 host 限定的远程用户
MySQL 用户是「用户名 + host」联合唯一标识的。'root'@'localhost' 和 'root'@'192.168.31.%' 是两个完全不同的账户,后者才允许从局域网其他机器登录。
- 登录本地 MySQL:
mysql -u root -p - 创建专用用户(不推荐直接开
root远程):CREATE USER 'appuser'@'192.168.31.%' IDENTIFIED BY 'strong_password'; - 授权(按需给最小权限):
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'appuser'@'192.168.31.%';FLUSH PRIVILEGES; - 验证:从另一台局域网机器执行
mysql -h 192.168.31.36 -u appuser -p,看是否能连上
确认防火墙放行 3306 端口
即使 MySQL 监听了正确地址、用户也建好了,Linux 防火墙(ufw 或 firewalld)仍可能把连接拦在系统层。
- Ubuntu/Debian(ufw):
sudo ufw status查状态sudo ufw allow from 192.168.31.0/24 to any port 3306(只允局域网段) - CentOS/RHEL(firewalld):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.31.0/24" port port="3306" protocol="tcp" accept'sudo firewall-cmd --reload - Windows 防火墙:需在“入站规则”中启用“MySQL”或手动新建规则放行 TCP 3306
连接时指定 host 和端口别写错
客户端连接命令或代码里写错 host、port、user,是最容易被忽略的低级错误。
- host 必须填目标 MySQL 所在机器的局域网 IP,不是
localhost或127.0.0.1(那会走本地 socket) - 确认端口是 MySQL 实际监听的端口(默认 3306,但多实例场景可能是 3307、3308 等)
- Python 示例:
mysql.connector.connect(host='192.168.31.36', port=3306, user='appuser', password='xxx', database='mydb') - 如果用 Docker 运行 MySQL,宿主机要连容器内 MySQL,host 应填宿主机网卡 IP,不是
localhost,也不是容器名(除非在同个自定义网络且用 DNS)
真正卡住的地方往往不是集群逻辑,而是 bind-address 没改、用户 host 写成 '%' 却忘了 flush privileges、或者防火墙规则加了但没 reload —— 这些细节一漏,就陷入“配置明明写了却连不上”的循环。











