Herokuから以下の通知が来ました。
PostgreSQL 11 reaches End of Life on 2023-Nov-09. Due to security and operational concerns, Heroku cannot run unsupported software as a service. Therefore, the following database will need to be updated before 2023-Nov-09:
PostgreSQL 11は2023-11-09に終了を迎えます。Herokuでは、セキュリティや運用の観点から、サポート対象外のソフトウェアをサービスとして運用することができません。
PostgreSQL 11の終了の期限が迫ってきたので、重い腰を上げてバージョンを上げることにしました。実際やってみると思っていたより簡単に終わったので思いとどまっている方の参考になれば幸いです。
アップグレード方法の選定
基本的には公式のアップグレードガイドに沿った説明になっていますが、実際作業してみての所感などを追記していますので、合わせて確認するとより理解ができるかと思います。
PostgreSQLをアップグレードする方法は2つの選択肢があります。
- pg:upgradeを使用する方法
- pg:copyを使用する方法
私はpg:copyを使用する方法
を選択しました。
理由は以下のとおりです。
- pg:copyの方が作業がシンプルであるため
- DBは10GBを超えているがダウンタイムを許容できるため
- Database Bloat(使用されなくなったレコードによって占有される余分な領域)を解消したいため
アップグレード手順
1. 新しいデータベースを作成する
アップグレード後のデータベースを構築します。--versionを指定しない場合、2023/01/21時点ではversion 14が適用されます。
heroku addons:create heroku-postgresql:premium-2 -a your-appname
2. アプリをメンテナンスモードをオンにする
データベースへの書き込みを停止させるためにメンテナンスモードにします。
heroku maintenance:on -a your-appname
3. 新しいデータベースにコピーする
既存のデータベースの内容を新しいデータベースにコピーします。 HEROKU_POSTGRESQL_CYAN_URLの部分は新しいデータベースの名称です。PostgreSQLの管理画面やheroku pg:infoコマンドなどで確認できます。
heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_CYAN_URL -a your-appname
ちなみに私の環境の場合は20GB程度のコピーに15分ほど掛かりました。また、肥大化の部分がカットされて容量が8GB程度に下がりました。
4. 新しいデータベースに切り替える
新しいデータベースを使用するように切り替えます。
heroku pg:promote HEROKU_POSTGRESQL_CYAN_URL -a your-appname
5. アプリをメンテナンスモードをオフにする
メンテナンスモードをオフにします。以後アプリは新しいデータベースを使用するようになります。
heroku maintenance:off -a your-appname
6. 古いデータベースを削除する
アプリが安定稼働していることを確認したら、下記のコマンドまたは管理画面から古いデータベースを削除します。
heroku addons:destroy HEROKU_POSTGRESQL_LAVENDER -a your-appname
終わりに
以上で作業は終了です。思っていたよりも簡単にアップグレードできたので、一安心しました。 細かいことを意識しなくても手順に沿えばアップグレードできてしまうあたりは、さすがのHerokuだと改めて感心しました。