状況
MySQL(autocommit 有効)の本番 DB で、1 人のユーザーのプランを変える UPDATE を実行した。結果は次のとおり。
この出力を見て、最初にすべきことは?
Query OK, 48213 rows affected (2.31 sec)Rows matched: 48213 Changed: 48213 Warnings: 0正答
- 1 件のはずが 48213 件更新され、確定済み。手を止めてすぐ報告する
- Warnings: 0 なので、更新内容に問題はなく作業を続けてよい
- 2.31 秒かかっているので、インデックス不足として後で報告する
- Matched と Changed が同じなので、意図どおり更新できている
解説
1 人分のつもりの UPDATE で 48213 行が変わっており、WHERE の誤りでほぼ全員を更新した可能性が高い。autocommit なのですでに確定し、ROLLBACK では戻せない。被害が広がる前に手を止め、責任者に報告して、バックアップやバイナリログからの復旧を判断してもらう。黙って UPDATE で戻そうとすると、元の値が分からずさらに壊すことがある。Warnings は型変換などの警告で件数の正しさは示さない。実行時間は今は二の次。
参考: dev.mysql.com
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ