updated on 2019-05-13
heroku pg:backups
コマンドでバックアップを取ってダウンロードし、pg_restore
コマンドでローカルにレストアすればよいです。
$ 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は b001heroku pg:backups
でバックアップの一覧を出せるので、最新のバックアップのIDを覚えておきますアプリ名が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分間有効ですデータベース名がhoge_development
で、認証なしの場合(Railsならそうなってるはず)
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -d hoge_development latest.dump
option内容詳細 pg_restoreドキュメント
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をいじったりするなということです。
$ 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