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)

そのクエリが結果を返す場合、データベースが疑わしい状態または潜在的に悪い状態にあるという仮定が行われます。

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


あなたがより多くの深さのヘルスチェックに興味があるなら、あなたはなど、デッドロック、ディスクIO待ち時間、秒あたりのトランザクション数、など、より重要なWMIパフォーマンスカウンタの一部を監視することをお勧めします

@RQDC-SQL Server 2008を使用している場合は、おそらく管理データウェアハウスのセットアップが簡単です。

@brett rogers-「Best / Good」は主観的な質問と見なされます。言い直してください。
CoderHawk

言い換える方法についての提案を提供してください。喜んで検討します。「ベストプラクティス」のように「ベスト」を探しています。私にそれを表現する適切な方法のようです。
ブレットロジャース

@brett-まあ!「最高」になったことを嬉しく思います:)
CoderHawk

回答:


12

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

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

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


9

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

特に、DATABASEPROPERTY呼び出しは不要です。

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

2

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

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

ステータスは自明です:

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

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

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

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

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

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

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

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


質問者が特定の回復情報を探しているのではなく、一般的なヘルスチェックのクエリを探していると思います。sys.databasesは、オフラインデータベースを表示するのに十分な権限で実行していると仮定して、dbステータスを見つけるのに適した場所です。sys.databasesにない場合は、削除または分離されます。
AndrewSQL

1
はい、私はあなたの意味を知っていますが、彼はデータベースがそのビューに存在するかどうかをチェックし、そうであればデータベースをアクセス可能として扱い、そうでない場合はアクセス不能として扱いましたと言いました。したがって、これは2回目のチェックになります:)。私にとって、良い開始ヘルスチェックは、そのデータベースから単一の小さなテーブルをクエリすることであり、そのクエリがデータを返す場合、一目でデータベースにアクセスできると考えます。
マリアン

2

特定の条件を照会するのではなく、state.desc <> 'ONLINE'であるsys.databasesのすべてを調べます。また、実行する内容によっては、has_dbaccessがいくつかの誤検知をスローする場合があります。


0

私はこれが好きです:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.