使用普通用户账号通过Python连接公网IP的MySQL时出现连接超时错误
看起来你遇到了典型的MySQL公网连接超时问题,虽然已经调整了bind-address,但还有几个容易被忽略的关键环节,我帮你梳理下排查步骤:
检查MySQL用户的访问权限
你用localhost能正常连接,但公网IP不行,大概率是这个user账号只被允许从本地访问。你需要用拥有管理员权限的host账号登录MySQL,执行授权语句放开访问限制:GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'your_user_password' WITH GRANT OPTION; FLUSH PRIVILEGES;这里的
%代表允许所有IP访问这个账号,如果想更安全,可以把%替换成目标电脑的公网IP,限制仅该IP能连接。检查本地防火墙设置
就算MySQL配置对了,Windows防火墙(或者你装的第三方防火墙)可能会拦截3306端口的入站请求。你需要添加入站规则允许3306端口的TCP连接:- 打开Windows Defender防火墙,进入「高级设置」
- 新建入站规则,选择「端口」,协议选TCP,特定本地端口填3306
- 选择「允许连接」,一路下一步完成规则创建
检查路由器的端口转发设置
如果你的电脑在家庭/办公局域网里,你查到的公网IP其实是路由器的IP,不是你电脑的本地IP。这时候需要在路由器后台设置端口转发,把外部的3306端口请求转发到你电脑的本地IP上:- 先在cmd里执行
ipconfig,找到你电脑的本地IPv4地址(比如192.168.1.105) - 登录路由器管理后台(通常是192.168.1.1或192.168.0.1,看路由器底部的说明)
- 找到「端口转发」或「虚拟服务器」选项,添加规则:外部端口3306,内部IP填你电脑的本地IP,内部端口3306,协议选TCP
- 先在cmd里执行
验证公网端口的可访问性
可以先在本地用telnet测试公网IP的3306端口是否能通,cmd里执行:telnet 你的公网IP 3306如果连接失败,说明网络层面还是有阻塞,回到前面的步骤排查。另外要注意,有些运营商会封禁3306这类常用端口,要是遇到这种情况,可以把MySQL的端口改成非默认值(比如3307),然后同步更新防火墙、端口转发规则和Python代码里的端口参数。
别忘了重启MySQL服务
你修改了my.ini里的bind-address之后,有没有重启MySQL服务?这个配置只有重启后才会生效哦。可以在Windows的「服务」里找到MySQL服务,右键选择「重启」。
如果上面的步骤都试过还是不行,建议先从同局域网内的另一台电脑用user账号连接试试,先排除局域网内的连接问题,再排查公网层面的问题。
备注:内容来源于stack exchange,提问作者HorizonCrosser 128

