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

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. 断开系统1与系统2的网络连接
  2. 在系统1执行查询:
1> select * from dbo.spt_monitor
2> go
  1. 检查是否在设置的超时时间内返回连接错误提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:01:09