こんにちは、ジョンです。
今回は、Heroku上にあげているDBをリセットしようとして苦戦した話です。
環境
Rails5.2
Heroku
Postgres
経緯
開発した内容をHeroku上にデプロイした際、
seedを複数回実行してしまい、マスターデータが重複してしまっていることに気付きました。
やったこと
※アプリ名は「app-name」に置き換えております。
まずは普通に db:reset
Herokuにあげているとは言え、本格稼働しているわけではないので、
では一旦リセットしようと、 heroku run rails db:reset
を叩いてみると
jonconan-iMac:app-name jonconan$ heroku run rails db:reset
(中略)
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
調べてみると、Rails5系から、本番環境の db:reset
は出来なくなったようです。
エラーメッセージにも出ている通り、オプション付けなきゃいけないっぽいですね。
オプションを付けて再挑戦
ではでは再挑戦。
jonconan-iMac:app-name jonconan$ heroku run rails db:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
Running rails db:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1 on ⬢ app-name... up, run.9816 (Free)
FATAL: permission denied for database "postgres"
DETAIL: User does not have CONNECT privilege.
Couldn't drop database 'XXXXXXXXXXXXX'
rails aborted!
PG::ConnectionBad: FATAL: permission denied for database "postgres"
DETAIL: User does not have CONNECT privilege.
権限が・・・ない・・・・?
更に再調査
色々調べてみると、Heroku上のDBをリセットする、 heroku pg:reset DATABASE_URL
なるコマンドがあることを発見。
なるほどね、じゃぁこれをやってみよう。
まずは DATABASE_URL
を確認しなきゃなので…
jonconan-iMac:app-name jonconan$ heroku config
=== app-name Config Vars
DATABASE_URL: postgres://XXXXXXXXXXXXXXXXXXXXXX.compute-1.amazonaws.com:5432/~~~~~~~~~
LANG: en_US.UTF-8
RACK_ENV: production
RAILS_ENV: production
RAILS_LOG_TO_STDOUT: enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE: ******************************************
あったあった、これだ
ではこれをコマンドに突っ込んで・・・
jonconan-iMac:app-name jonconan$ heroku pg:reset postgres://XXXXXXXXXXXXXXXXXXXXXX.compute-1.amazonaws.com:5432/~~~~~~~~~
▸ Unknown database: postgres://XXXXXXXXXXXXXXXXXXXXXX.compute-1.amazonaws.com:5432/~~~~~~~~~.
▸ Valid options are: DATABASE_URL
・・・・・?
何故か出来ない・・・?
・・・・まさか。
結論
最終的な正解は、これでした。
heroku pg:reset DATABASE_URL
まさかの直接打つ感じでした… URLに置き換えろってことかと思った。
このコマンドを打つと、警告が出ます。
jonconan-iMac:app-name jonconan$ heroku pg:reset DATABASE_URL
▸ WARNING: Destructive action
▸ postgresql-asymmetrical-87864 will lose all of its data
▸
▸ To proceed, type app-name or re-run this command with --confirm app-name
>
続行するには、app-nameと入力するか、-confirm app-nameでこのコマンドを再実行します
とのことなので、ここで入力すべきは、
jonconan-iMac:app-name jonconan$ heroku pg:reset DATABASE_URL
▸ WARNING: Destructive action
▸ postgresql-asymmetrical-87864 will lose all of its data
▸
▸ To proceed, type app-name or re-run this command with --confirm app-name
> app-name
Resetting postgresql-asymmetrical-87864... done
無事にリセットできました!