none
イベントID 824の原因がわからない RRS feed

  • 質問

  • ユーザのマシン(Windows embedded Standard 2009)にSQLServer Express 2008 R2をインストールして利用していたところ

    イベントID 824エラーが発生し、DBが利用できない状況になりました。 

    その際のSQLServerのログには下記のようなエラーが出ておりました。
    SQL Server detected a logical consistency-based I/O error: 正しくないページ ID (必要な ID 1:3433、実際の ID 43009:-1694376702). It occurred during a 読み取り of page (1:3433) in database ID 5 at offset 0x00000001ad2000 in file 'd:\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\TEST.mdf'.  Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

    バックアップから復旧を完了し、復旧後にハード的なエラーチェックを行ってみてもエラーが見当たりませんでした。
    しかしユーザーには今回の原因の説明をする必要があり、何かしら情報をお持ちの方はいらっしゃらないでしょうか?

    参考までにエラーが発生した際に取得したDATAフォルダをコピー、別マシンに戻しDBCC CHECKDBを実行すると下記のようなエラーが大量に発生しておりました。

    メッセージ 8914、レベル 16、状態 1、サーバー CLI01、行 1
    オブジェクト ID 2053582354、インデックス ID 0、パーティション ID 72057594039631872、アロケーション ユニット ID 72057594040680448 (型 In-row data) のページ (1:3399) の PFS 空き領域情報が不適切です。予想値  80_PCT_FULL、実際の値 100_PCT_FULL。

    メッセージ 8935、レベル 16、状態 1、サーバー CLI01、行 1
    テーブル エラー: オブジェクト ID 293576084、インデックス ID 1、パーティション ID 72057594038976512、アロケーション ユニット ID 72057594040025088 (型 In-row data)。ページ (1:3371) の前ページへのリンク (1:3271) は、親 (1:3102)、スロット 117 がこのページに対して想定している前ページ (1:3433) と一致しません。

    メッセージ 8952、レベル 16、状態 1、サーバー CLI01、行 1
    テーブル エラー: テーブル 'TEST.TABLE1' (ID 1845581613)。インデックス 'TABLE1_IDX1' (ID 2) のインデックス行がどのデータ行とも一致しません。余分なキーまたは無効なキーである可能性があります。

    メッセージ 8956、レベル 16、状態 1、サーバー CLI01、行 1
    値が (列1 = '002014101800001' and 列2 = '2014-10-18 09:00:31.000' and 列3 = '2014-10-18 09:01:00.000') を含むインデックス行 (1:3182:34) が (列1 = '002014101800001' and 列2 = '2014-10-18 09:00:31.000' and 列3 = '2014-10-18 09:01:00.000') で識別されるデータ行を指しています。

    メッセージ 8978、レベル 16、状態 1、サーバー CLI01、行 1
    テーブル エラー: オブジェクト ID 293576084、インデックス ID 1、パーティション ID 72057594038976512、アロケーション ユニット ID 72057594040025088 (型 In-row data)。ページ (1:3371) に前ページ (1:3271) からの参照がありません。チェーン リンケージに問題がある可能性があります。

    メッセージ 8980、レベル 16、状態 1、サーバー CLI01、行 1
    テーブル エラー: オブジェクト ID 293576084、インデックス ID 1、パーティション ID 72057594038976512、アロケーション ユニット ID 72057594040025088 (型 In-row data)。インデックス ノード ページ (1:3102)、スロット 119 が、子ページ (1:3434) と前の子ページ (1:3372) を参照していますが、これらの子ページは見つかりませんでした。

    2014年11月4日 7:13

回答

  • エラー824は、DBの一貫性がとれなくなった際に生じます。

    原因はさまざまありますが、今回のログを見る限り

    ファイルの一部、

    ("dbcc page"コマンドで確認できる)pageで破損しているファイルがあり

    整合性が取れなくなっている可能性があります。

    データのpageはあるけどindexのページが破損してないとか、その逆とかです。

    ちょっと話はそれますが、

    なぜ破損が起こったかを確認するのであれば、

    ログで出力されるdumpから例外のパターン(Acess Violationとか)

    から、特定クエリのDB破損や、SQLServerのバグ、ハードの破損やメモリ空間での破損を

    確認するようになるかと思います(結構めんどくさいと思われ・・)。

    ページの破損であれば、

    undocumetedコマンドを駆使して破損しているページを探し、

    整合性がとれないデータを削除していけば回復できる可能性がありますが、

    どのみち、データ自体は一部(整合性がとれなくて削除したデータ)はなくなります。

    早急に復旧したい、かつ、

    データをどうしても復旧させなければならないというミッションは無いのであれば、

    テーブルのデザインをスクリプトで抜いて、新しくデータベースカタログを作り直すのが、

    応急処置的にはなりますが、早いと感じます。

    ただ、頻発して起こるのであれば、Dumpから原因を見たほうが良いと感じます。

    • 回答の候補に設定 星 睦美 2014年11月5日 2:57
    • 回答としてマーク 星 睦美 2014年11月10日 8:23
    2014年11月4日 8:31