如何确定通信链接失败的根本原因:TCP提供程序:“指定的网络名称不再可用”?

27
这是我最新修改的问题。但是这一次,我试图遵循Oded在他的文章Getting good answers on StackOverflow中给出的建议。
我需要找出如何确定以下错误的根本原因:
通信链路失败 TCP提供程序:指定的网络名不再可用
在运行一组SSIS包时,我偶尔会看到此错误。当从以下选项之一运行一对多个包时,可能会发生此错误:
SQL Server代理作业 批处理文件 从BIDS调试模式
我看到的完整错误消息如下:
SSIS错误代码DTS_E_OLEDBERROR。发生了OLE DB错误。错误代码:0x80004005。 可用的OLE DB记录。来源:"Microsoft SQL Server Native Client 10.0" Hresult:0x80004005 描述:"通信链接失败"。 可用的OLE DB记录。来源:"Microsoft SQL Server Native Client 10.0" Hresult:0x80004005 描述:"TCP提供程序:指定的网络名称不再可用。"。
SSIS错误代码DTS_E_OLEDBERROR。发生了OLE DB错误。错误代码:0x80004005。 可用的OLE DB记录。来源:"Microsoft SQL Server Native Client 10.0" Hresult:0x80004005 描述:"TDS流中的协议错误"。 可用的OLE DB记录。来源:"Microsoft SQL Server Native Client 10.0" Hresult:0x80004005 描述:"通信链接失败"。 可用的OLE DB记录。来源:"Microsoft SQL Server Native Client 10.0" Hresult:0x80004005 描述:"TCP提供程序:现有连接被远程主机强制关闭。"。
这是我设计ETL过程的概述:
  • 两个服务器
  • 都是虚拟机
  • SSIS包在应用服务器上运行
  • SQL Server数据库位于数据库服务器上
我使用OLE DB连接管理器将应用服务器上的SSIS包与数据库服务器上的SQL Server数据库连接起来。
这些包作为文件系统部署在应用服务器上运行,而不是作为数据库部署在数据库服务器上运行。
主要原因是ETL与一组工具集成在一起,这些工具不在数据库服务器上并且驱动程序无法访问。这些工具包括Salesforce的Apex Data Loader和pgAdmin III。
到目前为止,我无法始终重现此错误。但是,以下是我观察到的情况:
  • 故障在正常营业时间更频繁发生
  • 故障在非营业时间更少发生
在一个星期五早上的大约两个小时内,我能够成功地在特定的包中复制出这个错误。
如果启用了一个大数据流之前的子包调用,则会在大数据流期间发生错误。
如果在前面的子包调用被禁用时,同一大数据流中未发生错误。
所涉及的子包会回调数据库以检索少量信息,用于电子邮件正文,然后发送电子邮件。
感觉可能超过了某些资源限制?
也许是连接限制?
我想知道应该使用哪些工具来确定错误的根本原因。
有关涉及的两个服务器的技术细节如下:

SQL Server和数据库服务器信息:
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 版权所有 (c) Microsoft Corporation 企业版 (64位) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)

SSIS信息:
Microsoft Visual Studio 2008版本9.0.30729.1 SP Microsoft .NET Framework版本3.5 SP1

应用程序服务器信息:
操作系统名称:Microsoft Windows Server 2008 R2 Standard 版本号:6.1.7601 Service Pack 1 Build 7601

我在网上研究了错误信息,并找到了这些,但在继续之前,我真的想得到专家的见解:

非常感谢您的帮助。

谢谢。

更新:

进一步测试表明,这不是“SSIS的事情”,因为在使用SQL Server Management Studio时也会看到相同的错误率。查询的复杂性并不会使错误更有可能发生。为了解决问题,我们尝试了一个修复方法(如下所示):

这是我们的第一次尝试。应用服务器和数据库服务器上的TCP Chimney现已禁用。测试显示,相同的错误以相同的速率发生。
那么接下来该怎么办呢?老实说我不确定。似乎还有一个好的选择:
- 应用服务器和数据库服务器SQL Server安装版本不完全匹配 - 应用服务器 = SQL Server 2008(SP1)- 10.0.2531.0(X64) - 数据库服务器 = SQL Server 2008 R2(SP1)- 10.50.2500.0(X64)
计划升级应用服务器上的SQL Server安装。这有点像碰运气,但此时此刻这似乎是最好的选择。我的大脑中有些东西告诉我,这可能通过修复硬件问题(我的意思是维修或更换)来解决,并且硬件和软件配置可能无法做任何事情。
然而,我仍然不确定如何确定根本原因。我仍然在想我应该使用哪些工具来诊断根本原因。

你解决了吗? - matcheek
@matcheek 感谢您的询问。很抱歉,目前还没有...虽然我尝试了一些东西并且出了点问题。您可以从我的失败中学习。我已经更新了问题的当前状态。 - Jon Jaussi
2
我以前曾经遇到并解决过这个错误。如果你正在连接到一个命名实例,请尝试通过更改连接字符串来使用端口号。此外,检查一下你的虚拟机或主机是否安装了任何负载监控软件,或者防止DDOS攻击的软件,这些软件可能会将你的会话断开以进行"保护"。 - Cesar Vega
在进行任何其他调查之前,我会首先将两个服务器升级到最新的可用SQL服务包。它们都比http://sqlserverbuilds.blogspot.com.au/落后了几个SP。为什么要继续使用已知已解决的错误的软件呢? - Mike Honey
你能解决这个问题吗,@santiago_jon? - cr0ss
显示剩余3条评论
6个回答

1
该错误信息表明连接被强制关闭。您还提到在运行许多作业时会出现此问题。很可能是网络防火墙的问题。您应该联系防火墙管理员研究日志,以查看防火墙是否关闭了连接。如果是这种情况,则存在两个潜在的解决方案:
  1. 向触发并导致连接关闭的任何防火墙规则添加异常。
  2. 停止同时运行太多作业。您应该考虑按顺序运行它们。这也遵循成为良好网络公民的理念。

刚刚解决了这个问题。这次不是生产环境,只需要简单地重启服务器就可以了。我已经请求了一次调查,如果他们发现了什么,我会告诉你的。不需要按顺序运行它,这很好。 - it3xl

1

曾经有这样一种情况。我们的防病毒软件没有响应。我们的支持团队对此进行了处理,但我不知道具体是什么处理方式。 - it3xl

0

可能的一个根本原因是我们最近遇到的活动目录成员计数。这将在其他方面影响Kerberos令牌的大小,从而影响SQL服务器登录步骤。

详细信息:

注意:我们在SQL服务器上观察到了错误日志条目,如下所示:

用于打开连接的登录数据包结构无效;连接已关闭。请联系客户端库的供应商。

在客户端上,我们观察到以下错误消息:

与服务器成功建立了连接,但在登录过程中发生了错误。(提供程序:TCP提供程序,错误:0 - 指定的网络名称不再可用。)(.Net SqlClient数据提供程序)

此问题仅影响某些AD用户,没有普遍的服务中断。

使用以下命令,我们确定了Active Directory的成员身份:

PS> $groups = (az ad user get-member-groups --id {user identifier} |ConvertFrom-Json -AsHashtable)
PS> $groups.Count
294   

或者我们也可以使用以下命令:

PS> $token = [System.Security.Principal.WindowsIdentity]::GetCurrent()
PS> $token.Groups.count
771

使用不同的提供程序连接服务器会产生不同的结果:

Microsoft ODBC Driver for SQL Server 版本 17.07.0002:

Data Source Name: SOME_NAME
Data Source Description:
Server: SQLSERVER.DOMAIN.COM
Database: CORE_DATABASE
Language: (Default)
Data Encryption: Yes
Trust Server Certificate: Yes
Multiple Active Result Sets(MARS): No
Mirror Server: 
Translate Character Data: Yes
Log Long Running Queries: No
Log Driver Statistics: No
Use Regional Settings: No
Use ANSI Quoted Identifiers: Yes
Use ANSI Null, Paddings and Warnings: Yes
Authentication: ActiveDirectoryIntegrated
-----------

Running connectivity tests...

Attempting connection
Connection established
Verifying option settings
INFO: Connection was encrypted without server certificate validation.
Disconnecting from server

TESTS COMPLETED SUCCESSFULLY!

Microsoft SQL Server本机客户端版本11.00.7462:


Data Source Name: SOME_NAME
Data Source Description: 
Server: SQLSERVER.DOMAIN.COM
Use Integrated Security: Yes
Database: (Default)
Language: (Default)
Data Encryption: No
Trust Server Certificate: No
Multiple Active Result Sets(MARS): No
Translate Character Data: Yes
Log Long Running Queries: No
Log Driver Statistics: No
Use Regional Settings: No
Use ANSI Quoted Identifiers: Yes
Use ANSI Null, Paddings and Warnings: Yes

-----------

Running connectivity tests...

Attempting connection
[Microsoft][SQL Server Native Client 11.0]TCP Provider: The specified network name is no longer available.

[Microsoft][SQL Server Native Client 11.0]Communication link failure

TESTS FAILED!

SQL Server - 无法配置:

enter image description here


0
  1. 首先,您尝试过在网卡上删除大型发送卸载设置吗?
  2. 第二点,如果您能重现错误,可以运行Wireshark来捕获数据包吗?
  3. 第三点,您尝试更改虚拟机中的vNIC了吗?某些型号可能会导致问题。(如果您使用vmxnet3,请尝试e1000等)
  4. 最后一点,它们之间是否有vSwitch,它们是否在同一台主机上,是否有物理交换机等等... 配置不良的交换机可能会丢弃流量,如果在主机内部相同的主机和相同的vSwitch,则是最好的测试,因为流量从未离开服务器。

0

看起来这个问题有多种原因。对我而言,问题是由于 SQL 文件太大,约为 150MiB。将其拆分成较小的文件对我有用。


请详细说明如何确定 SQL 文件 的大小是否过大。您观察到错误的使用情况是什么,您观察到的错误消息是什么? - minus one

-1
尝试使用ODBC而不是OLE DB连接数据库。

1
这如何帮助确定根本原因? - Heinzi
这个答案部分地表明了提供商的选择在这个问题中有一定的影响。 - minus one

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接