##概要
ほんと毎回忘れるので、herokuのpostgreSQLのDBのデータをローカルのDBにリストアする手順をメモしておきます。
##バックアップを確認
herokuのpostgreSQLのダッシュボードの「Durability」より、
リストアしたいDBのバックアップデータのNameを確認します。
以下のように、コマンドラインからバックアップデータを確認することもできます。
heroku pg:backups -a AppName
=== Backups
ID Created at Status Size Database
──── ───────────────────────── ─────────────────────────────────── ──────── ────────
a015 2020-08-16 10:15:24 +0000 Completed 2020-08-16 10:17:34 +0000 162.97MB JADE
a014 2020-08-15 10:17:05 +0000 Completed 2020-08-15 11:06:57 +0000 162.38MB JADE
a013 2020-08-14 10:15:18 +0000 Completed 2020-08-14 10:17:34 +0000 161.75MB JADE
a012 2020-08-13 10:15:23 +0000 Completed 2020-08-13 10:17:55 +0000 161.11MB JADE
a011 2020-08-12 10:18:41 +0000 Completed 2020-08-12 10:21:24 +0000 160.56MB JADE
今回は「a015」をローカルにリストアします。
##バックアップデータをダウンロード
ローカルにリストアするバックアップデータをダウンロードします。
heroku pg:backups:download a015 -a AppName(アプリ名)
ルートディレクトリに「latest.dump」がダウンロードされれば成功です。
##ローカルのDBにデータをリストアする
コマンドラインで以下のように入力することで、latest.dumpをローカルのDBに流し込むことができます。
pg_restore --verbose --clean --no-acl --no-owner -h localhost -d booqs_development(DB名) latest.dump
Dockerのコンテナにリストアする場合
docker exec -i booqs_db_1(コンテナ名) pg_restore -U admin(ユーザー名) -v -d booqs_development(DB名) < ./latest.dump
以上です。
参考にさせていただいた記事:
HerokuのDBをバックアップ / 別DBにリストアしたいんだけど...
Heroku PostgresのDBをローカルにコピーする方法
pg_restore in postgres docker container
追記:herokuの中の人に聞いた裏技「heroku pg:pull」
herokuで働いている方から教えていただいたことなのですが、
こんな面倒なことせずとも、 heroku pg:pull
をするだけで、直接productionのDBからローカルのDBにデータをコピーできるそうです。
heroku pg:pull HEROKU_POSTGRESQL_MAGENTA(herokuのDB名) booqs_development(作成するDB名) --app AppName(アプリ名)
公式ドキュメント: https://devcenter.heroku.com/articles/heroku-postgresql#pg-push-and-pg-pull
注意点としては、最初に紹介したpg_restore --clean
では、DBの中身を削除してデータを流し込みますが、
heroku pg:pull
では、ローカルに新規データベースを作成するということです。
コマンドの第二引数が、作成されるDB名になります。
そのため、もしすでにローカルにbooqs_developmentという名前のDBが存在した場合は、上記のコマンドでは
createdb: error: database creation failed: ERROR: database "booqs_development" already exists
という具合にエラーが出ます。
なのでローカルのメインDBを上書きするような、pg_restore --clean
と同じ働きをさせたい場合には、pg:pull
の前に一度ローカルのDBを削除する必要があります。
( 中の人曰く、database.yml
を書き換えずに対象のデータベースの中身だけを書き換えたい場合、 pg:pull
の前に一度 rails db:drop
をしてあげる必要があるとの事でした。
ただデバッグのユースケースを考えると、 pg:pull
時には別のDB名をつけてあげて、 Rails の場合、 database.yml
を一時的に書き換えて、メインDBを切り替える方が健全だそうです。 )