Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Epictetus/3255167 to your computer and use it in GitHub Desktop.
Save Epictetus/3255167 to your computer and use it in GitHub Desktop.

共有データベース (Shared Database) から Heroku Postgres への移行について


Migrating from a Shared Database to Heroku Postgres を @jugyo が勝手に翻訳したものです(2012-08-04)。


    1. データベースの準備
    1. データの移行
    1. 共有データベースの利用停止
    1. Basic か Production Database の利用を開始する
  • FAQ

5 MB データベースは 8 月 9 日に、20 GB データベースは 9 月 1 日に自動的に移行されます。しかしこの日の前に移行することをを強く推奨します。データベースの移行にはダウンタイムを伴います。自分たちで移行する場合はこのダウンタイムを完全に制御できます。

自分で移行しないことにした場合、移行の日をリクエストすることができます。その日の移行が行われることを保証されませんが対応するために全力を尽くします。

移行の手順を以下にしめします。

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 のバイトデータ型の警告

postgres 8.X でバイト型のデータを使っていて 9.X に移行する場合、それらのバージョンにおけるエンコーディングに違いに注意する必要があります。詳細と、インポート前に問題を回避する方法はここ

2. データの移行

新しいデータが書き込まれるのを避けるためにメンテナンスモードに

移行プロセス中はアプリケーションに

移行プロセス中にアプリケーションに新しいデータが書き込まれた場合、これらは新しいデータベースに転送されないので、データの書き込みが行われないようにしなければなりません。そのためにアプリケーションをメンテナンス モードします:

$ 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 に使用できるコマンドを確認できます。

3. 共有データベースの利用停止

アプリケーションが復帰して、新しいデータベースを使って稼働していることを確認します。 heroku config を実行して DATABASE_URL と HEROKU_POSTGRESQL_COLOR が一致していることを確認できます。共有データベースを削除する準備が整いました:

$ heroku addons:remove shared-database

4. Basic か Production Database の利用を開始する

8月9日より前に自分で移行するユーザーに提案します:

  • Dev プランは 14,000 行扱えるようなります
  • Basic と Production プランは20ドル分のクレジットを受け取れます

8 月 9 日にアプリケーションを移行した場合、あなたのアプリケーションと私たちにアカウント情報を提出することによりお客様のクレジットを請求できる可能性があります。

クレジットを受け取るには8月のデータベースのプランが Basic か Production である必要があります。

FAQ

自分で移行しなかった場合はどうなるの?

自分で移行しなかった場合は、データベースを移行するために計画的なダウンタイムを決定します。その場合、5MB データベースなら8月9日から、20GB データベースなら9月1日からこのプロセスは始まります。遅くとも移行の24時間前にはお知らせします。

どうやって適切なプランを選べばいい?

legacydbs app で共有データベースの現在の行数を確認することができます。行数をもとに devbasic プランのどちらが必要かを決めることができます。

以下を実行して新しいデータベースの行数を調べることもできます:

heroku pg:info

この記事の内容が不正確だったり、古かったり、重要な情報が書かれていなかったりした場合はスタッフにお知らせください。その他のすべての問題は当社のサポートチャネルを参照してください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment