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

凭证合法却调用sshtunnel.start()仍提示服务未启动、MySQL连接不可用如何解决

问题根因
  1. 上下文作用域错误:所有依赖SSH隧道的操作都必须放在SSHTunnelForwarder的with代码块内部。你当前的游标创建、SQL执行逻辑都在with块外,with块执行完毕后会自动调用隧道关闭方法,本地端口绑定直接被释放,MySQL长连接依赖的隧道已不存在,自然抛出连接不可用的错误。
  2. 冗余的start()调用:SSHTunnelForwarder进入with上下文时会自动执行启动逻辑,不需要手动调用start(),多余调用在部分版本中可能引发状态判断异常。
修复后的代码示例
import mysql.connector
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
    ('192.168.0.1', 22),
    ssh_username='pi',
    ssh_password='*********',
    remote_bind_address=('localhost', 3306)
) as tunnel:
    # 上下文自动启动隧道,无需手动调用start()
    mydb = mysql.connector.connect(
        host="localhost",
        user='Mashu',
        password='*******',
        port=tunnel.local_bind_port,
        db='mysql'
    )
    # 所有数据库操作必须放在with块内部
    print(mydb)
    cur = mydb.cursor()
    cur.execute('USE mysql')
    cur.execute('SELECT * FROM user')
    # execute方法仅执行语句不返回结果,需调用fetch类方法获取查询数据
    print(cur.fetchall())
    # 操作完成后主动关闭资源
    cur.close()
    mydb.close()
额外排查点
  • 检查sshtunnel和mysql-connector-python版本兼容性,优先升级到最新稳定版:pip install --upgrade sshtunnel mysql-connector-python
  • 如果仍然抛出「Server is not started」错误,可以在创建隧道时添加参数local_bind_address=('127.0.0.1', 0)显式指定本地绑定地址,避免默认绑定到IPv6地址导致的访问异常
  • 确认远程MySQL服务允许localhost来源的Mashu账号登录,权限配置和密码无误

内容的提问来源于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:00:02