web-dev-qa-db-ja.com

SQL Server 2005データベースの破損。アドバイスする

私は過去にデータベースの破損に遭遇したことがありますが、どのオブジェクトが問題を引き起こしているかはわかっていました。この状況で、問題のあるSQL Server 2005データベースに対してDBCC CHECKDBを実行すると、次のエラーが発生します。

    Msg 8909, Level 16, State 1, Line 1
Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (1:2388) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).
Msg 8909, Level 16, State 1, Line 1
Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (1:8807) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).
CHECKDB found 0 allocation errors and 2 consistency errors not associated with any single object.
Msg 8929, Level 16, State 1, Line 1
Object ID 60, index ID 1, partition ID 281474980642816, alloc unit ID 281474980642816 (type In-row data): Errors found in off-row data with ID 1454243840 owned by data record identified by RID = (1:728:2)
Msg 8928, Level 16, State 1, Line 1
Object ID 60, index ID 1, partition ID 281474980642816, alloc unit ID 71776119065149440 (type LOB data): Page (1:2388) could not be processed.  See other errors for details.
Msg 8965, Level 16, State 1, Line 1
Table error: Object ID 60, index ID 1, partition ID 281474980642816, alloc unit ID 71776119065149440 (type LOB data). The off-row data node at page (1:2388), slot 0, text ID 1454243840 is referenced by page (1:728), slot 2, but was not seen in the scan.
CHECKDB found 0 allocation errors and 3 consistency errors in table 'sys.sysobjvalues' (object ID 60).
Msg 8928, Level 16, State 1, Line 1
Object ID 393768460, index ID 1, partition ID 72057594063421440, alloc unit ID 72057594069647360 (type In-row data): Page (1:8807) could not be processed.  See other errors for details.
Msg 8976, Level 16, State 1, Line 1
Table error: Object ID 393768460, index ID 1, partition ID 72057594063421440, alloc unit ID 72057594069647360 (type In-row data). Page (1:8807) was not seen in the scan although its parent (1:2862) and previous (1:8806) refer to it. Check any previous errors.
Msg 8978, Level 16, State 1, Line 1
Table error: Object ID 393768460, index ID 1, partition ID 72057594063421440, alloc unit ID 72057594069647360 (type In-row data). Page (1:10128) is missing a reference from previous page (1:8807). Possible chain linkage problem.
CHECKDB found 0 allocation errors and 3 consistency errors in table 'reservation_packages' (object ID 393768460).
Msg 8928, Level 16, State 1, Line 1
Object ID 1513772450, index ID 0, partition ID 72057594064994304, alloc unit ID 72057594071285760 (type In-row data): Page (1:5211) could not be processed.  See other errors for details.
Msg 8939, Level 16, State 98, Line 1
Table error: Object ID 1513772450, index ID 0, partition ID 72057594064994304, alloc unit ID 72057594071285760 (type In-row data), page (1:5211). Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed. Values are 63047689 and -4.
CHECKDB found 0 allocation errors and 2 consistency errors in table 'reservation_services_log' (object ID 1513772450).
CHECKDB found 0 allocation errors and 10 consistency errors in database 'ChJ'.
repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (ChJ).

オブジェクトID 0 ??インデックスID -1 ??パーティションID 0 ??何もわからない

データベースは(残念ながら)単純復旧モードで、1か月前のバックアップがあります。

重要なデータが含まれているため、実行する必要があります。

あなたが私に与えることができるどんな助けでもありがたいです。

よろしくお願いします!

EDIT1:残念ながら、Red Gateのデータ比較では、テーブルのスキャン中はデータベースを登録できません... :(

6
PanosPlat

正しいスキーマの古いバックアップがあり、問題のデータベースがオンラインになっていて、いくつかのテーブルを正常にクエリしたので、生データのダンプをできるだけ速く取得する傾向があります。

  1. データベースにアクセスしているアプリケーションをシャットダウンします。
  2. BCPはデータをテーブルごとにファイルにエクスポートします。ディスクの破損は問題の原因となる可能性があるため、データをポータブルドライブまたは別のマシンのファイル共有にエクスポートします。
  3. 古いバックアップを正常なサーバーに復元します。
  4. データベーススキーマの複雑さに応じて、復元したバックアップからデータを切り捨てるか、スキーマをスクリプト化して新しい空のデータベースを作成します。
  5. データをBCPで戻します。

データに不正確な情報が含まれている、行が欠落している、または誤った値が含まれている可能性があります。しかし、運が良ければ、1か月前のバックアップよりも多くなります。

6
  1. データベースをオフラインにしないでください。また、サーバーをシャットダウンしないでください。どちらでも、データベースに完全にアクセスできなくなる可能性があります。

  2. 完全な「コピーのみ」のバックアップを取ります。

  3. Red-Gate datacompareでバックアップファイルを読み取ってみます

  4. このクエリを、checkdbの出力にあるallocation_unit_id値とともに使用します。

    SELECT o.name、p.index_id、p.partition_number FROM sys.allocation_units a JOIN sys.system_internals_partitions p ON a.container_id = p.partition_id JOIN sys.all_objects o ON p.object_id = o.object_id WHERE a.allocation_unit_id = '281474977387 」

影響を受けるオブジェクト名が表示されます。

  1. 別の名前でデータベースを復元する(失敗する可能性があります)

  2. 復元時に修復オプション「REPAIR_REBUILD」を指定してcheckdbを実行します。復元に失敗した場合は、元のバージョンを使用してください。

  3. これまで何も機能しなかった場合は、DBCC CHECKDBの "REPAIR_ALLOW_DATA_LOSS"オプションを使用してください。

  4. それでもうまくいかない場合は、(私のような)破損回復分野の経験を持つコンサルタントを雇ってください。

4
Sebastian Meine