SQL Server:“已成功与服务器建立连接....现有连接被远程主机强行关闭。”

时间:2012-03-27 13:53:58

标签: sql-server

是的伙计们,这又是一次。

  

“已成功与服务器建立连接,但随后   登录过程中发生错误(提供程序:TCP提供程序,   错误:0 - 远程强制关闭现有连接   主机。)“

对不起......我已经谷歌了,我 阅读了有关此问题的其他StackOverflow文章,我已经

以下是关于我们所看到的内容的一些注释。

  1. 此问题偶尔发生在 SQL Server Management Studio 本身(执行任何类型的数据库活动...获取数据库中的表列表,查看存储过程,等)

  2. 当它试图从服务器获取数据时(例如,在创建.dbml文件时等) Visual Studio 2010 本身也会发生这种情况

  3. 有时也会出现在我们的.Net(ASP,WPF,Silverlight)应用程序中。

  4. 我们的SQL Server 2005& 2008服务器都基于全球数据中心的虚拟机,我们有时会看到每个服务器都出现此错误。但大多数时候,他们都工作得非常好。

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

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

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

  8. 把所有这些放在一起,听起来像某种网络问题 但是,有人可以建议寻找什么吗?

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

    令我们感到困惑。

12 个答案:

答案 0 :(得分:6)

万一其他人遇到这个问题,我们终于找到了解决方案。

我们公司使用 Riverbed 软件来压缩数据,当它们在不同位置之间传递时,这会导致某些连接被丢弃。

我们的IT大师找到了一个配置设置,最终解决了这个问题。

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

答案 1 :(得分:2)

可能是任何数量的网络问题。任何阻止代码到达服务器的东西,即使是在几分钟内进行一次查询也是如此。

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

假设我们的网络应用正在使用服务器A,连接池会在两端创建连接。服务器知道它,并且Web应用程序知道它。一旦集群故障转移到第二台服务器,Web应用程序就会知道连接但服务器B没有,所以我们收到错误。

关键是,任何可能的网络问题可能是导致问题的原因。 DOS攻击服务器,中间人攻击拦截和改变流量。有人用以太网电缆绊倒,它在插孔中松动。您可以命名,如果它可能导致连接问题,则可能是原因。

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

这真的不是编程问题。这是一个环境问题,您需要经过培训的专业人员直接访问您的环境以进行研究和解决。

答案 2 :(得分:2)

我遇到了同样的问题,我们的应用程序与几个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.)

尽管这是不那么漂亮的解决方案,但它允许我们在不中断的情况下运行我们的应用程序。我知道你已经提到再次尝试连接(引入一些连接失败容忍度)解决了这个问题,不幸的是,这是我迄今为止找到的唯一正确的解决方案。

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

答案 3 :(得分:1)

请检查那里,它可能会有所帮助..

Troubleshooting: Connection Forcibly Closed

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

在我们的情况下,将sql server更新为sp3时出现此错误。我们无法从SSIS包连接到数据库。

我们更新了本机客户端和配置。我们能够连接。

链接以下载本机客户端-https://www.microsoft.com/en-us/download/confirmation.aspx?id=50402

链接以获取配置设置和进一步的故障排除-https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms187005(v=sql.105)

希望有帮助。

干杯!

答案 8 :(得分:0)

发生了相同类型的问题。就我而言,这有点复杂...我可以通过SSMS从“ ServerB”连接到“ ServerA”,但是使用sqlcmd失败。错误是相同的:

Sqlcmd:错误:Microsoft SQL Server本机客户端11.0:TCP提供程序:现有连接被远程主机强行关闭。

我也可以从“ ServerC”使用SSMS和sqlcmd进行连接。以下是虚拟机上的版本:

ServerA: Microsoft Windows Server 2012 R2 Datacenter / Microsoft SQL Server 2012 (SP3-CU10) (KB4025925) - 11.0.6607.3 (X64) 
ServerB: Microsoft Windows Server 2012 R2 Datacenter / Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
ServerC: Microsoft Windows Server 2012 R2 Datacenter / Microsoft SQL Server 2012 (SP3-CU10) (KB4025925) - 11.0.6607.3 (X64)

底线是“不受支持的版本”。我注意到ServerC和ServerB之间的“ sqlncli11.dll”不匹配,因此将其复制到System32文件夹中。在此之后,sqlcmd像一个魅力一样工作。下面是我的情况下的版本:

Failed:
FileVersion:      2011.0110.5058.00
ProductVersion:   11.0.5058.0

Worked:
FileVersion:      2011.0110.6607.03
ProductVersion:   11.0.6607.3

答案 9 :(得分:0)

我同时(在2台不同的机器上)在2个项目上工作,并且都使用SQL Server。

当我用1台计算机断开SQL连接时,errorMessage消失了。也许您也可以弄乱IP地址来解决问题。

答案 10 :(得分:0)

在我的情况下,我间歇地从连接到位于同一服务器机房中的SQL Server的.Net应用程序中看到此错误。原来,某些数据库已打开自动关闭功能,这导致服务器关闭了池中的连接。当应用程序尝试使用已关闭的池连接之一时,它将引发此错误,并且我在SQL Server上看到一条日志消息,指出它尝试连接的数据库正在启动。这些数据库现在已关闭自动关闭功能,此后再也没有看到该错误。

此外,自动关闭是SQL Express数据库的默认行为,它们最初是在测试期间在Express实例上创建的,然后才迁移到我们发现错误的生产服务器上。

答案 11 :(得分:0)

这个答案是为那些在 Azure Sql 服务器数据库中遇到这个问题的人准备的。

到达垫子池时发生

首先从连接字符串中删除 Persist Security Info=False 其次在 azure 门户中检查您的数据库计划并增加您的数据库计划的 PTU。