使用pymssql连接MS SQL Server时登录时断时续问题求助
解决pymssql连接MS SQL Server间歇性登录失败问题
问题概述
使用pymssql连接MS SQL Server时出现间歇性登录失败:有时可正常连接执行查询,有时抛出登录失败异常,核心错误信息如下:
pymssql._mssql.MSSQLDatabaseException: (18456, b"Login failed for user 'sa'.DB-Lib error message 20018, severity 14:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (***.***.***.***)\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (***.***.***.***)\n")
FreeTDS日志显示关键错误为msgno 18456: "Login failed for user 'sa'.",且系统无法找到FreeTDS配置文件。
排查与解决步骤
1. 补全FreeTDS配置文件
日志反复提示无法读取.freetds.conf或系统级配置文件,缺失固定配置会导致连接参数不稳定,建议手动创建:
- 在用户主目录创建
.freetds.conf,写入以下内容(替换占位符为实际信息):
[mssql_server] host = ***.***.***.*** port = 1433 tds version = 7.4 client charset = UTF-8 database = BlueChipDB_New encrypt = required login timeout = 30
- 修改pymssql连接代码,使用配置文件中的服务器别名:
import pymssql conn = pymssql.connect(server='mssql_server', user='sa', password='your_password')
2. 检查SQL Server登录限制
错误18456是SQL Server返回的登录失败信号,需在数据库端排查:
- 确认
sa账户已启用:打开SQL Server Management Studio,进入安全性 > 登录名 > sa > 属性 > 状态,确保“登录”选项为“启用” - 查看SQL Server错误日志:进入管理 > SQL Server日志,找到18456错误的
State值,对应具体原因:- State 8:密码错误(若间歇性出现,排除固定密码错误,需检查是否有密码变更或缓存问题)
- State 11/12:登录被拒绝(检查是否有IP地址限制、账户锁定)
- State 16:默认数据库无权限(确认
sa对BlueChipDB_New数据库有访问权限)
- 检查服务器防火墙:确保1433端口未被间歇性限流或阻断
3. 调整pymssql连接参数
在连接代码中添加以下参数,提升连接稳定性:
conn = pymssql.connect( server='***.***.***.***', user='sa', password='your_password', database='BlueChipDB_New', login_timeout=30, encrypt=True, pool=False # 临时禁用连接池排查问题 )
4. 排查网络稳定性
间歇性连接失败可能与网络波动有关:
- 在客户端执行
ping ***.***.***.*** -t(Windows)或ping -c 100 ***.***.***.***(Linux),检查是否有丢包 - 使用
telnet ***.***.***.*** 1433测试端口连通性,确认无间歇性断开 - 检查服务器端的负载均衡、防火墙是否有会话超时规则
5. 升级组件版本
当前使用FreeTDS 1.3.13,建议升级到最新稳定版,同时升级pymssql到最新版本,修复已知的连接兼容性问题
内容的提问来源于stack exchange,提问作者K M Jiaul Islam Jibon
相关产品推荐
相关产品推荐

