SQL Server ODBC驱动忽略连接超时属性问题求助
解决sqlcmd断网后超时失效的问题
为啥-t和-l参数没用?
-t(SQL_ATTR_QUERY_TIMEOUT)管的是查询已经发到服务器后,等待结果的超时。断网后查询根本送不到服务器,或者驱动收不到任何响应,这个参数自然不起作用。-l(SQL_ATTR_LOGIN_TIMEOUT)只在登录阶段生效,登录成功后就不再发挥作用,所以也解决不了后续断网的超时问题。
分系统搞定超时配置
1. Windows系统
Windows下的15秒超时是系统默认的TCP重传超时,可通过修改注册表调整:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 添加或修改以下DWORD值:
TcpMaxDataRetransmissions:默认是5次重传,改成2次可缩短超时时间TcpInitialRTT:默认3000毫秒(3秒),可改小至1000毫秒加快超时触发
- 重启系统使配置生效
另外也可以调整ODBC驱动的连接属性:
- 打开ODBC数据源管理器,找到对应的SQL Server数据源,点击「配置」
- 切换到「连接」选项卡,点击「高级」
- 设置「连接超时」和「查询超时」,同时勾选「启用保持活动」并设置短间隔,让驱动更快检测到连接断开
2. Unix/Linux系统
Unix默认不会主动检测断开的连接,需要调整系统TCP参数和ODBC驱动配置:
系统TCP层面配置
修改/etc/sysctl.conf文件,添加或调整以下参数:
# 无数据交互多久后发送保持连接探测包(单位:秒) net.ipv4.tcp_keepalive_time = 300 # 保持连接探测包的发送间隔(单位:秒) net.ipv4.tcp_keepalive_intvl = 30 # 几次探测失败后判定连接断开 net.ipv4.tcp_keepalive_probes = 3
执行sudo sysctl -p使配置生效。这样系统会在5分钟无数据交互后开始发送探测包,每30秒发一次,3次失败后判定连接断开。
ODBC驱动层面配置
修改ODBC配置文件(通常是/etc/odbc.ini或用户目录下的.odbc.ini),在对应的数据源配置中添加:
[你的MSSQL数据源名称] Driver = ODBC Driver 17 for SQL Server Server = <system2_ip_address> ... # 连接超时(单位:秒) ConnectTimeout = 7 # 查询超时(单位:秒) QueryTimeout = 7 # 启用TCP保持活动 KeepAlive = Yes
3. sqlcmd启动时的补充设置
启动sqlcmd时,可通过环境变量提前配置超时:
# Unix/Linux环境下 export SQLCMDQUERYTIMEOUT=7 export SQLCMDLOGINTIMEOUT=7 ./sqlcmd -S <system2_ip_address> -U myLogin -P myPassword
验证方法
- 断开系统1与系统2的网络连接
- 在系统1执行查询:
1> select * from dbo.spt_monitor 2> go
- 检查是否在设置的超时时间内返回连接错误提示
内容的提问来源于stack exchange,提问作者Miklos
相关产品推荐
相关产品推荐

