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

标签 c# sql sql-server

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

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

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

当手动运行服务时(通过 net startservices.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/

相关文章:

c# - 获取 Telerik RadGrid 的行

php - foreach 循环中变量前面的文本

mysql - 在 WHERE 条件下划分 sql

mysql - Rails/SQL - 从连接查询中排除对象

sql - 实际上我正在开发一个 vb .net 桌面应用程序,需要使用 .bak 恢复数据库 如何做到这一点?

c# - 通过控制台应用程序进行 UrlEncode?

c# - 使用实体方法的结果通过 lambda 表达式或 linq 查询进行过滤

c# - 与集合比较时确定添加和删除项目的最佳算法

SQL Server - 忽略始终为真的条件

sql-server - 当数据库名称不在 url 中时,Microsoft SQL JDBC Spring 启动配置不起作用