web-dev-qa-db-ja.com

SQL Serverデータベースのステータスを監視するために使用するのに最適なクエリは何ですか?

クエリを実行して、データベースのステータスに関する重要な情報を取得できるようにしたいと考えています。つまり、データベースが良好な状態であるかどうかをクエリで通知できるようにしたいのです。

これは、このチェックのために継承したクエリです。

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)

そのクエリが結果を返す場合、データベースが疑わしい状態または潜在的に不良な状態にあると想定されています。

これを行うより良い方法はありますか?

21
brett rogers

SQL 2005+を使用していて、DBが「オンライン」状態でないDB名のみを返したい場合は、次のようにします。

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

ミラーリングまたはログ配布に参加しているデータベースはオンラインにならないか、状態が定期的に変化する可能性があることに注意してください。 sys.databases DMVの詳細については、こちらのドキュメントを参照してください。 http://msdn.Microsoft.com/en-us/library/ms178534.aspx

12
AndrewSQL

私は新しい sys.databases を使用します sydatabases ではありませんが、それ以外の場合はこれで問題ありません

特に、DATABASEPROPERTY呼び出しは必要ありません

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

私がデータベースのステータスを確認する方法は、次のように関数DATABASEPROPERTYEX(database、property)を使用することです。

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

ステータスはかなり自明です:

ONLINE =データベースはクエリに使用できます。

OFFLINE =データベースは明示的にオフラインにされました。

RESTORING =データベースを復元しています。

RECOVERING =データベースは回復中であり、まだクエリの準備ができていません。

SUSPECT =データベースは回復しませんでした。

EMERGENCY =データベースは緊急の読み取り専用状態です。アクセスはsysadminメンバーに制限されています

Ola Hallengrenのブログ (SQL MVP)で、データベースの整合性を確認する彼のツールで、sys.database_recovery_statusビューを使用してdbステータスを照会していることがわかりました。このビューにデータベースの行がある場合、それはライブでキックしており、そうでない場合はオフラインです。

PS:使用するdatabaseproperty関数は将来のバージョンで削除されるため、databasepropertyexで置き換えられます。

2
Marian

特定の条件を照会するのではなく、sys.databasesでstate_desc <> 'ONLINE'となるものを調べます。また、何をしようとしているかに応じて、has_dbaccessはいくつかの誤検知をスローする場合があります。

2
Ben Thul

私はこれが好きです:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
1
isxaker