TL;DR - MSSQL 服务声称已准备就绪(状态 = 已启动),但实际上并未就绪(请参阅下面的删除线文本)
我有 C# 编写的 Windows 服务,它将自身安装为 ServiceAccount.LocalSystem
并在 ServicesDependedOn
中指定 MSSQLSERVER
。
现在我已经创建了 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 秒 sleep 并不能解决问题。我将 MSSQLSERVER 服务的状态(通过 ServiceController 检查)添加到日志中,它是“正在运行”。一切似乎都很好,除了服务自动启动时登录失败
好的,我已经追踪了几个小时了。 这是我发现的:
SQL Server 服务 (MSSQLSERVER) 声称准备就绪(状态 = 已启动)相当快(发出“网络启动”命令后大约 2-3 秒)。不幸的是,预热(启动数据库、恢复和其他一些东西)发生在稍后,并且最多需要 2 分钟(120 秒!!)。当然,在预热之前它会拒绝连接。
我已经完成了
try
{
connect;
} catch {
RequestAdditionalTime(); // to avoid Windows Service timeout
Sleep();
}
在 while
循环中。
我讨厌这种解决方案,但找不到更干净的解决方案。
如果有人知道如何正确地做到这一点,请回答。
最佳答案
唯一对我有用的解决方案是不中继服务状态,只是每隔约 10 秒重试一次以连接到服务器。
关于c# - 在自动启动服务中连接到 SQL Server 失败,在手动启动时有效。 SQL Server 未就绪,但服务已启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20594442/