Heroku Postgres バージョンのアップグレードメモ

2023/08/07に公開

概要

4年ほど前に構築したアプリケーションがあり、Heroku PostgresバージョンがEOLとなるのでアップグレードして!とのメールがHerokuからきてました。
Heroku Postrgresを利用していくうえでは避けて通れない作業です。

ユーザーは、おおよそ 3 年に 1 回アップグレードするように要求されます。
https://devcenter.heroku.com/ja/articles/heroku-postgres-version-support

公式ドキュメントの手順通りにすすめれば特に難しいことはないのですが、「エイリアス/アタッチメント」の概念や pg:promote で何が起こるかがちょっとややこしかったのでそこらへんについてのメモです。

アップグレードの手順

公式ドキュメントが用意されています。
https://devcenter.heroku.com/ja/articles/upgrading-heroku-postgres-databases

今回は以下の理由から pg:copy による方法を選択しました。

  • データ量が少ない(1GB未満)
  • ステージング環境は Essential層(Basicプラン)で pg:upgrade が使えないので、これを選択する場合は予行演習のためにプランを変更しなければならない

アップグレード中のメモ

公式ドキュメントの pg:copy でのアップグレード に沿ってすすめていきます。
手順3までは特に何も考えずにいけます。

手順4で新しいデータベースをプロモートすると、以下のようになります。
promote後の状態

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のエイリアスは HEROKU_POSTGRESQL_GOLD に生まれ変わった

サイトの動作確認を行うと、確かに新DBに接続されていることがわかります。
特に問題なければ旧DB( HEROKU_POSTGRESQL_GOLD )は削除します。
また、HEROKU_POSTGRESQL_AQUA というエイリアスも特に必要ないので削除しました。

これでアップグレード作業は完了です🎉

補足

アップグレード直後、pg:info で情報参照しようとしてもエラーが返される事象がありました。

Expected response to be successful, got 503

※ダッシュボードからの参照でも同じ

数十分経つと参照自体はできるようになりましたが、Statusが "Unavailable" のままだったりレコード数は反映されてなかったりという感じでした🤔
これらが最新状態に更新されるまではそれなりに時間かかるようです。

Discussion