状況
期限切れクーポンを本番 DB(MySQL)から削除する作業。手順書は次の 4 行だけだった。
この手順書に欠けている、最も重要なものは?
1. 作業開始をチャットで連絡する2. mysql -h db-prd-01 -u ops shop で接続する3. DELETE FROM coupons WHERE expired_at < NOW();4. 作業終了をチャットで連絡する正答
- NOW() ではなく CURRENT_TIMESTAMP と書くべき
- 連絡はチャットではなく電話で行うべき
- 接続時に -p を付けてパスワードを入力する手順がない
- 削除前の件数確認と、戻すためのバックアップやトランザクションがない
解説
MySQL の既定は autocommit なので、DELETE は実行した瞬間に確定する。手順書には、同じ条件で SELECT COUNT(*) して想定件数と比べる確認も、対象行のバックアップや BEGIN〜COMMIT もないため、条件を誤っても気づけず、戻す手段もない。NOW() と CURRENT_TIMESTAMP は MySQL では同じ意味で問題ではない。パスワードの入力方法や連絡手段は運用の細部で、データを失う危険に比べれば優先度は低い。
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ