2012-03-27 215 views
11

是的人,这是又一次。SQL Server:“连接已成功与服务器建立....现有连接被远程主机强制关闭。”

"A connection was successfully established with the server, but then an error occurred during the login process (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)"

对不起......我 Google'd这一点,我阅读在这个问题上其他StackOverflow的文章,我尝试各种建议,但没有任何工程。

下面是关于我们所看到的一些注意事项。

  1. 这个问题在SQL Server Management Studio中本身(在做任何类型的数据库活动......让数据库中的表的列表,在看看存储过程等)偶尔发生

  2. 它也发生在Visual Studio 2010中本身,当它试图从服务器的数据(例如创建.dbml文件时,等)

  3. 它有时也发生在我们的.Net(ASP ,WPF,Silverlight)应用。

  4. 我们的SQL Server 2005 & 2008服务器都是基于世界各地数据中心的虚拟机,我们有时会发现每个虚拟机都有这个错误。但大多数时候,他们都工作得很好。

  5. 当错误发生时,我们可以“重试”导致错误的原因,然后它会正常工作。

  6. 我们认为..如果我们在某特定城市的数据中心的IIS Web服务器,并在访问同一数据中心的SQL Server,那么我们看问题。

  7. 我们认为..如果我们连接到服务器并指定要使用的用户标识和密码,它比使用Active Directory认证更频繁地导致此错误。

把所有这一切放在一起,这听起来像我喜欢某种网络问题。
但任何人都可以建议寻找什么?

这不是我们的.Net应用程序中的一个错误,因为即使SQL Server Management Studio“跳闸”出现此错误。

这让我们感到莫名其妙。

+0

坏的网卡,或者也许2台网络上有相同IP的机器? – 2012-03-27 14:00:16

回答

1

它可能是任何数量的网络问题。任何阻止代码到达服务器的时间,即使是进行一个查询所需的几个毫秒。

它也可能是故障转移的结果。当我们从单个SQL Server转到群集环境时,我们会在故障转移期间看到这种情况。在这种情况下,它变成了我们的连接池。本质上,SQL群集有一个控制器和两个服务器。 A和B.

说我们的网络应用程序使用服务器A就好了,连接池在两端创建连接。服务器知道它,Web应用程序知道它。一旦集群故障转移到第二台服务器,Web应用程序就会知道连接,但服务器B不在,所以我们会收到错误消息。

问题是,任何可能导致网络问题的原因都可能是原因。 DOS服务器攻击,中间人攻击拦截和改变流量。有人在网线上跳线,而且在插孔中松动。你的名字,如果它可能导致连接问题,它可能是原因。

您的问题听起来就像我们最近所做的一样 - 我们也有一个虚拟环境,即根据需要将虚拟机从一台主机移到另一台主机进行负载平衡的软件。每隔一段时间,我们都会受到同样的错误轰炸。事实证明,其中一台主机上的网卡驱动程序存在问题,因此每当虚拟机移动到该特定主机时,都会发生错误。

这真的不是一个编程问题。这是一个环境问题,你需要训练有素的专业人士直接访问你的环境来研究和解决这个问题。

+1

也许你可以建议一些调试技术或软件来追踪其他环境中问题的根源? – mellamokb 2012-03-27 14:01:03

6

万一别人打这个问题上,我们终于找到了解决办法。

我们公司使用Riverbed软件压缩数据,当它在位置之间传递时,这会以某种方式导致某些连接丢失。

我们的IT专家发现了一个配置设置,最终解决了这个问题。

我相信有一个设置可以关闭SQL Server的压缩结果(或类似的东西)。这为我们解决了问题。

0

当我们为oracle打开dbconnection并将DBtype作为SQL传递给我们的数据库对象时,发生在我们的代码中。

1

我的问题是我无意中使用无线网络连接到我们的网络,因为以太网电缆有问题。在修复SQL Server之后,按照其他地方的建议运行Winsock重置...

1

我遇到了同样的问题,并且我们的应用程序与多个Azure SQL数据库接口。我相信(和你一样)我没有在C#代码中导致此问题的错误。我们通过简单的for循环解决了这个问题,其中包含额外的尝试,如果先前的尝试失败并尝试运行查询,则尝试再次尝试连接到Azure SQL。

大多数情况下,一切运行良好,但有时我们可以看到循环被踢入,第二次或第三次它正确执行没有下面提到的错误。之后,我们在日志文件中看到下面的所有不成功的尝试错误:

A connection was successfully established with the server, 
but then an error occurred during the login process. (provider: TCP 
Provider, error: 0 - An existing connection was forcibly closed by the 
remote host.) 

即使这是一个不太当时的漂亮的解决方案,它使我们能够无间断运行我们的应用程序。我知道你已经提到尝试再次连接(以引入一些连接失败容忍)解决了这个问题,不幸的是,这是我发现的唯一正确的解决方案。

我应该提到,我们已经尝试了很多调试策略来弄清楚这一点。现在,这一切都指向我们尝试连接的数据库的可用性,即:如果超过允许的数据库连接数,则会发生这种情况。 (或似乎在这个时候)

+0

这个错误也发生在我用SQL Azure上,但我真正的问题是我在调试时打开了太久的连接 - 让应用程序自然运行正常。可能只需要增加连接超时 - 'SqlConnection.ConnectionTimeout',而不是'CommandTimeout'。 – SliverNinja 2017-08-03 02:04:06

0

在我的情况 - 错误是微软的第一个建议: 客户端连接到一个不受支持的版本的SQL Server Native Client。

相关问题