使用mysql.connector连接局域网远程MySQL数据库失败的原因
咱们来拆解一下为什么换成局域网IP就触发这个2003错误,以及对应的解决办法:
首先看你的场景:用Python的mysql.connector连接本地MySQL完全正常,代码如下:
from __future__ import print_function import mysql.connector as kk cnx = kk.connect(user='root', password='password123', host='localhost', database='db') cursor = cnx.cursor(buffered=True) sql = "DELETE FROM examples WHERE id = 4" number_of_rows = cursor.execute(sql) cnx.commit() cnx.close()
但把host参数改成局域网内另一台服务器的IP后,就抛出了这个连接错误:
mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'xx.xxx.x.xx' (10060)
这个报错的核心是你的Python客户端无法和目标服务器上的MySQL服务建立TCP连接,常见原因有这几个:
MySQL服务仅监听本地IP
默认情况下,MySQL的配置文件(Linux系统通常是/etc/my.cnf或/etc/mysql/my.cnf,Windows是my.ini)里的bind-address参数会被设置为127.0.0.1,这意味着MySQL只接受来自本地的连接请求,局域网内其他机器根本无法访问。你需要把这个参数修改为0.0.0.0(允许所有IP访问)或者目标服务器的局域网IP,修改完成后记得重启MySQL服务才能生效。目标服务器防火墙拦截了3306端口
MySQL默认使用3306端口进行通信,如果目标服务器的防火墙(Windows防火墙、Linux的iptables/ufw等)没有开放这个端口给局域网内的机器,你的连接请求就会被直接拦截。你需要在防火墙中添加规则,允许来自局域网IP段的3306端口流量。比如Linux系统可以用ufw allow from 192.168.1.0/24 to any port 3306,Windows则在防火墙高级设置中添加入站规则,放行3306端口的TCP请求。MySQL用户没有远程访问权限
你使用的root用户可能仅被授权从localhost登录,没有权限从远程机器访问。登录目标服务器的MySQL,执行以下SQL语句进行授权(把xxx.xxx.xxx.%替换为你的局域网IP段,比如192.168.1.%):GRANT ALL PRIVILEGES ON db.* TO 'root'@'xxx.xxx.xxx.%' IDENTIFIED BY 'password123'; FLUSH PRIVILEGES;执行后,
root用户就能从局域网内的任意机器访问db数据库了。局域网网络本身存在连通问题
先排除网络层面的问题:在你的本地机器上ping目标服务器的IP,检查两台机器是否能正常通信;再用telnet xxx.xxx.xxx.xxx 3306或者nc -zv xxx.xxx.xxx.xxx 3306测试3306端口是否能连通。如果ping不通,说明两台机器不在同一个子网、路由器有访问限制等;如果ping通但端口无法连接,再回到前面的MySQL配置和防火墙设置排查。
内容的提问来源于stack exchange,提问作者Krishnakumar M

