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をいじったりするなということです。