LoginSignup
7
2

More than 1 year has passed since last update.

herokuのDBをローカルのDBにリストアする方法

Last updated at Posted at 2020-08-17

概要

ほんと毎回忘れるので、herokuのpostgreSQLのDBのデータをローカルのDBにリストアする手順をメモしておきます。

バックアップを確認

herokuのpostgreSQLのダッシュボードの「Durability」より、
リストアしたいDBのバックアップデータのNameを確認します。

スクリーンショット 2020-08-17 14.04.05.png

以下のように、コマンドラインからバックアップデータを確認することもできます。

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」がダウンロードされれば成功です。

スクリーンショット 2020-08-17 15.36.55.png

ローカルのDBにデータをリストアする

コマンドラインで以下のように入力することで、latest.dumpをローカルのDBに流し込むことができます。

pg_restore --verbose --clean --no-acl --no-owner -h localhost -d booqs_development(DB名) latest.dump

成功例:
スクリーンショット 2020-08-17 15.40.49.png

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を切り替える方が健全だそうです。 )

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2