DBAtlas · データベース運用アトラス

データ破損からの復旧

データ破損 (ブロック/ページのチェックサムエラー、読み取り不能なテーブル、破損した RDB/AOF) に対する段階的な診断フロー: まず破損範囲を確認し、ブロックレベルのリカバリ、バックアップからの完全リストア/PITR、最終手段の修復ツールのいずれかを正しく選択する。

破損範囲はどの程度か?

まず整合性チェックを実行し、破損がどこまで広がっているかを判断する。破損しているのは少数のブロック/ページのみか、単一オブジェクト (テーブル/インデックス) が影響を受けているか、それとも破損が広範囲か? 以下のコマンドでスキャンして範囲を判断し、該当する分岐を選択する。

RMAN> BACKUP VALIDATE CHECK LOGICAL DATABASE;  -- then: SELECT file#, block#, blocks, corruption_type FROM v$database_block_corruption;
  • 少数のブロック / ページのみ破損
  • 単一オブジェクト (テーブル/インデックス) が影響を受けている
  • 破損が広範囲 / 多数のオブジェクト
  • チェックツールが動作せず、DB がオープンできない
  • 破損が繰り返し発生する (根本原因が疑われる)

根本原因: 限定的なブロック/ページ破損 → 対象を絞ったリカバリ

破損しているのが少数のブロック/ページのみであれば、データベース全体をリストアする必要はない。エンジンのブロック/ページレベルのリカバリ機能を使い、破損部分のみをバックアップ/ログから修復してデータ損失を最小化する。

根本原因: オブジェクトレベル/広範囲の破損 → バックアップからの完全リストアまたは PITR

破損が 1 つ以上のオブジェクトに広がっている場合、最も安全なのは正常なバックアップからリストアし、可能であれば破損発生時点までロールフォワード (PITR) すること。これにより修復ツールが引き起こすデータ損失を回避できる。

バックアップなし / DB がオープンできない — 最終手段に進むか?

修復ツール (REPAIR_ALLOW_DATA_LOSS、innodb_force_recovery、--fix) はデータ損失を引き起こす可能性があり、整合性制約を破壊する場合がある。使用可能なバックアップが存在せず、データベースをオープンできない場合に限る最終手段。まず使用可能なバックアップが本当にないことを確認する。

  • 正常なバックアップが見つかったのでリストアする
  • バックアップがまったくなく、修復ツールしか選択肢がない

最終手段: データ損失リスクのある修復ツール

これらのツールは、破損した行/ページを破棄してデータベースをオープン可能にする。バックアップがなく、既存ファイルのコピーを先に取得した場合にのみ使用する。目的: データをエクスポートできる程度にオープンし、クリーンなコピーへ移行すること。

根本原因: ハードウェア/インフラ → 発生源を修正し、チェックサムを有効化する

破損が繰り返し発生する場合、真の原因はディスク、コントローラー、メモリ (RAM)、または不安定なストレージ層である可能性が高い。データをリカバリするだけでは不十分で、発生源を修正しなければ破損は再発する。早期検出のためにチェックサム/整合性検証も有効化する。

DBAtlas で開く →