こんにちは。たなか(@tanaka_ricecake)です。
Ruby on RailsでWebアプリケーションサービスの開発をしています。
開発中以下のようなエラーに遭遇したので、内容と解決方法をご紹介します。
もくじ
症状
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your ‘production’ database.
rake db:migrate:reset 実行時に以下のエラーが出ました。
# rake db:migrate:reset
rake aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
/usr/local/bundle/gems/activerecord-5.1.6.1/lib/active_record/tasks/database_tasks.rb:59:in `check_protected_environments!'
/usr/local/bundle/gems/activerecord-5.1.6.1/lib/active_record/railties/databases.rake:11:in `block (2 levels) in <main>'
/usr/local/bundle/gems/rake-12.3.1/exe/rake:27:in `<top (required)>'
Tasks: TOP => db:migrate:reset => db:drop => db:check_protected_environments
(See full trace by running task with --trace)
Railsさん『’本番’データベースに対して破壊的なアクションを実行しようとしています。』
ちょっと怖めなメッセージでビビってしまいます。
解決方法
db:environment をdevelopmentに変更する!
Rails5以降のDB保護機能が効いており、resetやdrop等の破壊的なコマンド実行が失敗するようになったそうです。
以下のようなコマンドは誤爆防止機能が作動します。
- db:drop
- db:drop:all
- db:purge
- db:purge:all
- db:purge:test
- db:schema:load
今回の場合は、そもそもdb:environmentがproductionになっていることが間違いだったので、以下のコマンドで向き先を変更しました。
bin/rails db:environment:set RAILS_ENV=development
sequel Proからar_internal_metadataテーブルを確認すると、valueがproductionからdevelomentに変更されているのが確認できました。
この状態で再びrails db:migrate:reset。
無事にコマンドが成功しました!よかった!
production databaseに破壊的な変更を加えたい場合
一方で、「productionモードだけど、dbをreset/dropしたい!」という場合もあるのかなーと思います。
その場合はエラー内容にもあるように環境変数を指定して実行すれば通ります。
$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 を追加することでコマンドが成功します。
まとめ
先日、ローカルでproductionモードを起動する機会があったので、その時の設定が残ってしまっていたのが原因かなーと思ったりします。
変なところで時間使っちゃったなあ。
同じ症状でお悩みの方の参考になれば幸いです。
短いですが、今回はここまで。