はじめに
どうも、もきおです。未経験から自社開発企業に入社して半年以上経ちましたがつい一週間前くらいに盛大にやらかしたのでその際のお話をしていきたいと思います。
Slackでの会話
先輩「あれ?開発DBのデータ消えた・・・?」
メンバー「僕もDB見れなくなりました、、」
先輩「全部消えてるよね、、」
この時ハンパない冷や汗をかいてました。心当たりがめちゃくちゃあったからです。
そう、開発DBのおそらく何千万というデータというデータを消してしまったのは紛れもなく自分でした。
なぜデータを消してしまったのか?
毎回テストを走らせるためにテスト用DBを作成しているのですが、テスト途中で止まってしまいそのまま進まないという事象が起きていました。
rails db:create Rails_ENV=test
rails db:migrate Rails_ENV=test
そのためmigrateが上手くできていないと感じ、一旦テストDBをリセットしようとしたらtest
を指定せず以下のコマンドを打ってしまい開発DBのデータを全てリセットしてしまったという感じです。
rails db:migrate:reset #Rails_ENV=test このENV指定を付け忘れて実行してしまった。
まぁ結局どうなったのかというと、開発DBのバックアップをとっていただいていたので、バックアップから復元していただきました。本当にありがとう、バックアップ。
リセット系のコマンドを実行できないようにしよう
CTO「今後そんな事が起きないように開発環境でリセットコマンドが実行できないようにしといてね」
もきお「はい、もちろんやらせていただきます!」
ということで責任をとってRailsでresetコマンドを実行できないようにするタスクを振ってもらいました。
でも、それってどうやってやるの?笑と思いましたが良さげな記事を見つけました。この記事はRuby on Rails 5速習実践ガイドにも掲載されていたので信頼できる記事かなと思います。
実際に実装してみた
この記事によるとRailsバージョン5以降では本番環境においてDB破壊系のtaskの実行を防止する仕組みが導入されているとのこと。試しにrails c
でコンソール開いてActiveRecord::Base.protected_environments
を実行してみると
ほんとだ、本番環境はデフォルトでDB破壊系コマンド実行は防止されているようです。
開発環境(development)でも適用するには以下の記述をconfig/application.rb
に記述する必要があるとのこと。
# config/application.rb
ActiveRecord::Base.protected_environments = %w(production development)
再度コンソール開いて確認してみると
無事追加されているようです。
最後に実際にresetコマンドを実行してみて検証しました。でも怖いのでtest環境もprotected_environments
に追加しtest環境で実行確認 笑
記事の実行エラーと同じエラーが無事発生しました。成功しているみたいです。
あとがき
いかがだったでしょうか?今回は盛大にやらかしたお話をさせていただきました。本番データ消しちゃったとかよく聞くけどほんとにそんなことあんのかよーとか思ってたのに実際やってしまいました笑
ほんとデータベース周りは気をつけたいと思います。
最後までご覧いただき本当にありがとうございました!!
少しでも良かったと思っていただけたら左上のいいねポチッといただけますと幸いです。
Twitterでも日頃の業務で思ったことを呟いていくのでご覧いただけると幸いです。
@mokio_50