heroku pg:backupsコマンドでバックアップを取ってダウンロードし、pg_restoreコマンドでローカルにレストアすればよいです。
1. バックアップ取得
アプリ名がsushiの場合
$ 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が表示されるので覚えておきます - ちょっと時間がかかります。Ctrl+Cで止めても処理は継続されます
- Hobby Devは2個しか取れない(古い方から消える)ので、チームメイトに一言断ってからにしましょう
- Standard 0以上のプランならスケジュールバックアップがあるのでそれを使ってもいいです。チームメイトがキャプチャしたバックアップがあるならそれを使ってもいいです
- その場合、
heroku pg:backupsでバックアップの一覧を出せるので、最新のバックアップのIDを覚えておきます
- その場合、
2. バックアップのダウンロード
アプリ名がsushiでバックアップIDがb001の場合
curl -o latest.dump $(heroku pg:backups public-url b001 --app sushi)
-
heroku pg:backups public-url b001 --app sushiでURLを表示できます。10分間有効です - 上のコマンドはcurlに渡してすぐにダウンロードするようにしています。latest.dumpというファイル名で保存されます
3. ローカルのDBにレストア
データベース名がhogehoge_developmentで、認証なしの場合(Railsならそうなってるはず)
pg_restore --verbose --clean --no-acl --no-owner -h localhost -d hogehoge_development latest.dump
- DBのスキーマとレコードがまるごとレストアされます。
rake db:migrateなどは必要ないです -
--verboseオプションでログ表示 -
--cleanオプションで、元々あったデータを全部消してからレストアする -
--no-aclと--no-ownerは権限設定をスキップする。ローカルなのでこれでいいと思う -
-h localhostはレストア先のホストの指定 -
-d hogehoge_developmentはレストア先のデータベース名の指定
注意点
Heroku Connectを使っている場合、Heroku Connectが使うトリガーや管理テーブル(_trigger_logなど)、管理カラム(_hc_lastopなど)も全部レストアされます。Heroku Connectのテーブルをridgepoleでローカルに再現している場合、管理テーブル、管理カラムも再現するようにしないと、次にridgepole --applyした時にその辺が消えてトリガーが落ちるようになります。
よーするにridgepole --exportする時に--ignore-tables '\\A_'を付けたり、エクスポートされたSchemafileをいじったりするなということです。