簡體   English   中英

在自動啟動服務中連接到SQL Server失敗,在手動啟動時有效。 SQL Server尚未就緒,但服務已啟動

[英]Connecting to SQL Server fails in autostart service, works when starting manually. SQL Server not ready, yet service is started

TL; DR - MSSQL服務聲稱准備就緒(狀態=已啟動),但尚未准備好(請參閱下面的刪除文本)

我有C#編寫的Windows服務,它將自己安裝為ServiceAccount.LocalSystem並在ServicesDependedOn指定MSSQLSERVER

現在我創建了MS SQL用戶,授予它所有必要的權限和角色(包括所需數據庫上的db_owner和Connect / Login權限)。

當手動運行服務時(通過net startservices.msc管理器),它可以正常工作,即它連接到數據庫。 當我重新啟動計算機時,該服務會拋出此異常:

 Cannot open database "xxxx" requested by the login. The login failed. Login failed for user 'xxxxx'. 

我配置錯誤了什么? 再次,當我手動運行服務時,它工作正常!! 我也嘗試通過MS SQL Management Studio登錄此帳戶 - 這也有效。


正如評論中所建議的那樣,我在嘗試連接之前嘗試過等待 - 20秒睡眠無法解決問題。 我將MSSQLSERVER服務的狀態(通過ServiceController檢查)添加到日志中,它是“正在運行”。 一切似乎都很好,除了在自動啟動服務時登錄失敗

好的,我已經跟蹤了幾個小時了。 這是我發現的:

SQL Server服務(MSSQLSERVER) 聲稱已經准備就緒 (status = Started)(發出“net start”命令后大約2-3秒)。 不幸的是,預熱(啟動數據庫,恢復和其他一些東西)會在以后 發生,最多需要2分鍾 (120秒!!)。 當然,它會在熱身之前拒絕連接。

我結束了

 try { connect; } catch { RequestAdditionalTime(); // to avoid Windows Service timeout Sleep(); } 

while循環。

我討厭這種解決方案,但找不到更清潔的東西。

如果有人知道如何正確地做,請回答。

對我有用的唯一解決方案是不中繼服務狀態,只是重試每個~10秒連接到服務器。

您可以使用上述方法連接到master並調用以下方法

 select state, databases.state_desc ,* from sys.databases /* 0 = ONLINE 1 = RESTORING 2 = RECOVERING SQL Server 2008 through SQL Server 2014 3 = RECOVERY_PENDING SQL Server 2008 through SQL Server 2014 4 = SUSPECT 5 = EMERGENCY SQL Server 2008 through SQL Server 2014 6 = OFFLINE SQL Server 2008 through SQL Server 2014 7 = COPYING Azure SQL Database 10 = OFFLINE_SECONDARY Azure SQL Database */ 

或者另一種方法是調用以下檢查非NULL值,注意這應該返回NULL,除非數據庫完全就緒。

SELECT DATABASEPROPERTYEX('MyDatabaseName','Collat​​ion')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM