ローカルで dump した PostgreSQL のバックアップを Heroku に restore する
ローカルの動作環境は以下の通り.
- sakura VPS 512
- Ubuntu 10.04 LTS
- PostgreSQL 8.4
- heroku-gem 2.16.2
まず 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
で,
そこの 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> >
ここで入力待ちになっている.処理をするために,
> <CUSTOM_DOMAIN> Retrieving... done Restoring... done
ここで特にエラーも出ずに終了.
そして http://
すごい!
そもそもなんでこんなことになったかって… 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 から接続してやることに成功している.
追記ここまで
参考記事
- pg_dump
- Heroku | Dev Center | Heroku PG Backups
- HerokuでDBのデータをバックアップする - アインシュタインの電話番号
- HerokuにPG Backupsというアドオンが加わり、Heroku上のPostgreSQLからダンプ取得・リストアが簡単にできるようにな... - Sooey ※情報は古い
追加 2011-12-24T23:08:00+09:00
- Heroku | Dev Center | Heroku PostgreSQL # Specifying and Promoting Databases
- 他ホストから接続するための設定 (PostgreSQL)
- HerokuでWebアプリ開発を始めるなら知っておきたいこと (5)環境変数ENV - アインシュタインの電話番号
*1:半年も経過すると変わっている可能性は非常に高い