SQL Server 2008 R2 連線有時會因「登入不正確」而失敗

SQL Server 2008 R2 連線有時會因「登入不正確」而失敗

作為我們測試套件的一部分,除了模擬所有內容並且不需要資料庫連接的單元測試之外,我們還有需要資料庫的整合測試。

整合測試是必需的,因為我們正在使用大量遺留程式碼,它為我們提供了執行高級測試的可能性。

設定

此資料庫是 SQL Server 2008 R2,在具有所有最新 Windows 更新的 Windows Server 2008 R2 系統上執行。適用於作業系統和 SQL Server。

運行資料庫伺服器的虛擬機器是我們建置基礎架構的一部分,當然是基於映像在每天早上 6 點新創建的,並在晚上 10 點銷毀。所以我知道SQL Server代理程式和服務本質上是新的並開始每天。第一次建造發生在上午 7 點,這為機器提供了充足的時間來啟動和加載所有服務。

資料庫伺服器配置為允許無限數量的連接,並啟用命名管道和 TCP 連接。

與資料庫的連接是透過用戶。

我們有生產資料庫的精簡快照,中密度纖維板,其中包含執行測試所需的所有資料表、視圖、預存程序和最小資料集。

當整合測試運行時,測試設定會複製中密度纖維板到我們的 SQL Server 安裝的 DATA 資料夾中b.中密度纖維板。然後使用以下命令將 b.mdf 連接到資料庫:

CREATE DATABASE Foo ON (FILENAME = N'Path\To\b.mdf') FOR ATTACH

測試運行,執行資料庫操作,並且在測試夾具的測試拆卸中,資料庫被分離並刪除 b.mdf 檔案。

單獨執行以下兩個命令來執行分離:

ALTER DATABASE Foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE
EXEC master.dbo.sp_detach_db @dbname = N'Foo'

因此,在實踐中,我有一組具有以下佈局的測試裝置:

Setup();
Test_1();
Test_2();
Test_3();
TearDown();

每個安裝程式都會建立一個新資料庫,執行所有測試,然後刪除資料庫,以便下一個文字固定裝置以乾淨、新鮮的資料庫開始。

我總共有大約 50 個文字裝置,每個裝置包含 10 個測試。因此,資料庫連接和分離次數為 50 次,並且運行了大約 500 次測試。

問題

在過去的幾周里,我發現與整合測試相關的失敗建置數量有所增加。我知道我的測試沒問題,因為整個設定在我的本機電腦以及其他開發人員的電腦上運作得很好。只是建立伺服器報告了問題:

SetUp Error : Namespace.Class.Method
SetUp : System.Data.SqlClient.SqlException : Cannot open database "Foo"    requested by the login. The login failed.
Login failed for user 'sa'.

顯然,我用谷歌搜尋了一下,是的,登入是正確的。我知道這一點,因為失敗的測試並不總是相同。如果我運行整個測試套件 10 次,那麼 10 次中有 8 次會失敗,但每次報告失敗的測試都不同。錯誤訊息是一樣的,說無法登錄,有時也報告說管道的另一端沒有進程

我還檢查了命名管道和 TCP 連接是否已啟用,檢查了允許的連接數,...我檢查了 ERRORLOG 文件,但它不包含與我的資料庫直接相關的任何內容。

我的猜測是,由於某種奇怪的原因,它突然變快或變慢,並且它無法正確附加或分離資料庫,或者是SINGLE_USER導致問題的呼叫。根據我收集的信息,如果一項測試因登入而失敗,則無法刪除 b.mdf 文件,因為該文件似乎正在使用中。

所以我的問題是:還有什麼我可以嘗試的嗎?是否有錯誤日誌檔案或特定訊息可以為我提供更多見解?我可以做些什麼來檢查連接和分離是否成功嗎? (是否有可能是分離失敗導致登入問題?)分離操作是否非同步,因此是否有可能在下次呼叫時尚未完成?

答案1

第一個問題:登入失敗錯誤。
測試運行時,您的資料庫很可能尚未完全初始化。
您應該在程式中捕獲這一點,一種簡單的方法是查詢主資料庫以查看目標資料庫是否已啟動並正在運行。

IF (select name from sys.databases
where name = 'foo' and state_desc = 'ONLINE' and is_in_standby = '0') IS NOT NULL
PRINT 'database not found';

第二個問題:管道的另一端沒有流程。
如果您不透過 TCP/IP 連接,則實際上背後的錯誤通常會被掩蓋。
您可以嘗試啟用直接 IP 連接,或者您可以關注其他錯誤,它們很可能是導致此錯誤的原因。

相關內容