Migrating from a Shared Database to Heroku Postgres を @jugyo が勝手に翻訳したものです(2012-08-04)。
-
- データベースの準備
-
- データの移行
-
- 共有データベースの利用停止
-
- Basic か Production Database の利用を開始する
- FAQ
5 MB データベースは 8 月 9 日に、20 GB データベースは 9 月 1 日に自動的に移行されます。しかしこの日の前に移行することをを強く推奨します。データベースの移行にはダウンタイムを伴います。自分たちで移行する場合はこのダウンタイムを完全に制御できます。
自分で移行しないことにした場合、移行の日をリクエストすることができます。その日の移行が行われることを保証されませんが対応するために全力を尽くします。
移行の手順を以下にしめします。
最初に、データベースを準備します。プランを決めていない場合は legacydbs app を参考にしてください。
$ heroku addons:add heroku-postgresql:dev -a your_app
Adding heroku-postgresql to postgres... done, v326 (free)
Attached as HEROKU_POSTGRESQL_TEAL
Database has been created and is available
Use `heroku addons:docs heroku-postgresql` to view documentation
次に, Heroku PG Backups をインストール:
$ heroku addons:add pgbackups
Adding pgbackups to myapp... done
postgres 8.X でバイト型のデータを使っていて 9.X に移行する場合、それらのバージョンにおけるエンコーディングに違いに注意する必要があります。詳細と、インポート前に問題を回避する方法はここ。
移行プロセス中はアプリケーションに
移行プロセス中にアプリケーションに新しいデータが書き込まれた場合、これらは新しいデータベースに転送されないので、データの書き込みが行われないようにしなければなりません。そのためにアプリケーションをメンテナンス モードします:
$ heroku maintenance:on
デフォルトでは、 backup
および restore
は現在のデータベースで動作します。また、 restore
はデフォルトで最新のバックアップを対象とします。
現在のデータベースのバックアップをキャプチャします:
$ heroku pgbackups:capture --expire
DATABASE_URL ----backup---> b001
Capturing... done
Storing... done
コマンドを実行する時に一度この操作を確認してください。
新しいデータベースにバックアップをリストア:
$ heroku pgbackups:restore HEROKU_POSTGRESQL_COLOR
HEROKU_POSTGRESQL_COLOR_URL <---restore--- b001 (most recent)
SHARED_DATABASE_URL
2011/03/08 09:41.57
543.7MB
(DB URL を heroku config | grep POSTGRESQL
で簡単に調べることができます。DB URL はこのような形式です HEROKU_POSTGRESQL_[random_color]_URL 。例: HEROKU_POSTGRESQL_PURPLE_URL
同じアプリケーションに接続されている複数のデータベースを区別できるように DB URL に「色」を割り当てています。色には特に意味はありません。
アプリケーションのプライマリ データベースに新しいデータベースを設定します:
$ heroku pg:promote HEROKU_POSTGRESQL_COLOR
Setting config variable DATABASE_URL to HEROKU_POSTGRESQL_COLOR_URL
完了したら、データが正しく移行できたことを確認します。
$ heroku pg:psql HEROKU_POSTGRESQL_COLOR
=> select count(*) from users;
count
-------
17454
(1 row)
データベースを使う準備が整っていたら、メンテナンスモードを切ります。
$ heroku maintenance:off
データが正常に移行された(つまり、アプリケーションが機能していて、すべてのデータがあること)ことを確認したら、古いデータベースを削除 (または、共有 DB 無料プランにダウン グレード) することができます。
リストアされたばかりのデータベースは最初、しばしばパフォーマンスの低下に苦しみます。パフォーマンスは、データベースを使用して Postgres がクエリ計画のための統計情報を収集することで向上します。このプロセスをスピードアップするために新しいデータベースで ANALYZE
を実行するとよいでしょう。
マニュアルページ で Heroku Postgres に使用できるコマンドを確認できます。
アプリケーションが復帰して、新しいデータベースを使って稼働していることを確認します。 heroku config
を実行して DATABASE_URL と HEROKU_POSTGRESQL_COLOR が一致していることを確認できます。共有データベースを削除する準備が整いました:
$ heroku addons:remove shared-database
8月9日より前に自分で移行するユーザーに提案します:
- Dev プランは 14,000 行扱えるようなります
- Basic と Production プランは20ドル分のクレジットを受け取れます
8 月 9 日にアプリケーションを移行した場合、あなたのアプリケーションと私たちにアカウント情報を提出することによりお客様のクレジットを請求できる可能性があります。
クレジットを受け取るには8月のデータベースのプランが Basic か Production である必要があります。
自分で移行しなかった場合は、データベースを移行するために計画的なダウンタイムを決定します。その場合、5MB データベースなら8月9日から、20GB データベースなら9月1日からこのプロセスは始まります。遅くとも移行の24時間前にはお知らせします。
legacydbs app で共有データベースの現在の行数を確認することができます。行数をもとに dev か basic プランのどちらが必要かを決めることができます。
以下を実行して新しいデータベースの行数を調べることもできます:
heroku pg:info
この記事の内容が不正確だったり、古かったり、重要な情報が書かれていなかったりした場合はスタッフにお知らせください。その他のすべての問題は当社のサポートチャネルを参照してください。