在自动启动服务中连接到SQL Server失败,在手动启动时有效。 SQL Server尚未就绪,但服务已启动

TL; DR – MSSQL服务声称准备就绪(状态=已启动),但尚未准备就绪(请参阅下面的删除文本)

我有C#编写的Windows服务,它将自己安装为ServiceAccount.LocalSystem并在ServicesDependedOn指定MSSQLSERVER

现在我已经创建了MS SQL用户,授予它所有必要的权限和角色(包括所需数据库上的db_owner和Connect / Login权限)。

当手动运行服务时(通过net startservices.msc管理器),它可以正常工作,即它连接到数据库。 当我重新启动计算机时,该服务会抛出此exception:

 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(); } 

在一个循环中。

我讨厌这种解决方案,但找不到更清洁的东西。

如果有人知道如何正确地做,请回答。

对我有用的唯一解决方案是不中断服务状态,只是重试每个~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 */