本番データベースでDELETE文をミスった話

プログラミング

未経験からWeb系のエンジニアになって早や7ヶ月。

ついにやらかしました、こんにちは。

いつかやりそうだな~、気をつけなきゃな~と思っていたことを。

それは、本番データベースの操作ミス。

DELETE文のWHERE句の指定を間違え、多くの人のデータを消してしまいました。

たまたまメールアドレスなど個人情報ではなく、復元もできて大事にはならかったものの、やってしまったと気づいたときは青ざめましたね…。

職場の方たちは「だれもが通る道だ」と笑ってくれましたが、2度と同じ失敗を犯さないと誓いました。

新機能の確認作業中にやってしまった

パソコン画面とメガネ

どのような経緯でDBの操作ミスをしたかというと、ぼくがアサインしているとあるサービスの新機能がリリースされるということで、本当にちゃんと動くかの確認をしよう!!

ということになったんですね。

それで、その機能をムリヤリ確認するにはデータベースを操作する必要があったんです。

本番データベースいじるのこわいなぁ…と思いながら慎重にやっていたのですが、それでも確認不足でした。

念のためトランザクションで実行して、指差し確認して、よし大丈夫だ!!とDELETE文を実行したのですが…。

WHRE句にidと日付を指定しなければいけないのに、idを指定し忘れるという痛恨のミス。

idに関係なく全員の日付が消えてしまいました。

なんとか復元できて大事にはいたらなかった

ノートパソコンの診断

あたふたしながら相談してみると、ベテランの先輩エンジニアがこうやって復元できるよ、と鮮やかにコマンドを打ち込み対象者を絞り出してリスト化してくれました。

そのまま、ぼくが誤ってデータを消してしまった対象者全員分のINSERT文を一瞬のうちに作り上げてしまったのです。

神様のようでした。

その先輩はかつてぼくと同じようなミスで、あろうことがすべてのメールアドレスをデータベースから削除してしまったというのです…!!

復元できたんですか??と質問したら、

「全部手作業で入力して復元した」

という恐ろしい回答をいただきました。

ありがとうございます。

ぼくもめちゃくちゃ気をつけます。

DELETE文を間違えないために先にSELECTしよう

パソコンと本

先輩のおかげで復旧できましたが、もう2度とこんな失敗は犯したくありません。

DELETE文を打つときはまずSELECT文で試して、その結果が思っていたのと合っていたらSELECTの部分をDELETEに変えて実行するといいよ、とノウハウを共有してもらいました。

つまり、DELETEしたいデータをまずSELECTします。

SELECT * FROM table id=1 AND date=’2019-02-09′;

こんな感じで。

実行して返ってきた値がDELETEしたい対象であれば、SELECT * の部分を DELETE に変えてやればいい、ということです。

DELETE FROM table id=1 AND data=’2019-02-09′;

これからは本番サーバーをコンソールで触るときはめんどうでもこの手順を踏むようにします。

みなさんも気をつけてください。

操作にちょっと慣れてきた頃がいちばんあぶないです。(自分への戒め)