【Rails】ActiveRecord ProtectedEnvironmentError You are attempting to run a destructive action against your ‘production’ database.

ruby-on-rails

こんにちは。たなか(@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に変更されているのが確認できました。

 

ar_internal_metadata

 

この状態で再び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 を追加することでコマンドが成功します。

 

まとめ

rails-logo

 

先日、ローカルでproductionモードを起動する機会があったので、その時の設定が残ってしまっていたのが原因かなーと思ったりします。

変なところで時間使っちゃったなあ。

 

同じ症状でお悩みの方の参考になれば幸いです。

短いですが、今回はここまで。

 

参考サイト

コメントを残す

メールアドレスが公開されることはありません。