Python脚本通过SSH连接PythonAnywhere MySQL 8时无限挂起求助
解决Python脚本连接PythonAnywhere MySQL 8时无限挂起的问题
可能的原因及对应解决方案
1. 强制MySQL连接使用TCP协议
mysql-connector默认优先尝试Unix套接字连接,但SSH隧道是基于TCP转发的,需显式指定使用TCP:
修改数据库配置,将host设为127.0.0.1(避免localhost触发套接字优先逻辑),同时禁用套接字:
db_config = { 'user': '你的用户名', 'password': '你的密码', 'host': '127.0.0.1', 'database': '目标数据库名', 'port': 本地转发端口, 'unix_socket': None }
2. 添加连接超时参数
连接阶段可能因超时设置不合理导致挂起,添加超时参数强制中断并返回错误,便于排查:
db_config = { # 其他配置项... 'connection_timeout': 10, 'connect_timeout': 10 }
3. 调整SSH隧道端口绑定IP
部分SSH库默认将端口转发绑定到localhost,若本地环境有特殊网络配置,可临时改为绑定0.0.0.0测试(生产环境不推荐):
以paramiko为例,修改端口转发代码:
# 原代码 ssh_client.get_transport().open_channel('direct-tcpip', (远程MySQL主机, 远程MySQL端口), ('localhost', 本地端口)) # 修改后 ssh_client.get_transport().open_channel('direct-tcpip', (远程MySQL主机, 远程MySQL端口), ('0.0.0.0', 本地端口))
4. 替换MySQL客户端库
mysql-connector可能存在兼容性问题,换成pymysql尝试:
先安装依赖:pip install pymysql
修改连接代码:
import pymysql conn = pymysql.connect(**db_config)
5. 检查本地防火墙/安全软件
本地防火墙或安全软件可能拦截了127.0.0.1上的转发端口,临时关闭防火墙或添加出站规则允许该端口的TCP连接。
6. 启用调试日志定位问题
开启mysql-connector的调试日志,查看连接过程的具体挂起点:
import logging logging.basicConfig(level=logging.DEBUG)
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

