2012-03-27 213 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。

相關問題