DBCCページの自動化

2006年にPaul RandalがMICROSOFTのブログhttps://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspxでDBCCページを文書化しました。 彼の投稿では、DBCCページから画面に出力を返すには、最初にトレースフラグ3604を有効にする必要があることがわかります。 上記のブログ記事は、結果のいくつかの例を示し、さらなる行動のためにそれらを利用しています。 残念ながら、この方法では、さらに作業するためにページから必要なデータを取得するために手動で介入する必要があります。

あなたが知っている、手動介入を削除し、あなたが探しているタスクを完全に自動化することができれば、それは確かにいいでしょう。 このブログ記事では、これをどのように行うことができるかを紹介し、そのいくつかの例を示します。

前回のブログ記事では、いくつかのDBCCコマンドにオプションの設定を導入しました:TABLERESULTSを使用します。 これにより、出力が消費されるように、出力が表形式で返されます。 結局のところ、このオプション設定はDBCCページでも機能します。 これを確認するには、masterデータベースのデータベース情報ページ(9ページ)を調べます:

ソースコード
TABLERESULTSを使用したDBCCページ('master'、1、9、3);

traceフラグなしで実行できるこのステートメントは、ParentObject、Object、Field、VALUEの4つの列でページ上のデータを返します。 結局のところ、すべてのデータベースのこの特定のページには、興味深い情報がたくさんあります。 このページから特定の情報を取得するのを自動化しましょう:

ソースコード
オブジェクトID('tempdb.dbo...#DBCCPAGE')はNULLではありませんDROP TABLE#DBCCPAGE;CREATE TABLE#DBCCPAGE(ParentObject VARCHAR(255),VARCHAR(255),Field VARCHAR(255),VARCHAR(255));INSERT INTO#DBCCPAGEEXECUTE('DBCC PAGE("master",1,9,3)WITH TABLERESULTS;');SELECT LastGoodDBCCDate=CONVERT(DATETIME,VALUE)FROM#DBCCPAGEWHERE Field='dbi_DBCCLASTKNOWNGOOD';

この素晴らしいコードスニペットは、masterデータベースに対して最後に成功したDBCC CHECKDBが実行された時間を返します。 おっと…それはどのように甘いですか? CHECKDBジョブが失敗して、ジョブ履歴に失敗したエントリのみがあるという点までサーバーを検出すると、最後に正常に実行されてからどれだけの時間が

この作業を行うための”トリック”は、DBCCコマンドを文字列としてカプセル化し、EXECUTE()関数で呼び出すことです。 これは、INSERT INTO/EXECUTE文の一部として使用されるため、DBCCページからの結果が表に挿入されます(この場合、一時表が使用されますが、表変数または永続表も使用で このプロセスには3つの簡単な手順があります:

  1. 出力を保持するテーブル(永続的/一時的)またはテーブル変数を作成します。
  2. INSERT INTO/EXECUTEを使用して、DBCC PAGEステートメントの結果をこの表に挿入します。
  3. テーブルから探しているデータを選択します。

カーソルを使用すると、インスタンス上のすべてのデータベースを簡単に回転させて、最後にDBCC CHECKDBが正常に実行されたときに取得できます。 以下では、sp_msforeachdb(それ自体がカーソルを使用してすべてのデータベースを回転させます)を使用して、これだけを行います:

ソースコード
オブジェクトID('tempdb.dbo...#DBCCPAGE')はNULLではありませんDROP TABLE#DBCCPAGE;OBJECT_ID('tempdb.dbo...#CheckDBDates')はNULLドロップテーブルではありません#CheckDBDates;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));CREATE TABLE #CheckDBDates ( database_name sysname, LastCheckDB DATETIME); EXECUTE sp_MSforeachdb 'TRUNCATE TABLE #DBCCPAGE;INSERT INTO #DBCCPAGE EXECUTE (''DBCC PAGE (''''?'''', 1, 9, 3) WITH TABLERESULTS;'');INSERT INTO #CheckDBDatesSELECT ''?'', CONVERT(DATETIME, VALUE)FROM #DBCCPAGEWHERE Field = ''dbi_dbccLastKnownGood'';'; SELECT database_name, LastCheckDBFROM #CheckDBDates;

そして、ここでは、インスタンス上のすべてのデータベースと、DBCC CHECKDBが最後に正常に実行された日付があります–少なくともsp_msforeachdbがスキップしなかったデー要約すると、DBCCの”WITH TABLERESULTS”オプションを利用することで、これを処理するために手動で介入するのではなく、DBCC PAGEを使用するプロセスを自動化できます。

次のいくつかの記事では、DBCC出力を自動化するために”WITH TABLERESULTS”を使用する他の使用法を見ていきます。

コメントを残す

メールアドレスが公開されることはありません。