面接問題:本番DBでWHERE句なしDELETE → 100万行消えた、どう復旧する?¶
問題¶
本番DBで WHERE 句なしの DELETE クエリを実行してしまった。100万行が2秒で消えた。直近のリカバリプランは?
リカバリ手順¶
即時対応¶
- アプリケーションを即座に停止(さらなるデータ書き込みを防ぐ)
- オンコールメンバーとインシデント対応チームに連絡
- DBへの新規書き込みを止める(READ ONLY モードへの切り替えも検討)
復旧手段¶
| 手段 | 条件 | 所要時間 |
|---|---|---|
| トランザクションロールバック | コミット前なら即時 | 秒単位 |
| バイナリログ/WAL から復元 | 有効化されていること | 分〜時間 |
| ポイントインタイムリストア(PITR) | バックアップあり | 分〜時間 |
| スナップショットから復元 | 直前スナップショットあり | 分〜時間 |
| レプリカから昇格 | レプリカの遅延次第 | 秒〜分 |
事後対応¶
- インシデントレポート作成(Timeline・根本原因・対策)
- 危険なクエリの実行前に
SELECTで確認する運用ルール化 - 本番 DB への直接接続権限を絞る
sql_safe_updatesや dry-run モードの導入
ポイント¶
- コミット前かどうかがまず最初の分岐点
- PITR を使えるかどうかはバックアップ設定次第(RDS, Cloud SQL は標準装備)
- 「なぜ防げなかったか」の再発防止策もセットで答えられると評価が高い