PostgreSQL メジャーバージョンのアップグレードのテスト
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年03月09日(木)
Heroku では、Heroku Postgres アドオンのための PostgreSQL メジャーバージョンのアップグレードをテストしてから、本番データベースでアップグレードを実行することをお勧めします。
バージョンアップグレードをテストすることは、データベースまたはアプリケーションに影響を及ぼす可能性がある、考えられるすべてのアップグレードエラーや非互換性の問題を特定するのに役立ちます。テストを行うと、本番データベースをアップグレードするときにアプリケーションのダウンタイムを削減するのに役立ちます。
アップグレードの最も一般的な問題は、PostgreSQL バージョン間の型の非互換性やオブジェクトの参照または依存関係のエラーのほか、アプリまたはその PostgreSQL ドライバーのバージョンがターゲットの PostgreSQL バージョンをサポートしない場合の一般的なアプリケーションの問題に関するものです。
pg:upgrade
による PostgreSQL バージョンアップグレードのテスト
pg:upgrade
の方法は、Essential 層データベースを除くすべての Heroku Postgres データベースで推奨されています。
pg:upgrade
で PostgreSQL のバージョンアップグレードを実行するには、約 30 分間のアプリのダウンタイムが必要になります。この方法は、Essential 層プランを除くすべての Heroku Postgres プランでサポートされています。アップグレードに 30 分以上かかる場合は、サポートチケットを開いてください。
アップグレードプロセスをテストするには、完全なアップグレードプロセスを実行して検証するために、非本番アプリ上で既存の本番データベースをフォークします。
以下によって、ステージングアプリまたは非本番アプリ上に本番データベースのフォークが作成されます。
$ heroku addons:create heroku-postgresql:<database_plan> --fork production_app_name::DATABASE_URL --as PROD_DB_FORK -a staging_app_name
フォークされたデータベースの準備ができたら、バージョンアップグレードプロセスを開始し、そのフォロワーを作成します。
$ heroku addons:create heroku-postgresql:<database_plan> --follow staging_app_name::PROD_DB_FORK --as TEST_UPGRADE_FOLLOWER --app staging_app_name
テストフォロワーをアップグレードするには、この記事の手順に従います。データベースのバージョンアップグレードテストを実行するには、アップグレードされたデータベースを、非本番アプリケーションのプライマリデータベースとしてプロモートします。アプリケーションが期待どおりにデータベースと接続して通信できることを確認します。
$ heroku pg:promote TEST_UPGRADE_FOLLOWER --app staging_app_name
このアプローチにより、ユーザーは完全なアップグレードプロセスをテストし、本番環境でアップグレードするときにアップグレードの所要時間を見積もることができます。このプロセスは、(アプリケーションで古い PostgreSQL クライアントやドライバーを使用しない場合に) アプリケーションが新しい PG バージョンと互換性があることを確認するためにも役立ちます。
アップグレードのテストが完了したら、フォークされたデータベースとアップグレードされたフォロワーを削除できます。
もう 1 つのテストアプローチ
バージョンアップグレードのテストプロセスをスピードアップするために、別のアプローチとして、非本番環境に本番アプリケーションのフォロワーを作成する方法があります。pg:upgrade
をフォロワーで直接実行できます。
アップグレードされたデータベースを非本番環境内でプライマリデータベースとしてプロモートし、アプリケーションに新しいバージョンとの互換性があることを確認します。
pg:copy
による PostgreSQL バージョンアップグレードのテスト
pg:copy
の方法を使用して、PostgreSQL バージョンの Essential 層データベースまたは 10 GB 以下のデータベースをアップグレードします。
pg:copy
による PostgreSQL バージョンのアップグレードを実行するには、GB あたり約 3 分のダウンタイムが必要ですが、この量は大きく変動する場合があります。
アップグレードプロセスをテストするには、非本番アプリケーション上に新しいデータベースをプロビジョニングし、ターゲットの PostgreSQL バージョンを指定します。
$ heroku addons:create heroku-postgresql:<database_plan> --version=15 --as DATABASE_UPGRADE_TEST --app staging_app_name -
新しいデータベースが使用可能になったため、データを本番データベースから新しいデータベースにコピーします。
$ heroku pg:copy production_app_name::DATABASE_URL DATABASE_UPGRADE_TEST --app staging_app_name
データコピーが完了した後、データベースを非本番アプリケーションにプロモートし、アプリケーションが新しいバージョンと互換性があることを確認します。
$ heroku pg:promote DATABASE_UPGRADE_TEST --app staging_app_name
データコピープロセスが失敗した場合、heroku pg:backups:info <COPY_ID>
で入手できるログでエラーの詳細を調べてください。