SQL Server IsShutdown 属性对于确定数据库是否处于良好状态有用吗?

bre*_*ers 8 sql-server

我公司有一个工具可以监控服务器、服务、数据库等的状态。我们为我们的客户监控一些现场服务器。执行的一项特别简单的检查是通过查询某些数据库属性的值来确定 SQL Server 数据库是否处于“良好”状态。我们监控的四个数据库属性是:

  • 怀疑
  • 离线
  • 是紧急模式
  • 是关闭

这是我们使用的查询:

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  ISNULL(DATABASEPROPERTY(name, N'IsShutdown'), 1) AS [Shutdown],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (ISNULL(DATABASEPROPERTY(name, N'IsShutdown'), 1) = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
Run Code Online (Sandbox Code Playgroud)

在测试升级到 SQL Server 2008 时,我们的许多数据库似乎都为IsShutdown属性返回了 1(真)值。SQL Server 2005 以前从未出现过这种情况。该属性的MSDN 文档只是说明“数据库在启动时遇到问题”。

据我所知,数据库非常好。它们已启动,可以查询等。没问题。

是否IsShutdown财产真正的问题对我的监视目的,即,它表明该数据库是在一个糟糕的状态?或者我应该从我的查询中删除它?

注意:在与我们的一位常驻 DBA 交谈时,他们发现在我们的一些新 SQL Server 2008 数据库上,启用IsAutoClose属性的事实可能与这些数据库的IsShutdown为 true的原因有关。禁用IsAutoClose似乎“修复”了IsShutdown为真。

bre*_*ers 2

好吧,经过大量调查后,这是我的结论:

简短的故事: IsShutdown属性对于监视数据库的状态并不重要。即使设置为 True,数据库仍处于良好状态。

长话短说: MSDN对 IsShutdown 属性的定义不正确。上面写着:

  • 数据库在启动时遇到问题

考虑到属性的名称,该定义没有多大意义。实际上,IsShutdown 属性似乎与 IsAutoClose 属性直接相关。如果在不再有任何连接处于活动状态后“自动关闭”完全关闭了数据库,则 IsShutdown 将设置为 True。一旦数据库重新启动(可以这么说),IsShutdown 将设置回 False。

这个理论得到了 sys.databases 中有一个is_cleanly_shutdown列这一事实的支持。该列的值始终与 IsShutdown 的值相同,即它们是相同的。

该属性的错误定义可能是导致我继承此查询的开发人员将其包含在他的数据库状态检查中的原因。我现在已从查询中删除了对该属性的检查。