ローカルで dump した PostgreSQL のバックアップを Heroku に restore する

ローカルの動作環境は以下の通り.

まず heroku で pgbackups という addon を導入しておく.現時点では以下のコマンドで OK*1

$ heroku update
$ heroku addons:add pgbackups

Heroku ではない何処かに既にある PostgreSQL のデータベースを dump しておき,それをどこか DL 可能な場所にアップする.

私の場合は,自前のサーバからバックアップし,自前の web サーバにアップした.

# まずバックアップ
$ su - postgres
$ pg_dump <DATABASENAME> -F c -f <DUMPFILE>
$ cp <DUMPFILE> <どこか>
$ exit

で, をどこか HTTP で DL 可能な場所にアップする.
そこの URL を とする.

まず heroku pgbackups のヘルプを読んでみる.

$ heroku pgbackups --help
Usage: heroku pgbackups

 list captured backups

Additional commands, type "heroku help COMMAND" for more details:

  pgbackups:capture [DATABASE]                           # capture a backup from a database id
  pgbackups:destroy BACKUP_ID                            # destroys a backup
  pgbackups:restore [<DATABASE> [BACKUP_ID|BACKUP_URL]]  # restore a backup to a database
  pgbackups:url [BACKUP_ID]                              # get a temporary URL for a backup

上記のように書いてあるので,pgbackups:restore を試してみる.

$ heroku pgbackups:restore <DATABASENAME> <DUMPFILE_URL>

すると,以下のようなエラーが.

 !    Could not resolve database <DATABASENAME>
 !
 !    Available databases:
 !    SHARED_DATABASE (DATABASE_URL)
[1]

よく分からないが SHARED_DATABASE が Available とのことなので,以下のコマンドを打ってみる.

$ heroku pgbackups:restore SHARED_DATABASE <DUMPFILE_URL>

すると以下のような出力があり,破壊的な動作だからと警告が出ている.

SHARED_DATABASE (DATABASE_URL)  <---restore---  <DUMPFILE>

 !    WARNING: Potentially Destructive Action
 !     This command will affect the app: <CUSTOM_DOMAIN>
 !    To proceed, type "<CUSTOM_DOMAIN>" or re-run this command with --confirm <CUSTOM_DOMAIN>

> 

ここで入力待ちになっている.処理をするために, と入力するか --confirm とオプションを付けてコマンドをもう一回実行しろと言っている.なので と入力する.

> <CUSTOM_DOMAIN>
Retrieving... done
Restoring... done

ここで特にエラーも出ずに終了.

そして http://.herokuapp.com にブラウザからアクセスして確認すると,restore がちゃんと出来ていた.データベースの中身がちゃんと入っていた.

すごい!

そもそもなんでこんなことになったかって… development 環境で,動作確認のためだったのに本番に入れていいデータを 10 件くらい入力してしまっていて,これをまた入力するのめんどいな… そのまま restore 出来ないのかな… となったからです ^^;

本番環境に restore するって,ちょっとおかしいためなのかその方法を書いてる記事が見つかりませんでした.バックアップの手法の解説は公式のマニュアルも含めて 3 件ほど見つけましたが…

普通に再度入力した方が明らかに早かったですが,いい練習にはなりましたw

ちなみに,db/schema.rb はローカルも Heroku 側も一致してないとダメ…だと思います.私が今回試したこの例では,一致していました.違っていると,restore 時にエラーが出るのかもしれません.

あと SHARED_DATABASE ってのが何のことなのかよく分からないので,どなたかご存知でしたらご教授下さい (他力本願).

あとそもそも外部に PostgreSQL の database があるなら,heroku_external_db なる gem がある (nbudin/heroku_external_db - GitHub) そうなので,これ使う方がいいかもしれません.まだ私は使ってないので詳しくは分かりませんが…←heroku_external_db は MySQL を使うためのもののようです.PostgreSQL ならそもそも gem なんて無くて良かった.そのための方法を以下にまずは簡単に追記

2011-12-24T23:08:00+09:00 追記

heroku config コマンドで,Heroku のデプロイされた環境における環境変数が確認出来る.ここで,DATABASE_URL という値があるが,これがデフォルトだと

DATABASE_URL => postgres://なんじゃらかんじゃらamazonaws.com/なんとか

となっているはずである.(これは SHARED_DATABASE_URL の値と同じになっているはずである.) 実は,ここを自分で作った DB に接続出来るものに書き換えるだけで,外部の PostgreSQL の DB が使える.変更の方法は以下の通り.

heroku config:add DATABASE_URL=postgres://<USRENAME>:<PASSROD>@<HOSTNAME or IPADDRESS>:<PORT>/<DATABASENAME>

この辺の仕様に関しては,PostgreSQL の領域である.

これで私は今現在,sakura VPS 512 上に用意した PostgreSQL に Heroku から接続してやることに成功している.

追記ここまで

参考記事

追加 2011-12-24T23:08:00+09:00

*1:半年も経過すると変わっている可能性は非常に高い