読者です 読者をやめる 読者になる 読者になる

Heroku で Postgres のプランを切り替える

f:id:alea12:20160305112818p:plain

こういうメールが来たので、掲題の作業を実施しました。なんかダッシュボード上で数クリックすればできるもんだと思ってたんですが、意外と作業あった。参考にした公式マニュアルは以下です。

Upgrading Heroku Postgres Databases | Heroku Dev Center

1. 移行先 DB の準備

Heroku Postgres - Add-ons - Heroku Elements

ここを見て、使いたいプランを決めます。私は hobby-dev から hobby-basic へのアップグレードでした。

$ heroku addons:create heroku-postgresql:hobby-basic
Creating postgresql-graceful-xxxxx... done, ($9.00/month)
Adding postgresql-graceful-xxxxx to xxxxxx... done
Setting HEROKU_POSTGRESQL_SILVER_URL and restarting xxxxxx... done, v107
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Use `heroku addons:docs heroku-postgresql` to view documentation.
  • このプランは月 9 ドルだよ
  • HEROKU_POSTGRESQL_SILVER_URL という新しい環境変数を設定し、再起動したよ
  • DB まだ空だから、アップグレードしたい場合は pg:copy 使ってね

と言われます。 今回は hobby なのですぐ立ち上がりましたが、 Standard 以上のプランを選択した場合は DB が立ち上がるまでに数分かかる場合もあるようです。

2. メンテナンスモードへの移行

データベースへの新たな書き込みを防ぐために、一度アプリをメンテナンスモードに切り替えます。メンテナンスモードへ移行するだけでは dyno は自動的にスケールダウンされないようなので、それもやります。

$ heroku maintenance:on
Enabling maintenance mode for xxxxxx... done
$ heroku ps:scale worker=0
Scaling dynos... done, now running worker at 0:Free.

3. 新 DB へのデータ転送

  1. で作成した新 DB に pg:copy コマンドを使ってデータを転送します。 HEROKU_POSTGRESQL_SILVER のところは設定された環境変数にあわせて読み替えてください。
$ heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_SILVER --app xxxxxx

 !    WARNING: Destructive Action
 !    This command will remove all data from SILVER
 !    Data from DATABASE will then be transferred to SILVER
 !    This command will affect the app: xxxxxx
 !    To proceed, type "xxxxxx" or re-run this command with --confirm xxxxxx

> 

大事な作業なので注意して進めてね、内容を確認したらアプリの名前を入れてねと言われます。入れてエンターキーを押しましょう。するとしばらくして Copy completed と出ます。

4. アプリが新 DB を向くように

この段階ではまだアプリが旧 DB を向いているので、新 DB を向くようにします。例によって HEROKU_POSTGRESQL_SILVER のところは設定された環境変数にあわせて読み替えてください。

$ heroku pg:promote HEROKU_POSTGRESQL_SILVER

5. メンテナンス解除

解除します。これでアプリが新 DB を向いた状態で動きます。 heroku pg:info とかで確認可能。

$ heroku ps:scale worker=1
$ heroku maintenance:off
$ heroku pg:info
=== HEROKU_POSTGRESQL_COBALT_URL
Plan:        Hobby-dev
Status:      Available
Connections: 0/20
PG Version:  9.4.5
Created:     2016-02-04 07:30 UTC
Data Size:   9.9 MB
Tables:      6
Rows:        7501/10000 (In compliance, close to row limit)
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      postgresql-metric-15389

=== HEROKU_POSTGRESQL_SILVER_URL, DATABASE_URL
Plan:        Hobby-basic
Status:      Available
Connections: 2/20
PG Version:  9.4.6
Created:     2016-03-05 00:42 UTC
Data Size:   9.6 MB
Tables:      6
Rows:        7741/10000000 (In compliance)
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      postgresql-graceful-53227

早速 Web dyno と Heroku Scheduler の 2 プロセスが新しい DB につながっています。めでたし。