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

时间:2013-12-15 12:23:03

标签: c# sql sql-server

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

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

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

当手动运行服务(通过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)声称已准备就绪(状态=已启动)非常快(发出“net start”命令后约2-3秒)。不幸的是,热身(启动数据库,恢复和其他一些东西)发生稍后需要2分钟(120秒!!)。当然,它会在连接热情之前拒绝连接。

我最终做了

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

while循环中。

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

如果有人知道怎么做,请回答。

2 个答案:

答案 0 :(得分:1)

对我有用的唯一解决方案是不中继服务状态,只是重试每个~10秒连接到服务器。

答案 1 :(得分:1)

您可以使用上述方法连接到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')