Skip Navigation
Show nav
Heroku Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up
View categories

Categories

  • Heroku のアーキテクチャ
    • Dyno (アプリコンテナ)
    • スタック (オペレーティングシステムイメージ)
    • ネットワーキングと DNS
    • プラットフォームポリシー
    • プラットフォームの原則
  • コマンドライン
  • デプロイ
    • Git を使用したデプロイ
    • Docker によるデプロイ
    • デプロイ統合
  • 継続的デリバリー
    • 継続的統合
  • 言語サポート
    • Node.js
    • Ruby
      • Bundler の使用
      • Rails のサポート
    • Python
      • Python でのバックグランドジョブ
      • Django の使用
    • Java
      • Maven の使用
      • Java でのデータベース操作
      • Play Framework の使用
      • Java の高度なトピック
      • Spring Boot の使用
    • PHP
    • Go
      • Go の依存関係管理
    • Scala
    • Clojure
  • データベースとデータ管理
    • Heroku Postgres
      • Postgres の基礎
      • Postgres Getting Started
      • Postgres のパフォーマンス
      • Postgres のデータ転送と保持
      • Postgres の可用性
      • Postgres の特別なトピック
    • Heroku Redis
    • Apache Kafka on Heroku
    • その他のデータストア
  • モニタリングとメトリクス
    • ログ記録
  • アプリのパフォーマンス
  • アドオン
    • すべてのアドオン
  • 共同作業
  • セキュリティ
    • アプリのセキュリティ
    • ID と認証
    • コンプライアンス
  • Heroku Enterprise
    • Private Space
      • インフラストラクチャネットワーキング
    • Enterprise Accounts
    • Enterprise Team
    • Heroku Connect (Salesforce 同期)
      • Heroku Connect の管理
      • Heroku Connect のリファレンス
      • Heroku Connect のトラブルシューティング
    • シングルサインオン (SSO)
  • パターンとベストプラクティス
  • Heroku の拡張
    • Platform API
    • アプリの Webhook
    • Heroku Labs
    • アドオンのビルド
      • アドオン開発のタスク
      • アドオン API
      • アドオンのガイドラインと要件
    • CLI プラグインのビルド
    • 開発ビルドパック
    • Dev Center
  • アカウントと請求
  • トラブルシューティングとサポート
  • Integrating with Salesforce
  • データベースとデータ管理
  • Heroku Postgres
  • Postgres の基礎
  • Heroku Postgres データベースのプランまたはインフラストラクチャの変更

Heroku Postgres データベースのプランまたはインフラストラクチャの変更

日本語 — Switch to English

最終更新日 2021年08月04日(水)

Table of Contents

  • アドオンのアップグレードでの更新
  • フォロワーの切り替えでの更新
  • pg:copy での更新
  • 古いプライマリデータベースのプロビジョニング解除

この記事では、Heroku Postgres データベースのプランまたは基礎となるインフラストラクチャを変更するために使用可能な方法について説明します。

この記事では、PostgreSQL プランとインフラストラクチャをアップグレードするプロセスについて説明しますが、それにより、場合によっては PostgreSQL バージョンも変更される可能性があります。PostgreSQL バージョンのアップグレードのみを行いたい場合は、「Upgrading Heroku Postgres Databases​」(Heroku Postgres データベースのアップグレード) を参照してください。

Heroku では、Postgres プランとインフラストラクチャ​を変更するための 3 つの方法がサポートされています。いずれの方法でも、更新中のデータ損失を防ぐために、ある程度のアプリケーションのダウンタイムが必要です。

​更新方法 ​説明
​heroku addons:upgrade ​メジャー PostgreSQL バージョンを保持しながら、本番データベースのプランとインフラストラクチャを更新します。

Standard、Premium、Private、または Shield 層のデータベースでのみ動作します。代替データベースを準備するための最大数時間 (その間、アプリケーションをアクティブなままにすることができる) と、切り替え中の 1 分未満のダウンタイムが必要です。すべてのデータベースフォロワーが新しいプライマリを再び指すようにします。

PostgreSQL の​マイナー​バージョンを最新の使用可能なバージョンにアップグレードするために使用できます。
​フォロワーの切り替え ​メジャー PostgreSQL バージョンを保持しながら、本番データベースのプランとインフラストラクチャを更新します。

Standard、Premium、Private、または Shield 層のデータベースでのみ動作します。フォロワーを準備するための最大数時間 (その間、アプリケーションをアクティブなままにすることができる) と、切り替え中の 1 分未満のダウンタイムが必要です。新しいプライマリを指すようにするには、フォロワーの再作成が必要です。

PostgreSQL の​マイナー​バージョンを最新の使用可能なバージョンにアップグレードするために使用できます。

一般には、フォロワーが再び指すだけであることや、メンテナンス実行のための Heroku で制御されるメカニズムのために、​addons:upgrade​ の方がフォロワーの切り替えより推奨されます。
​pg:copy ​すべての更新シナリオで動作します。Hobby 層のデータベースが関連するすべての変更 (このデータベースとの間の移行) に必要です。GB あたり約 3 分のダウンタイムが必要ですが、これは大きく変動する場合があります。新しいプライマリを指すようにするには、フォロワーの再作成が必要です。

​メジャー​ PostgreSQL バージョンをアップグレードするためにも使用できます。

アドオンのアップグレードでの更新

1. heroku addons:upgrade​ コマンドを実行する

このコマンドは、データベースをプランのアップグレードのために準備します。このプロセスは即時的ではなく、大規模なデータベースの場合は数時間かかる可能性があることに注意してください。

$ heroku addons:upgrade HEROKU_POSTGRESQL_LAVENDER_URL heroku-postgresql:premium-0 -a sushi

データベースでアップグレードの準備ができると、データベースの次回のスケジュールされたメンテナンスに関するメールを受信します。

2. スケジュールされたメンテナンスを実行する (または待機する)

準備ができると、addons:upgrade​ コマンドは、データベースでアップグレードを実行するメンテナンスのためにデータベースをスケジュールします。

これは、「Heroku Postgres のメンテナンスウィンドウ​」で説明されているメンテナンスメカニズムとまったく同じです。

データベースでメンテナンスを実行する準備ができたら、「Running maintenance manually​」(手動でのメンテナンス実行) を参照してください。メンテナンスが完了すると、データベースは、新しいプランに一致するハードウェア上で動作します。

データベースに 1 つ以上のフォロワーがある場合は、アップグレードメンテナンスが発生すると、Heroku はそれらのフォロワーが代替データベースを指すようにしようとします。フォロワーが代替データベースを指すようにするには、フォロワーデータベースを再起動する必要があります。

状況によって、フォロワーが代替データベースを指すようにすることができない場合は、別の代替データベースが自動的に準備されてプロモートされます。

フォロワーの切り替えでの更新

フォロワーの切り替えでデータベースを更新するには、次のようにします。

  1. 変更先のプランでフォロワーデータベース​をプロビジョニングし、それがプライマリデータベースに追いつくまで待ちます。プランの基礎となるハードウェアを更新するための変更しか行わない場合は、データベースの現在のプランと同じプランを選択します。
  2. アプリをメンテナンスモードにします。
  3. フォロワーをプライマリデータベースにプロモートします。
  4. メンテナンスモードを終了します。

フォロワーの切り替えにアプリのダウンタイムはほとんど必要ありません (通常は 1 分未満)。ただし、切り替えの前に、フォロワーの準備に数時間かかる (その間、アプリケーションは引き続きアクティブなまま) 場合があるため、それに応じて計画してください。

1. フォロワーデータベースをプロビジョニングする

データベースの新しいフォロワーを作成し、そのフォロワーがプライマリデータベースに追いつくまで待ちます。

$ heroku addons:create heroku-postgresql:standard-2 --follow HEROKU_POSTGRESQL_LAVENDER_URL --app sushi
Creating heroku-postgresql:standard-2 on sushi... $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 sushi
=== 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 sushi... done

3. フォロワーデータベースをプロモートする

メンテナンスモードになり、プライマリデータベースに追加データが書き込まれていない状態になったので、フォロワーデータベースをプロモートして現在のプライマリデータベースから引き継ぐことができます。

フォロワーデータベースがプライマリに完全に​追いつくまで待ちます (0 commits​ 遅れていることで示される)。

$ heroku pg:info --app sushi
=== 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 sushi
 ▸    WARNING: Destructive action
 ▸    postgresql-shaped-12345 will become writeable and no longer follow HEROKU_POSTGRESQL_LAVENDER. This cannot be undone.
 ▸
 ▸    To proceed, type sushi or re-run this command with --confirm sushi

> sushi
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 sushi
Promoting HEROKU_POSTGRESQL_WHITE_URL to DATABASE_URL on sushi... done

これで、フォロワーデータベースがプライマリデータベースになりました (ただし、アプリケーションはまだ新しいリクエストを受信していない)。

元のプライマリデータベースが複数のアプリにアタッチされていた場合は、heroku addons:attach​ を使用して新しいデータベースをこれらのアプリにアタッチする必要があります。

切り替えの後、元のプライマリデータベースの他の​フォロワーは、新しいプライマリのフォローを自動的に開始するようにはなりません​。

必要に応じて、新しいプライマリデータベースの新しいフォロワーを作成してください。

$ heroku addons:create heroku-postgresql:standard-0 --follow DATABASE_URL -a sushi

古いフォロワーが必要なくなったら、必ずプロビジョニング解除してください。

 

古いプライマリが接続プールを使用していて、デフォルト名の DATABASE_CONNECTION_POOL​ でアタッチされていた場合、プロモートにより、接続プーラーは同じ名前 DATABASE_CONNECTION_POOL​ で新しいプライマリに再アタッチされます。

デフォルト以外の名前のアタッチメントは再アタッチされません。新しいプライマリでも、古いプライマリと同じデフォルト以外の名前で接続プールを使用する場合は、新しいプライマリで接続プールをアクティブ化する必要があります。

$ heroku pg:connection-pooling:attach DATABASE_URL --as MY_DATABASE_CONNECTION_POOL -a sushi

4. メンテナンスモードを終了する

通常のアプリケーション操作を再開するには、Web 以外のすべての dyno を元のレベルにスケーリングします (たとえば、前に worker​ dyno をスケールダウンした場合は、heroku ps:scale worker=1​ を使用してそれを今度は元の状態にスケールアップする)。

最後に、メンテナンスモードをオフにします。

$ heroku maintenance:off
Disabling maintenance mode for sushi... done

アプリケーションが、更新されたデータベースインスタンスへのリクエストを受信するようになりました。これは、heroku pg:info​ を実行することによって確認できます。DATABASE_URL​ で示されるデータベースはプライマリデータベースとみなされます。

Heroku Postgres データベースが Heroku アプリケーションに接続されていない場合は、HEROKU_POSTGRESQL_WHITE_URL​ を取得し、それをプライマリデータベースとして使用するようにアプリケーションを更新する必要があります。

pg:copy での更新

pg:copy​ コマンドでは、サポートされているすべての Heroku Postgres プランおよびバージョン間での更新がサポートされます。さらに、これは Hobby 層​のデータベースに関連する更新 (このデータベースとの間のすべての移行) のためにサポートされている唯一の方法です。

pg:copy​ を使用するための手順は、「Upgrading Heroku Postgres Databases​」(Heroku Postgres データベースのアップグレード) で参照できます。

古いプライマリデータベースのプロビジョニング解除

フォロワーの切り替えまたは pg:copy​ のどちらかでデータベースを更新した後、古いプライマリデータベースを必ずプロビジョニング解除してください。

$ heroku addons:destroy HEROKU_POSTGRESQL_LAVENDER_URL

古いプライマリデータベースに関連付けられていたデータクリップを新しいデータベースに再割り当てする必要があります。すべての回復可能なデータクリップを解決するには、「Dataclip recovery​」(データクリップのリカバリ) の手順に従ってください。

関連カテゴリー

  • Postgres の基礎
適切な Heroku Postgres プランの選択 Heroku Postgres のプラン容量オーバー

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Podcasts
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing

Subscribe to our monthly newsletter

Your email address:

  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Heroku Podcasts
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Facebook
  • Instagram
  • Github
  • LinkedIn
  • YouTube
Heroku is acompany

 © Salesforce.com

  • heroku.com
  • Terms of Service
  • Privacy
  • Cookies
  • Cookie Preferences