SQL Server数据库何时准备好接受查询?


11

在SQL Server错误日志文件中,我找到了以下几行:

2018-02-22 14:10:58.95 spid17s     Starting up database 'msdb'.
2018-02-22 14:10:58.95 spid16s     Starting up database 'ReportServer'.
2018-02-22 14:10:58.95 spid18s     Starting up database 'ReportServerTempDB'.
2018-02-22 14:10:58.95 spid19s     Starting up database 'XYZ'.

如果在此之前我检查数据库XYZ的状态,则ONLINE使用以下语句:

SELECT state_desc FROM sys.databases WHERE name='XYZ'

...但是当我尝试使用C#应用程序连接到该数据库时,它无法连接到数据库。

错误是:

用户“ asd”的登录失败。
原因:无法打开显式指定的数据库。

我尝试了三种不同的用户(Windows用户,sa,为应用程序定义的SQL Server用户)。在操作系统启动时运行该应用程序时会发生问题,但是如果在启动后手动启动该应用程序,则不会发生任何错误,因此我认为所有SQL Server设置和防火墙设置都是正确的。

在此之前,我还检查了服务状态是否正在运行。

我还应该检查什么以确保数据库实际上已联机并且可以查询?

我正在寻找一个可以告诉我可以查询数据库的键,而不是延迟一段时间(即使不是基于明确的原因)。

我考虑过扫描错误日志中的文本“正在启动数据库XYZ”,但这意味着我必须为SQL Server错误日志的路径为应用程序添加一个设置。这也意味着要多次读取文件,直到找到该短语。

Answers:


23

SQL Server数据库已准备就绪,可以尽快接受查询:

SELECT DATABASEPROPERTYEX(N'database name', 'Collation')

不返回NULL

DATABASEPROPERTYEX(Transact-SQL)的文档中:

注意:ONLINE当数据库正在打开且尚未恢复时,状态可能会返回。要确定数据库何时可以接受连接,请查询的归类属性DATABASEPROPERTYEX。当数据库排序规则返回非空值时,数据库可以接受连接。对于Always On数据库,查询的database_statedatabase_state_descsys.dm_hadr_database_replica_states


3

SQL Server数据库已启动,但是随后它们需要分析事务日志以向前或向后滚动事务。如果事务长时间运行,则可能需要数毫秒到数小时(甚至数天!)的时间,这可能需要许多(想想成千上万)用户数据库或具有很多(想想成千上万)虚拟日志文件的数据库。

如果仅希望应用程序在恢复完成且数据库准备就绪时进入,请让应用程序重试其连接。

如果您希望该应用程序能够立即进入SQL Server,但可能尚无法运行任何查询,请将其默认数据库设置为TempDB,而不是用户数据库。即使用户数据库不可用,它也可能会立即在线。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.