Heroku Postgres をアップグレードする手順

Heroku Postgres を Hobby Dev から有料プランにアップグレードする機会があり、色々選択肢がある中で迷い調べた内容のメモです。

結論

Hobby層をアップグレードするには、pg:copyを使ってアップグレードを行います。手順は下記に記載されているとおりです。
Heroku Postgres データベースのバージョンのアップグレード | Heroku Dev Center

アップグレードの方法

Heroku Postgres をアップグレードする方法は以下の3つがあります。

  • ​heroku addons:upgrade
  • ​フォロワーの切り替え
  • pg:copy

Heroku Postgres データベースのプランまたはインフラストラクチャの変更 | Heroku Dev Center

ただし、Hobby層(hobby-dev​hobby-basic)からのアップグレードをするには、pg:copyを使うのが唯一の手段です。

pg:copy​ コマンドでは、サポートされているすべての Heroku Postgres プランおよびバージョン間での更新がサポートされます。さらに、これは Hobby 層​のデータベースに関連する更新 (このデータベースとの間のすべての移行) のためにサポートされている唯一の方法です。
pg:copyの更新 - Heroku Postgres データベースのプランまたはインフラストラクチャの変更 | Heroku Dev Center

pg:copyでアップグレードしていく

アップグレードしたいプランでDBを新しく用意し、pg:copyで既存DBのレコードを移行する方法。
途中アプリをメンテナンスモードにする必要があるので、適切なタイミングを見計らってやる必要がある。

  1. 新しいプランのDBを用意する
    $ heroku addons:create heroku-postgresql:standard-0 --app hoge
    この時点で Heroku Postgres が既存と新規で2種類アタッチされた状態となる。下記コマンドで確認が可能。
    $ heroku pg:info --app hoge
    $ heroku pg:wait --app hoge
    # プロビジョニングが完了するまでローディング状態となり
    # プロビジョニングが完了したら available と表示される
  2. アプリをメンテナンスモードにする
    # アプリをメンテナンスモードにする
    # 利用者はアプリにアクセス出来ない状態となり、DBが書き換わるのを防ぐ
    $ heroku maintenance:on --app hoge
    
  3. 新規のDBにデータをコピーする 以下のコマンドで表示される新しいデータベース名を確認する。(例: HEROKU_POSTGRESQL_PINK)
    $ heroku pg:info --app hoge
    pg:copyを実行してデータをコピーする。
    $ heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_PINK --app hoge
    # アプリ名の入力を求められるので入力してEnter
  4. 新しいデータベースをプロモートする 作成されたデータベースをプライマリデータベースにする。
    $ heroku pg:promote HEROKU_POSTGRESQL_PINK
  5. メンテナンスモードを終了する
    $ heroku maintenance:off --app hoge

Source code