HerokuでDBのデータをバックアップする

HerokuアプリのDBをバックアップするにはpgbackupsというアドオンを利用する。昨日書いた方法との主な違いは、今回のはHerokuのサーバー上にバックアップされることと、フォーマットの変換はできないこと、あたりかな。バックアップ処理を自動化する場合は今回の方法が良いみたい。

アドオン追加

まず、herokuコマンドが使えるgemのherokuを最新の状態にする。

$ gem update heroku

次に、対象のHerokuアプリにpgbackupsアドオンを追加する。Basicタイプは無料。

$ heroku addons:add pgbackups:basic --app heroku-hello-world

これで準備完了。

バックアップ

Heroku(Amazon S3)上にバックアップするには以下のようにコマンドを実行する。

$ heroku pgbackups:capture --app heroku-hello-world
DATABASE_URL  --backup-->  b001
Capturing... done
Storing... done

以下のコマンドで、現在保存されているバックアップの一覧を見ることが出来る。

$ heroku pgbackups --app heroku-hello-world
ID   | Backup Time         | Size   | Database
b001 | 2011/02/22 04:54.43 | 23.6KB | SHARED_DATABASE_URL

無料では2個まで

無料のBasicタイプでは、バックアップできるファイル数の上限は2個。

$ heroku pgbackups --app heroku-hello-world
ID   | Backup Time         | Size   | Database
b001 | 2011/02/22 04:54.43 | 23.6KB | SHARED_DATABASE_URL
b002 | 2011/02/22 05:29.41 | 23.6KB | SHARED_DATABASE_URL

上のように既にバックアップファイルが2個ある状態で、さらにバックアップをしようとすると、以下のようにエラーとなる。

$ heroku pgbackups:capture --app heroku-hello-world
DATABASE_URL  --backup-->  error
 !    must delete a backup before creating a new one

なので、古いほうを捨てて新しいファイルでバックアップをする。その場合は、以下のように--expireオプションを付ける。

$ heroku pgbackups:capture --expire --app heroku-hello-world
DATABASE_URL  --backup-->  b003
Capturing... done
Storing... done
$ heroku pgbackups --app heroku-hello-world
ID   | Backup Time         | Size   | Database
b002 | 2011/02/22 05:29.41 | 23.6KB | SHARED_DATABASE_URL
b003 | 2011/02/22 05:33.22 | 23.6KB | SHARED_DATABASE_URL

手動で削除

バックアップされているファイルを手動で削除する場合は、以下のdestroyを使う。

$ heroku pgbackups:destroy b003 --app heroku-hello-world
Backup b003 deleted.

リストア

現在バックアップされているファイルから、HerokuアプリのDBにリストアする場合は、以下のようにコマンドを実行する。

$ heroku pgbackups:restore b004 --app heroku-hello-world
SHARED_DATABASE_URL (DATABASE_URL)  <--restore--  b004
 !    WARNING: Potentially Destructive Action
 !    This command will affect the app: heroku-hello-world
 !    To proceed, type "heroku-hello-world" or re-run this command with --confirm heroku-hello-world
> heroku-hello-world
Retreiving... done
Restoring... done

ダウンロード

Heroku上でバックアップしたデータを、ローカルにダウンロードするには以下のように実行する。

$ heroku pgbackups:url b004 --app heroku-hello-world
[http://s3.amazonaws.com/hkpgbackups/...](http://s3.amazonaws.com/hkpgbackups/...)
$ curl "http://s3.amazonaws.com/hkpgbackups/..." -o b004.dump

上記のようにダウンロード用のURLが表示されるので、ブラウザを使って直接アクセスしてもダウンロード可能。

ダンプファイルをローカルのPostgreSQLにリストア

Herokuのドキュメントを参考に、以下のpg_restoreコマンドを使って、ダウンロードしたダンプファイルをローカルのPostgreSQLにリストアする。

$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U ruedap -d mydb b004.dump

-hでホスト名、-Uでユーザー名、-dでDB名を指定して、最後にリストアしたいダンプファイルを指定する。Railsアプリであれば、config/database.ymlにユーザー名やDB名は指定してあるはず。


HerokuにPG Backupsというアドオンが加わり、Heroku上のPostgreSQLからダンプ取得・リストアが簡単にできるようにな… - Sooey heroku の db バックアップ周り - HsbtDiary(2011-01-12) Herokuのpgbackupsからデータをリストアする - komagata [p0t]