Shoeisha Technology Media

EnterpriseZine(エンタープライズジン)

EnterpriseZine(エンタープライズジン)

テーマ別に探す

データベース整合性チェックを助ける DBCC CHECKDB

2012/10/31 00:00

はじめまして。Premier Field Engineering 部の笹木です。SQL Server にはデータベースの整合性をチェックするための DBCC CHECKDB コマンド(以下 DBCC CHECKDB) があり、多くのシステムで定期実行されているのではないかと思います。メンテナンスプランを使えばGUIでも簡単に実行でき、問題の有無や破損しているページを報告してくれるDBCC CHECKDBですが、そのコマンド内でどのようなチェックを行っているかを意識することは少ないと思います。しかし、内部でどのような処理を行っているかを把握しておけば、納得感のある対処ができるかもしれません。今回は、データベースを守るためにひっそりとイイ仕事をしているDBCC CHECKDBに迫ってみたいと思います。

データの整合性を確保する

 データベースを運用する上で最も壊れやすいコンポーネントはディスクサブシステムだ(注1)、という言葉を何度か見聞きしたことがあります。頻繁なバックアップを行ったり、局所的な復旧を可能にしたりと壊れても問題を小さくする対処はできたとしても、データ自体の破損や整合性が合わない状態というのは長い年月データベースを運用していると、どうしても避けられない問題だと思います。

 しかも、データ整合性に何か問題が発生したとしても通常はデータ破損したタイミングで検知することはできず、そのデータを実際に使うタイミングで初めて問題があることが分かります。

 たとえば、毎年3月31日にしか実行されない年次バッチでのみ参照されるテーブルが存在し、且つそのテーブルデータが破損したとします。テーブルデータの破損が4月1日に発生した場合、約1年間そのテーブルはアクセスされないためデータ破損が起こったことが検知されません。そして、翌年の3月31日に年次バッチを実行して初めてデータ破損が発生していることに気付く、という不幸な状態に陥るかもしれません。

 上記はかなり極端な例ですが、もし定期的にデータの整合性をチェックしていたら、実際に年次バッチを実行する数か月も前から余裕を持って対処でき、業務処理が滞るのを避けられるかもしれません。そのため、「データ不整合を完全に発生させなくする」というのは現実的ではありませんが、「データ不整合が例え発生しても早期に発見し業務影響を最小限に抑える」というスタンスが重要であり、DBCC CHECKDBが大きな役割を果たします。

 (注1) ここでのディスクサブシステムとはストレージ製品のことだけを指しているのではなく、デバイスドライバやネットワーク、OSのファイルシステムも含みます。

DBCC CHECKDBコマンドは何を行っているのか

 DBCC CHECKDB はとても簡単なコマンドですが、内部ではデータベースの整合性を確保するためにとても多くのチェックを行っています。実行すると対象データベースに対する以下の処理が順に行われます。(注2)

  •  FILESTREAMに対するチェック
  •  DBCC CHECKALLOC 同等の処理
  •  不整合の修復 (修復オプションが指定されている場合)
  •  システムテーブルに対するチェック
  •  不整合の修復 (修復オプションが指定されている場合)
  •  テーブル、ビューに対する DBCC CHECKTABLE 同等の処理
  •  不整合の修復 (修復オプションが指定されている場合)
  •  SQL Server Service Broker に対するチェック
  •  DBCC CHECKCATALOG 同等の処理
  •  インデックス付きビューやXMLインデックスに対するチェック

 上記の通り、DBCC CHECKDBは実際にはDBCC CHECKALLOCや DBCC CHECKTABLEといった他の管理コマンドと同様のチェックを含んでいます。つまり、たくさんのコマンドを実行する替わりに1つのコマンドでマルッとデータベースの整合性を確保しようとするのがDBCC CHECKDBなのです。

 DBCC CHECKDBの実行結果は全ての処理が完了したタイミングで出力されるため途中経過は分かりませんが、動的管理ビュー sys.dm_exec_requests の 『command 列』を参照することで内部のどの処理を実行しているかを確認できます。以下は command 列に表示される値とどのような状態にあるかをまとめたものです。

 また、sys.dm_exec_requests ビューの『percent_complete列』を参照することで処理内での進行状況の目安にできます。例えば以下の場合、各テーブルの整合性チェックを行う処理(DBCC TABLE CHECK) が全体の約65% まで完了した状態であることが分かります。

 (注2) DBCC CHECKDBは SQL Server のバージョンによってチェックの内容に違いがある場合があります。この内容は SQL Server 2012 RTM を基にしています。

※この続きは、会員の方のみお読みいただけます(登録無料)。


著者プロフィール

  • 笹木幸一郎(ササキコウイチロウ)

    日本マイクロソフト株式会社 / Microsoft Corporation Global Black Belt Analytics Technology Lead   SQL Server を中心としたデータプラットフォーム製品のサポート経...

バックナンバー

連載:SQL Server 2012 Deep Dive

もっと読む

All contents copyright © 2007-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5