Heroku Postgres バージョンのアップグレードメモ
概要
4年ほど前に構築したアプリケーションがあり、Heroku PostgresバージョンがEOLとなるのでアップグレードして!とのメールがHerokuからきてました。
Heroku Postrgresを利用していくうえでは避けて通れない作業です。
ユーザーは、おおよそ 3 年に 1 回アップグレードするように要求されます。
https://devcenter.heroku.com/ja/articles/heroku-postgres-version-support
公式ドキュメントの手順通りにすすめれば特に難しいことはないのですが、「エイリアス/アタッチメント」の概念や pg:promote
で何が起こるかがちょっとややこしかったのでそこらへんについてのメモです。
アップグレードの手順
公式ドキュメントが用意されています。
今回は以下の理由から pg:copy
による方法を選択しました。
- データ量が少ない(1GB未満)
- ステージング環境は Essential層(Basicプラン)で
pg:upgrade
が使えないので、これを選択する場合は予行演習のためにプランを変更しなければならない
アップグレード中のメモ
公式ドキュメントの pg:copy でのアップグレード に沿ってすすめていきます。
手順3までは特に何も考えずにいけます。
手順4で新しいデータベースをプロモートすると、以下のようになります。
pg:promote
のコマンド内容を理解してなかったので、なんか増えた???となりました。
真相はここに書いてあるとおりです。
pg:promote
では、DATABASE_URL
環境設定の値が、新しくプロモートされたデータベースの接続文字列に更新されます。また、新しいHEROKU_POSTGRESQL_<color>_URL
環境設定に割り当てられた、古いプライマリデータベースの代替アタッチメントも作成されます。
https://devcenter.heroku.com/ja/articles/managing-heroku-postgres-using-cli#pg-promote
今回の場合はこういうこと:
-
HEROKU_POSTGRESQL_AQUA
が新DB(手順1で作成→手順3で旧DBからデータをコピーしたやつ)- このDBへの接続文字列が環境変数
DATABASE_URL
に設定される - 新DBとして作成したときのエイリアスは残されたままということ?
- このDBへの接続文字列が環境変数
- 旧DBのエイリアスは
HEROKU_POSTGRESQL_GOLD
に生まれ変わった
サイトの動作確認を行うと、確かに新DBに接続されていることがわかります。
特に問題なければ旧DB( HEROKU_POSTGRESQL_GOLD
)は削除します。
また、HEROKU_POSTGRESQL_AQUA
というエイリアスも特に必要ないので削除しました。
これでアップグレード作業は完了です🎉
補足
アップグレード直後、pg:info
で情報参照しようとしてもエラーが返される事象がありました。
Expected response to be successful, got 503
※ダッシュボードからの参照でも同じ
数十分経つと参照自体はできるようになりましたが、Statusが "Unavailable" のままだったりレコード数は反映されてなかったりという感じでした🤔
これらが最新状態に更新されるまではそれなりに時間かかるようです。
Discussion