![](/img/trans.png)
[英]SqlException when the database is not started but SQL Server is ready for connections
[英]Connecting to SQL Server fails in autostart service, works when starting manually. SQL Server not ready, yet service is started
我有C#編寫的Windows服務,它將自己安裝為 ServiceAccount.LocalSystem
並在ServicesDependedOn
指定MSSQLSERVER
。
現在我創建了MS SQL用戶,授予它所有必要的權限和角色(包括所需數據庫上的 db_owner
和Connect / Login權限)。
當手動運行服務時(通過 net start
或services.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','Collation')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.