SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

DBCC WRITEPAGE を使用したダイレクトなページの書き換え

leave a comment

通常は使う機会はないのですが、DB が破損した場合のテストをしたい場合などに便利ですので書いてみたいと思います。
本番環境では絶対に使わないほうがよいと思います。

詳細については DBCC WRITEPAGE: an introduction の記事がとても参考になります。

SQL Server ではページ単位にチェックサムを持っており、ページ内のデータとチェックサムに不整合があるとエラーとなります。

破損しているページにアクセスすると以下のようなエラーが出力されます。

メッセージ 824、レベル 24、状態 2、行 1
SQL Server で、一貫性に基づいた論理 I/O エラーが検出されました: 正しくないチェックサム (必要なチェックサム: 0x06ce2d5a、実際のチェックサム: 0x06c1ad5a)。このエラーは、ファイル ‘E:tpcTEST.mdf’ のオフセット 0x0000000014a000 にあるデータベース ID が 6 のページ (1:165) の 読み取り 中に発生しました。SQL Server エラー ログまたはシステム イベント ログ内の別のメッセージで詳細情報が報告されることもあります。このエラー状態は深刻で、データベースの整合性を損なう可能性があるので、すぐに解決する必要があります。完全なデータベース一貫性確認 (DBCC CHECKDB) を実行してください。このエラーには多くの要因があります。詳細については、SQL Server オンライン ブックを参照してください。

上記のエラーの場合は、特定のデータベースのファイル 1 のページ 165 のチェックサムに不整合があるというエラーになります。
ページの破損は該当のページにアクセスがされないとわからないため、これをメンテナンスの観点から実施するために DBCC CHECKDB のようなメンテナンス系のコマンドが用意されています。

私もこれまで、デモ等でページの破損をお見せしたことがあったのですが、その際にはバイナリエディタを使用してページの内容を書きかえチェックサムの不整合を起こしていました。

このデモを実施する際に DBCC WRITEPAGE を使用することでクエリのみでチェックサムの不整合を発生させることができるようになります。

DBCC WRITEPAGE は通常の DBCC HELP ではヘルプを見ることができませんので、トレースフラグを操作してからヘルプを表示することでンコマンドの形式を確認することができます。

DBCC TRACEON(2588) WITH NO_INFOMSGS
DBCC HELP('WRITEPAGE') WITH NO_INFOMSGS
DBCC TRACEOFF(2588) WITH NO_INFOMSGS

dbcc WRITEPAGE ({‘dbname’ | dbid}, fileid, pageid, offset, length, data [, directORbufferpool])

 

実行の結果が上記になります。

DBCC WRITEPAGE では特定のデータベースの特定のファイルの特定のページの特定のオフセットのデータをピンポイントで書き替えることができます。

細かなオプションについては、冒頭で紹介した記事を見ていただくと解説されていますので、今回は実行の例のみを書いておきたいと思います。

実行時には以下のようなクエリを使用します。

ALTER DATABASE TEST SET SINGLE_USER
DBCC WRITEPAGE ('TEST', 1, 179, 1, 1, 0x00, 1)
ALTER DATABASE TEST SET MULTI_USER

 

DBCC WRITEPAGE による、ページの書き換えはデータベースをシングルユーザーモードにする必要があるようなので、実行前にモードを切り替えています。

そのあとにページの情報を書きかえ、マルチユーザーモードの戻すという処理を実行しています。

今回はオフセット 1 ですので、ページヘッダーを書きかえていることになるはずです。

# 先頭 96 まではぺ次ヘッダーになるはずですので。

これによりページが破損した状態を再現できますので、

  • DBCC CHECKDB の REPAIR_ALLOW_DATA_LOSS  等の修復系のコマンドの確認
  • ページ番号を指定してのリストア
  • ミラーリングや AlwaysOn 可用性グループのページ自動修復
  • msdb.dbo.suspect_pages のエラーページ検出

というようなページ破損時の挙動を確認することができます。

このページ破損のデモですが、データストアの内部構造との関わりも深いものになります。

今週末に開催されます、MVP Community Camp 2014 の私のセッションでもデモができればなと考えています。

MVP Community Camp 2014 は 全国各地 で開催され、私が登壇させていただく東京の会場だけでも たくさんのセッション が用意されています。

連休の中日での開催ではありますが、お時間のあります方がいらっしゃいましたらご参加いただけると幸いです。

Share

Written by Masayuki.Ozawa

3月 18th, 2014 at 8:29 am

Posted in SQL Server

Tagged with

Leave a Reply