コンテンツにスキップ

面接問題:本番DBでWHERE句なしDELETE → 100万行消えた、どう復旧する?

問題

本番DBで WHERE 句なしの DELETE クエリを実行してしまった。100万行が2秒で消えた。直近のリカバリプランは?

リカバリ手順

即時対応

  1. アプリケーションを即座に停止(さらなるデータ書き込みを防ぐ)
  2. オンコールメンバーとインシデント対応チームに連絡
  3. DBへの新規書き込みを止める(READ ONLY モードへの切り替えも検討)

復旧手段

手段 条件 所要時間
トランザクションロールバック コミット前なら即時 秒単位
バイナリログ/WAL から復元 有効化されていること 分〜時間
ポイントインタイムリストア(PITR) バックアップあり 分〜時間
スナップショットから復元 直前スナップショットあり 分〜時間
レプリカから昇格 レプリカの遅延次第 秒〜分

事後対応

  • インシデントレポート作成(Timeline・根本原因・対策)
  • 危険なクエリの実行前に SELECT で確認する運用ルール化
  • 本番 DB への直接接続権限を絞る
  • sql_safe_updates や dry-run モードの導入

ポイント

  • コミット前かどうかがまず最初の分岐点
  • PITR を使えるかどうかはバックアップ設定次第(RDS, Cloud SQL は標準装備)
  • 「なぜ防げなかったか」の再発防止策もセットで答えられると評価が高い