クエリを実行して、データベースのステータスに関する重要な情報を取得できるようにしたいと考えています。つまり、データベースが良好な状態であるかどうかをクエリで通知できるようにしたいのです。
これは、このチェックのために継承したクエリです。
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)
そのクエリが結果を返す場合、データベースが疑わしい状態または潜在的に不良な状態にあると想定されています。
これを行うより良い方法はありますか?
SQL 2005+を使用していて、DBが「オンライン」状態でないDB名のみを返したい場合は、次のようにします。
SELECT
name
FROM sys.databases
WHERE state != 0;
ミラーリングまたはログ配布に参加しているデータベースはオンラインにならないか、状態が定期的に変化する可能性があることに注意してください。 sys.databases DMVの詳細については、こちらのドキュメントを参照してください。 http://msdn.Microsoft.com/en-us/library/ms178534.aspx
私は新しい sys.databases を使用します sydatabases ではありませんが、それ以外の場合はこれで問題ありません
特に、DATABASEPROPERTY呼び出しは必要ありません
SELECT
name, state_desc
FROM
sys.databases
WHERE
state IN (4, 5, 6)
私がデータベースのステータスを確認する方法は、次のように関数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で置き換えられます。
特定の条件を照会するのではなく、sys.databasesでstate_desc <> 'ONLINE'となるものを調べます。また、何をしようとしているかに応じて、has_dbaccessはいくつかの誤検知をスローする場合があります。
私はこれが好きです:
SELECT name, state_desc
FROM sys.databases
name state_desc
------------------------------- ----------------
master ONLINE
tempdb ONLINE
model ONLINE
msdb ONLINE
TestTableDatabase2005 RECOVERY_PENDING