监视SQL Server数据库状态的最佳查询是什么?


20

我希望能够运行查询以获取有关数据库状态的关键信息。即,我希望查询能够判断数据库是否处于良好状态。

这是我为此检查继承的查询:

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency],
  has_dbaccess(name) AS [HasDBAccess]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
   OR (has_dbaccess(name) = 0)

如果该查询返回任何结果,则假定数据库处于可疑状态或潜在的不良状态。

有一个更好的方法吗?


如果您有兴趣更深入的健康检查,你可能想要监控一些比较重要的WMI性能计数器,如死锁,磁盘IO等待时间,每秒事务等

@RQDC-如果您要使用SQL Server 2008,则可能更容易设置Management Datawarehouse。

@brett rogers-“最佳/良好”被认为是主观问题。请重新措辞。
CoderHawk 2011年

请提供有关重新措词的建议,我很乐意考虑。我正在寻找“最佳实践”中的“最佳”。似乎是对我说出它的正确方法。
布雷特·罗杰斯

@brett-好!很高兴您获得了“最佳” :)
CoderHawk 2011年

Answers:


12

如果您使用的是SQL 2005+,并且只想返回数据库未处于“联机”状态的数据库名称,则可以使用以下方法:

SELECT
    name
FROM sys.databases
WHERE state != 0;

请记住,参与镜像或日志传送的数据库将不会在线或可能会定期更改状态。有关sys.databases DMV的更多信息,请参见此处的文档:http : //msdn.microsoft.com/zh-cn/library/ms178534.aspx


9

我会使用较新的sys.databases而不是sydatabases,但是这样就可以了

尤其重要的是,您不需要DATABASEPROPERTY调用

SELECT
   name, state_desc
FROM
   sys.databases
WHERE
   state IN (4, 5, 6)

2

我发现查看数据库状态的方法是使用函数DATABASEPROPERTYEX(database,property),如下所示:

SELECT DATABASEPROPERTYEX('AdventureWorks','Status')。

这些状态很容易说明:

ONLINE =数据库可供查询。

OFFLINE =数据库已显式脱机。

RESTORING =正在还原数据库。

RECOVERING =数据库正在恢复,尚未准备好进行查询。

可疑=数据库未恢复。

紧急=数据库处于紧急只读状态。访问仅限于sysadmin成员

Ola Hallengren的博客(SQL MVP)中,在他用来验证数据库完整性的工具中,我发现他正在使用sys.database_recovery_status视图查询数据库状态。如果数据库在此视图中有一行,则它处于活动状态,如果没有,则处于脱机状态。

PS:您使用的databaseproperty函数将在将来的版本中删除,因此databasepropertyex将替换它。


我认为询问者不是在寻找特定的恢复信息,而是在查询一般的健康状况。假设您具有足够的特权来查看脱机数据库,则sys.databases是查找db状态的最佳位置。如果不在sys.databases中,则将其删除或分离。
AndrewSQL 2011年

1
是的,我知道您的意思,但是我说他只是在检查该视图中是否存在数据库,如果可以,则将数据库视为可访问,否则,他将数据库视为不可访问。因此,这可能是第二次检查:)。对我而言,良好的启动运行状况检查将是查询该数据库中的任何单个小表,如果该查询返回任何数据,我将认为该数据库是一目了然的。
玛丽安

2

除了查询特定条件外,我还将查看sys.databases中state_desc <>'ONLINE'的所有内容。另外,取决于您要执行的操作,has_dbaccess可能会抛出一些误报。


0

我喜欢这一个:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
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.