Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

Heroku PostgresのDBをローカルにコピーする方法

イメージ
Mar 08, 2019

Heroku PostgresのDBをローカルにコピーする方法



heroku pg:backupsコマンドでバックアップを取ってダウンロードし、pg_restoreコマンドでローカルにレストアすればよいです。

1. バックアップ取得


$ heroku pg:backups capture --app sushi(アプリ名)

ログが出る

Use Ctrl-C at any time to stop monitoring progress; the backup
will continue running. Use heroku pg:backups info to check progress.
Stop a running backup with heroku pg:backups cancel.

DATABASE ---backup---> b001

Running... 7.30MB
  • DATABASE ---backup---> b001 この場合バックアップのIDは b001
  • Hobby Dev(無料プラン)は2個しか取れない(古い方から消える)ので、チームメイトに一言断ってからにしましょう
  • Hobby Devの場合,バックアップのIDは b001かb002
  • Standard 0以上のプランならスケジュールバックアップがあるのでそれを使ってもいいです。チームメイトがキャプチャしたバックアップがあるならそれを使ってもいいです
    • その場合、heroku pg:backupsでバックアップの一覧を出せるので、最新のバックアップのIDを覚えておきます

2. バックアップのダウンロード

アプリ名がsushiでバックアップIDがb001の場合

curl -o latest.dump $(heroku pg:backups public-url b001 --app sushi)

ダンプファイル名は任意のファイル名(production.dumpとかlatest.dumpとかmydb.dumpとかなんでも良い)

  • heroku pg:backups public-url b001 --app sushiでURLを表示できます。10分間有効です
  • 上のコマンドはcurlに渡してすぐにダウンロードするようにしています。production.dumpというファイル名で保存されます

3-A. ローカルのDBにレストア(全てのテーブルをコピーするパターン)

データベース名がhoge_developmentで、認証なしの場合(Railsならそうなってるはず)

$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -d hoge_development latest.dump

option内容詳細 pg_restoreドキュメント

  • DBのスキーマとレコードがまるごとレストアされます。rake db:migrateなどは必要ないです
  • --verboseオプションでログ表示
  • --cleanオプションで、元々あったデータを全部消してからレストアする
  • --no-acl--no-ownerは権限設定をスキップする。ローカルなのでこれでいいと思う
  • -h localhostはレストア先のホストの指定
  • -d hoge_developmentはレストア先のデータベース名の指定

注意点

Heroku Connectを使っている場合、Heroku Connectが使うトリガーや管理テーブル(_trigger_logなど)、管理カラム(_hc_lastopなど)も全部レストアされます。Heroku Connectのテーブルをridgepoleでローカルに再現している場合、管理テーブル、管理カラムも再現するようにしないと、次にridgepole --applyした時にその辺が消えてトリガーが落ちるようになります。

よーするにridgepole --exportする時に--ignore-tables '\\A_'を付けたり、エクスポートされたSchemafileをいじったりするなということです。


3-B. ローカルのDBにレストア(特定のテーブルをコピーするパターン)


リストアされる内容の一覧を出力 content_listは単なるファイル名なので任意

$ pg_restore -l dump_file_name > content_list


リストアされる内容の一覧の確認と修正

$ vim content_list


リストアされる予定のテーブル定義やレコードが確認できるので、除外したい部分をコメントアウトする

;いらんテーブル
;208; 1259 15400752 TABLE public users ...
...
;いらんデータ
;207; 1259 15400750 SEQUENCE public users_id_seq ...

僕の場合はusersテーブル以外をダンプしたかったのでusersが含まれる全ての行をコメントにしました


いざリストアする

$ pg_restore -L content_list dump_file_name
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -d hoge_development dump_file_name


完璧!!     



こちらも参照!!

ローカルDBをHerokuに移行