使用 SQLCMD 实用工具时出现间歇性连接错误
本文可帮助你解决使用 SQLCMD 命令行工具时出现的间歇性连接“OS 错误 10054”问题。
错误
会收到以下警告和错误消息:
警告:proc_procname返回的 HResult 0x2746级别 16,状态 1
TCP 提供程序:远程主机强行关闭了现有连接。
SQLCMD.EXE: Sqlcmd: 错误: Microsoft SQL Server Native Client 10.0: 客户端无法建立连接
这些错误的一个可能原因是驱动程序不受支持。
要考虑的问题
查看以下方案以确定问题是否匹配:
收集网络跟踪并了解 TLS 1.0 和 1.1 已禁用,并且已启用 TLS 1.2。 在运行 SQL Server 的服务器上,应用程序服务器上启用了 TLS 1.0、1.1 和 1.2。
使用 Microsoft OLE DB Provider for SQL Server 和 SNAC 11 提供程序在应用程序服务器上运行 UDL 测试 。 连接失败。 你还会收到一条消息,指出“Microsoft OLE DB Provider for SQL Server”驱动程序已弃用,并且不支持 TLS 1.2。
应用程序服务器使用 SQL Server Native Client 11 成功测试 ODBC 数据源。 如果不支持 SQL Server Native Client 10.0,可能会收到以下错误消息:
连接失败,SQL 状态为“08001”SQL Server 错误:10054 [Microsoft][SQL Server Native Client 10.0]TCP 提供程序:远程主机强行关闭现有连接。 [Microsoft][SQL Server Native Client 10.0]客户端无法建立连接。
可能会显示此消息,因为应用程序服务器使用旧版 Diffie-Hellman 算法 (v1),SQL Server 使用较新版本 (v2)。 这种不匹配会导致间歇性 TLS 失败。
解决方法
若要解决这些问题,请执行以下步骤:
在连接字符串中指定 SQL Server Native Client 11。
注意
Microsoft不再支持 SNAC 11。 如果在使用 SNAC 11 时遇到任何问题,则必须升级到受支持的 Microsoft 驱动程序版本,然后才能提供技术支持。
将应用程序驱动程序升级到受支持的驱动程序。
如果不对连接使用加密,请使用 MSOLEDBSQL v18 或 ODBC v17。 如果对应用程序服务器上的连接使用加密,请使用 MSOLEDBSQL v19 或 ODBC v18。 默认情况下,这些驱动程序与加密一起包含在一起。 有关详细信息,请参阅以下文章: