はじめに
本番環境にMySQLのデータを開発環境に入れる時には特にエラーもなくインプットすることができたのですが、消す時になってエラーが発生してハマってしまいました。
少し珍しいケースかもしれませんが、他の方の参考になればと思いまとめることにしました。
関連リンク
そもそも本番環境のMySQLのデータをどうやって開発環境に入れるのかという記事は下記をご参照ください。
- EC2からMySQL(RDS)接続後にローカルMySQLにデータを入力する方法
エラー
開発環境でDB自体を削除するコマンドを実行したところ、、、
$ rails db:drop
エラーActiveRecord::ProtectedEnvironmentError
が出ました。。。
このエラーの意味は、
本番環境のDBを操作しようとしているが問題ないですか?
という警告のようなもので、環境変数を入れると操作を続けることができるよ。と言ってます。
そもそも開発環境なんですけど、なんで本番環境と出るんですか??
rails 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
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate:reset => db:drop => db:check_protected_environments
(See full trace by running task with --trace)
結論
先に結論から書いてしまいますが、
Rails5では MySQLに環境変数を格納しており、本番環境のデータをそのまま開発環境に入れたことにより、MySQLの環境変数に本番環境の変数が格納されてしまったため、上記のエラーがでてしまいました。
なので、解決する方法としては、MySQLの環境変数を本番環境のものから開発環境のものに書き換えればいいということです。
解決手順
MySQLに接続します。
$ mysql -h db -u root -p
存在するデータベースを確認します。
$ show databases;
対象のデータベースを指定します。
$ use *******;
データベースないのテーブルの一覧を表示します。
$ show tables;
テーブル一覧の中にar_internal_metadata
があると思います。
この中に、環境変数を格納しています。
+---------------------------------------------------+
| Tables_in_scm_development |
+---------------------------------------------------+
| ar_internal_metadata |
| ... |
+---------------------------------------------------+
ar_internal_metadataの中身をみてみると、
$ select * from ar_internal_metadata;
見つけましたproduction
の文字を。
+-------------+-------------+---------------------+---------------------+
| key | value | created_at | updated_at |
+-------------+-------------+---------------------+---------------------+
| environment | production | 2020-01-10 09:37:29 | 2020-01-10 09:37:29 |
+-------------+-------------+---------------------+---------------------+
このproduction
をdevelopment
へ修正します。
$ update ar_internal_metadata set value='development'
もう一度、ar_internal_metadataの中身をみてみると、
$ select * from ar_internal_metadata;
環境変数はdevelopment
に変更できました。
+-------------+-------------+---------------------+---------------------+
| key | value | created_at | updated_at |
+-------------+-------------+---------------------+---------------------+
| environment | development | 2020-01-10 09:37:29 | 2020-01-10 09:37:29 |
+-------------+-------------+---------------------+---------------------+
MySQLから抜けて
$ exit
もう一度、DBを削除するコマンドを実行。すると成功しました!
$ rails db:drop
まとめ
つらつらと手順を書いたので、人によっては理解しづらいかもしれませんが、困っている誰かの役に立てばなーと思います。
参考
- 本番環境のデータをローカルのDBに投入したら UnknownMigrationVersionError と ProtectedEnvironmentError (Rails 5)