凭证合法却调用sshtunnel.start()仍提示服务未启动、MySQL连接不可用如何解决
问题根因
- 上下文作用域错误:所有依赖SSH隧道的操作都必须放在
SSHTunnelForwarder的with代码块内部。你当前的游标创建、SQL执行逻辑都在with块外,with块执行完毕后会自动调用隧道关闭方法,本地端口绑定直接被释放,MySQL长连接依赖的隧道已不存在,自然抛出连接不可用的错误。 - 冗余的
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
相关产品推荐
相关产品推荐

