Heroku Postgres データベースのプランまたはインフラストラクチャの変更
最終更新日 2025年02月26日(水)
この記事では、Heroku Postgres データベースのプランまたは基礎となるインフラストラクチャを変更するために使用可能な方法について説明します。
この記事では、PostgreSQL プランとインフラストラクチャを変更するプロセスについて説明しますが、これにより場合によっては PostgreSQL バージョンもアップグレードされる可能性があります。PostgreSQL バージョンのアップグレードのみを行いたい場合は、「Heroku Postgres データベースのバージョンのアップグレード」を参照してください。
Heroku では、Postgres プランとインフラストラクチャを変更するための 3 つの方法がサポートされています。いずれの方法でも、プロセス中のデータ損失を防ぐために、ある程度のアプリケーションのダウンタイムが必要です。
プラン変更方法 | 説明 |
---|---|
heroku addons:upgrade | 説明: 主要な PostgreSQL バージョンを維持しながら、本番データベースのプランとインフラストラクチャを更新します。 互換性のあるプラン: すべての Heroku Postgres プランで動作します。このコマンドを使用すると、Essential 層のデータベースをその層内の別のプランに変更できます。Essential 層のデータベースを他の層のプランに変更するには、代わりに pg:copy を使用します。必要なダウンタイム: 代替データベースを準備するための最大数時間 (その間、アプリケーションをアクティブなままにすることができる) と、切り替え中の 1 分未満のダウンタイムが必要です。 フォロワーデータベース: すべてのデータベースフォロワーが新しいプライマリを再び指すようにします。 |
フォロワーの切り替え | 説明: 主要な PostgreSQL バージョンを維持しながら、本番データベースのプランとインフラストラクチャを更新します。 互換性のあるプラン: Standard、Premium、Private、または Shield 層のデータベースでのみ動作します。 必要なダウンタイム: フォロワーデータベースを準備するための最大数時間 (その間、アプリケーションをアクティブなままにすることができる) と、切り替え中の 1 分未満のダウンタイムが必要です。 フォロワーデータベース: 新しいプライマリを指すようにするには、フォロワーの再作成が必要です。 一般には、フォロワーが再び指すだけであることや、メンテナンス実行のための Heroku で制御されるメカニズムのために、 addons:upgrade の方がフォロワーの切り替えより推奨されます。 |
pg:copy | 説明: プラン変更のあらゆるシナリオで動作します。Essential 層のデータベースプランを別の層のプランに変更する場合に必要です。 バージョンアップグレード: メジャー PostgreSQL バージョンをアップグレードするために使用できます。 必要なダウンタイム: GB あたり約 3 分のダウンタイムが必要ですが、この量は大きく変動する場合があります。 フォロワーデータベース: 新しいプライマリを指すようにするには、フォロワーの再作成が必要です。 |
addons:upgrade での変更
Essential 層
Essential 層のデータベースプランを同じ層の別のプランに変更するには、addons:upgrade
を実行すると、定期的なメンテナンスを待ったり実行したりすることなく、すぐにプラン変更が開始されます。
$ heroku addons:upgrade HEROKU_POSTGRESQL_CRIMSON_URL heroku-postgresql:essential-1 -a example-app
Changing HEROKU_POSTGRESQL_CRIMSON_URL on example-app from heroku-postgresql:essential-0 to heroku-postgresql:essential-1... done, ~$0.012/hour (max $9/month)
Your database's plan is being changed from essential-0 to essential-1.
addons:upgrade
を実行して essential-*
プランを変更するとデータベースが読み取り専用モードになるため、プラン変更中に書き込みは行われません。プラン変更を開始する前にアプリをメンテナンスモードにして、プロセス中にデータベースに新しいデータが書き込まれないようにすることもできます。プラン変更により、選択した Essential プランの新しいデータベースにデータが転送され、環境設定が新しい Essential データベースを指すように更新されます。
Standard 層およびそれ以上
addons:upgrade
を使用して、Standard 層以上のデータベースを Essential 層のデータベースに変更することはできません。代わりに、pg:copy
を使用できます。
addons:upgrade
を使用してデータベースプランを変更するには、次の手順を実行します。
- データベース上で
heroku addons:upgrade
を実行します。 - スケジュールされたメンテナンスを実行する (または待機する)
addons:upgrade
を使用して変更する場合、アプリのダウンタイムはほとんど発生しません (1 分未満)。ただし、切り替えの前に、代替データベースの準備に数時間かかる (その間、アプリケーションは引き続きアクティブなまま) 場合があるため、それに応じて計画してください。
1.heroku addons:upgrade
コマンドを実行する
このコマンドはデータベースのプラン変更を準備します。このプロセスは即時的ではなく、大規模なデータベースの場合は数時間かかる可能性があります。
$ heroku addons:upgrade HEROKU_POSTGRESQL_LAVENDER_URL heroku-postgresql:premium-4 -a example-app
Changing HEROKU_POSTGRESQL_LAVENDER_URL on tc-data-test from heroku-postgresql:standard-0 to heroku-postgresql:premium-4... done, ~$1.042/hour (max $750/month)
Your database's plan is being changed.
This triggers a maintenance that you can run with `heroku data:maintenances:run`.
データベースでプラン変更の準備ができると、データベースの次回のスケジュールされたメンテナンスに関するメールを受信します。
2. スケジュールされたメンテナンスを実行する (または待機する)
準備ができると、addons:upgrade
コマンドはデータベースのメンテナンスをスケジュール設定して、データベースのプラン変更を実行します。
このプロセスは、「Heroku Postgres のメンテナンスウィンドウ」で説明されているメンテナンスメカニズムと同じです。
データベースでメンテナンスを実行する準備ができたら、「Running maintenance manually」(手動でのメンテナンス実行) を参照してください。メンテナンスが完了すると、データベースは、新しいプランに一致するハードウェア上で動作します。
データベースに 1 つ以上のフォロワーがある場合は、プラン変更メンテナンスが発生すると、Heroku はフォロワーの接続先を代替データベースに変更しようとします。フォロワーが代替データベースを指すようにするには、フォロワーデータベースを再起動する必要があります。状況によって、フォロワーが代替データベースを指すようにすることができない場合は、別の代替データベースが自動的に準備されてプロモートされます。
プラン変更を停止する場合は、このヘルプ記事を参照してください。
フォロワーの切り替えでの変更
フォロワーの切り替えを伴うプランの変更には、次の手動手順が必要です。
- 変更先のプランでフォロワーデータベースをプロビジョニングし、それがプライマリデータベースに追いつくまで待ちます。プランの基礎となるハードウェアを更新するための変更を行う場合は、データベースの現在のプランと同じプランを選択します。
- アプリをメンテナンスモードにします。
- フォロワーをフォロー解除して、プライマリデータベースにプロモートします。
- メンテナンスモードを終了します。
方法をより自動化する場合は、addons:upgrade
を使用してください。
切り替え前にフォロワーを準備し、アプリをメンテナンスモードにする一連の手動作業を完了するには数時間かかることがあるため、事前に計画を立ててください。手順を準備した後でフォロワーを切り替えると、通常、アプリのダウンタイムが 1 分未満で完了します。
1. フォロワーデータベースをプロビジョニングする
データベースのフォロワーを作成し、そのフォロワーがプライマリデータベースに追いつくまで待ちます。
addons:create
の例は Heroku CLI v9.0.0 以降の構文に従っています。v8.11.5 以前を使用している場合は、次のコマンドを使用してください。
$ heroku addons:create heroku-postgresql:standard-2 --follow HEROKU_POSTGRESQL_LAVENDER_URL --app example-app
$ heroku addons:create heroku-postgresql:standard-2 --app example-app -- --follow HEROKU_POSTGRESQL_LAVENDER_URL
Creating heroku-postgresql:standard-2 on example-app... $200/month
! WARNING: Follower will become available for read-only queries when up-to-date.
Use `heroku pg:wait` to track status.
postgresql-shaped-12345 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-shaped-12345 to check creation progress
$ heroku addons:wait
Creating postgresql-shaped-12345... done
Created postgresql-shaped-12345 as HEROKU_POSTGRESQL_WHITE_URL
フォロワーは、プライマリデータベースまで 200 コミット以内のときに “追いついた” と見なされます。フォロワーが遅れているコミット数は、pg:info
コマンドを使用して確認できます (フォロワーデータベースの Behind By
行を参照)。
$ heroku pg:info --app example-app
=== HEROKU_POSTGRESQL_LAVENDER
Plan: Standard 0
Status: Available
...
=== HEROKU_POSTGRESQL_WHITE
Plan: Standard 2
Status: Available
...
Following: HEROKU_POSTGRESQL_LAVENDER (DATABASE_URL)
Behind By: 125 commits
2. データベースの書き込みを防止するためにメンテナンスモードにする
プラン変更プロセス中に、新しいデータは新しいデータベースに転送されないため、現在のプライマリデータベースに新しいデータが書き込まれないようにすることが重要です。これを行うには、アプリをメンテナンスモードにします。スケジューラージョブも実行されている場合は、これを無効にします。
メンテナンスモードでは、dyno が自動的にはスケールダウンされません。どの接続もデータベースにデータを書き込んでいないようにするために、Web dyno や Web 以外の dyno をスケールダウンします (heroku ps:scale worker=0
など)。
変更するデータベースが Heroku Connect を使用している場合、この時点で同期を一時停止し、接続がデータベースへのデータの書き込みを行わないようにしてください。手順は、「Heroku Connect: データベースのアップグレード」に記載されています。
プラン変更プロセスのこの時点から、アプリケーションは使用できなくなります。
$ heroku maintenance:on
Enabling maintenance mode for example-app... done
3. フォロワーデータベースをプロモートする
メンテナンスモードになり、プライマリデータベースに追加データが書き込まれていない状態になったので、フォロワーデータベースをプロモートして現在のプライマリデータベースから引き継ぐことができます。
フォロワーデータベースがプライマリに完全に追いつくまで待ちます (0 commits
遅れていることで示される)。
$ heroku pg:info --app example-app
=== HEROKU_POSTGRESQL_LAVENDER_URL
Plan: Standard 0
Status: available
...
=== HEROKU_POSTGRESQL_WHITE_URL
Plan: Standard 2
Status: available
...
Following: HEROKU_POSTGRESQL_LAVENDER_URL (DATABASE_URL)
Behind By: 0 commits
フォロワーが追いつき、新しいデータが生成されなくなったら、unfollow
コマンドを発行して、フォロワーを完全な書き込み可能なデータベースに変換します。
$ heroku pg:unfollow HEROKU_POSTGRESQL_WHITE_URL --app example-app
▸ WARNING: Destructive action
▸ postgresql-shaped-12345 will become writeable and no longer follow HEROKU_POSTGRESQL_LAVENDER. This cannot be undone.
▸
▸ To proceed, type example-app or re-run this command with --confirm example-app
> example-app
postgresql-shaped-12345 unfollowing... done
フォロー解除が成功すると、pg:info
により、データベースがその親のフォークになったことが示されます (Forked From: HEROKU_POSTGRESQL_LAVENDER
)。
新しいデータベースで読み書き可能な接続の準備ができると false
を返す SQL コマンド SELECT pg_is_in_recovery();
を実行することによって、データベースが読み取り専用モードでなくなったことも確認できます。
次に、それをプロモートして、アプリケーションによって使用されるプライマリデータベース (場所は DATABASE_URL
) として設定します。
$ heroku pg:promote HEROKU_POSTGRESQL_WHITE_URL --app example-app
Promoting HEROKU_POSTGRESQL_WHITE_URL to DATABASE_URL on example-app... done
これで、フォロワーデータベースがプライマリデータベースになりました (ただし、アプリケーションはまだ新しいリクエストを受信していない)。
元のプライマリデータベースが複数のアプリにアタッチされていた場合は、heroku addons:attach
を使用して新しいデータベースをこれらのアプリにアタッチする必要があります。
切り替えの後、元のプライマリデータベースの他のフォロワーは、新しいプライマリのフォローを自動的に開始するようにはなりません。新しいプライマリデータベースを指すようにフォロワーを再作成する必要があります。
必要に応じて、新しいプライマリデータベースのフォロワーを作成してください。Heroku CLI v9.0.0 以降を使用している場合は、次のコマンドを実行します。
$ heroku addons:create heroku-postgresql:standard-0 -a example-app -- --follow DATABASE_URL
Heroku CLI v8.11.5 以前を使用している場合は、次のコマンドを実行します。
$ heroku addons:create heroku-postgresql:standard-0 --follow DATABASE_URL -a example-app
古いフォロワーが必要なくなったら、必ずプロビジョニング解除してください。
古いプライマリが接続プールを使用していて、デフォルト名の DATABASE_CONNECTION_POOL
でアタッチされていた場合、プロモートにより、接続プーラーは同じ名前 DATABASE_CONNECTION_POOL
で新しいプライマリに再アタッチされます。
デフォルト以外の名前のアタッチメントは再アタッチされません。新しいプライマリでも、古いプライマリと同じデフォルト以外の名前で接続プールを使用する場合は、新しいプライマリで接続プールをアクティブ化する必要があります。
$ heroku pg:connection-pooling:attach DATABASE_URL --as MY_DATABASE_CONNECTION_POOL -a example-app
4. メンテナンスモードを終了する
通常のアプリケーション動作を再開するには、Web dyno 以外のスケールを元のレベルに戻します。たとえば、worker
dyno を以前スケールダウンした場合、heroku ps:scale worker=1
を使用してそれを今度は元の状態にスケールアップします。
最後に、メンテナンスモードをオフにします。
$ heroku maintenance:off
Disabling maintenance mode for example-app... done
これで、アプリケーションはデータベースインスタンスへのリクエストを受信するようになりました。heroku pg:info
を実行して、メンテナンスモードがオフになっていることを確認できます。DATABASE_URL
で示されるデータベースはプライマリデータベースとみなされます。
Heroku Postgres データベースが Heroku アプリケーションに接続されていない場合は、HEROKU_POSTGRESQL_WHITE_URL
を取得し、それをプライマリデータベースとして使用するようにアプリケーションを更新する必要があります。
pg:copy での変更
pg:copy
コマンドは、サポートされているすべての Heroku Postgres プラン間のプラン変更とバージョンアップグレードをサポートしています。さらに、Essential 層のデータベースを別の層のプランに変更するにはこの方法のみが唯一サポートされています。
pg:copy
を使用するための手順は、「Upgrading Heroku Postgres Databases」(Heroku Postgres データベースのアップグレード) で参照できます。
古いプライマリデータベースのプロビジョニング解除
フォロワーの切り替えまたは pg:copy
のどちらかでデータベースプランを変更した後、古いプライマリデータベースを必ずプロビジョニング解除してください。
$ heroku addons:destroy HEROKU_POSTGRESQL_LAVENDER_URL
古いプライマリデータベースに関連付けられていたデータクリップを新しいデータベースに再割り当てする必要があります。すべての回復可能なデータクリップを解決するには、「Dataclip recovery」(データクリップのリカバリ) の手順に従ってください。