You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pymysql通过sshtunnel连接MySQL报WinError 10053错误求助

核心错误原因

你当前的代码存在缩进逻辑错误:SSHTunnelForwarder使用with上下文管理器管理生命周期,with块执行结束后会自动关闭SSH隧道,你把数据库连接后的cursor创建、SQL查询等逻辑全部写到了with块外部,此时SSH隧道已经被销毁,依赖隧道建立的MySQL连接自然会因为底层链路断开抛出连接终止错误。

修复方案

调整代码缩进,将所有数据库操作逻辑都放在with块内部,参考修正后的代码:

import pymysql
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(('192.168.0.x', 22), ssh_username='pi', ssh_password='*********', remote_bind_address=('localhost', 3306)) as tunnel:
    # 隧道启动后所有数据库操作都要在这个缩进层级内完成
    tunnel.start()
    mydb = pymysql.connect(
        host="localhost",
        user='Mashu',
        passwd='******',
        port=tunnel.local_bind_port,
        db='Special_Channels',
        connect_timeout=10 # 可选,增加连接超时配置避免偶发超时
    )
    print(mydb)
    # 连接存活时执行查询
    query = "SELECT * FROM Daily"
    cur = mydb.cursor()
    data = cur.execute(query)
    # 注意execute返回的是影响行数,要拿数据需要调用cur.fetchall()/fetchone()
    result = cur.fetchall()
    print(f"影响行数:{data},查询结果:{result}")
    # 用完主动关闭连接
    cur.close()
    mydb.close()

其他可选排查方向

如果调整缩进后仍有报错,可以排查以下点:

  • 检查本地防火墙、安全软件是否拦截了SSH隧道绑定的本地端口通信,WinError 10053通常伴随本地程序主动断连的场景
  • 可以在建立MySQL连接后先调用mydb.ping(reconnect=True)主动校验连接存活状态
  • 确认MySQL服务端的wait_timeout参数没有配置过短,导致连接空闲后被服务端主动回收

内容的提问来源于stack exchange,提问作者Moder New

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:12:01