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年11月03日(水)

Table of Contents

  • データベースのメンテナンスが必要かどうかの確認
  • メンテナンスウィンドウの設定
  • 手動でのメンテナンス実行
  • メンテナンスの種類
  • 制限
  • よくある質問

メンテナンスタスクを実行するために、Heroku において Heroku Postgres データベースをオフラインにすることが必要な場合があります。典型的なタスクには、データベースの基盤となるインフラストラクチャの更新 (例: オペレーティングシステムや必要なライブラリへのパッチ適用) や Postgres 自体のアップグレードなどがあります。このメンテナンスは Heroku によって自動的に処理されます。

メンテナンスウィンドウは、すべての本番環境用データベースプランで利用できます。

データベースのメンテナンスが必要かどうかの確認

データベースのメンテナンスが必要かどうかは、pg:info​ を使用して確認できます。

$ heroku pg:info -a sushi
=== DATABASE_URL
Plan:           Standard 4
Status:         Available
Data Size:      26.1 MB
...
Maintenance:    required by 2018-05-04 21:00:00 +0000
Maintenance:    scheduled for 2018-05-01 14:30:00 +0000, required by 2018-05-04 21:00:00 +0000, replacement currently being prepared
Maintenance window:    Tuesdays 14:30 to 18:30 UTC

pg:maintenance​ コマンドで確認することもできます。

$ heroku pg:maintenance DATABASE -a sushi
Maintenance scheduled for 2018-05-01 14:30:00 +0000, required by 2018-05-04 21:00:00 +0000, replacement currently being prepared, window is Tuesdays 14:30 to 18:30 UTC

メンテナンスウィンドウの設定

一部の Heroku Postgres プランでは、データベースのメンテナンスウィンドウを指定できます。ウィンドウが始まる曜日と時刻 (UTC) を指定できます。

$ heroku pg:maintenance:window DATABASE "Sunday 14:30" -a sushi

メンテナンスウィンドウを設定することで、メンテナンスがアプリケーションとユーザーに及ぼす影響を最小化できます。メンテナンスがビジネスに及ぼす影響が最も小さい時期を選ぶことをお勧めします。

メンテナンスウィンドウの長さは 4 時間です。Heroku では、指定されたウィンドウの開始時刻にできるだけ近い時間からメンテナンスを開始するよう配慮しています。メンテナンスの所要時間は不定ですが、通常、データベースがオフラインになるのは 10 ~ 60 秒だけです。

指定するウィンドウは、heroku pg:maintenance​ コマンドによって示される required by​ の時刻よりも早く終了する必要があることに注意してください。

メンテナンスの再スケジュール

データベースのメンテナンスウィンドウは、pg:maintenance:window​ コマンドをもう一度実行して、ウィンドウの新しい開始時刻を指定するだけで変更できます。

手動でのメンテナンス実行

利用中の Heroku Postgres プランでメンテナンスウィンドウがサポートされている場合、Heroku CLI を使用した手動でのメンテナンス実行もサポートされています。

手動でメンテナンスを実行する前に、まず、データベースに関連付けられているアプリをメンテナンスモード​にすることをお勧めします。

メンテナンスモードが有効な場合

次のコマンドは、アプリをメンテナンスモードにして、関連付けられたデータベースで手動メンテナンスを実行する方法を示しています。

$ heroku maintenance:on -a sushi
Enabling maintenance mode for ⬢ sushi... done

$ heroku pg:maintenance:run DATABASE -a sushi
Starting maintenance for postgresql-clean-29349... done

$ heroku maintenance:off -a sushi
Disabling maintenance mode for ⬢ sushi... done

メンテナンスモードが無効な場合

最初にメンテナンスモードを有効にせずに手動メンテナンスを実行するには、--force​ フラグが必要です。

$ heroku pg:maintenance:run DATABASE --force -a sushi

これにより、次の実行可能なウィンドウでメンテナンスが実行されます。

メンテナンスの種類

データベースのメンテナンスを実行するとき、Heroku では再起動、切り替え、フェイルオーバーのいずれかの戦略を使用します。使用される戦略は、メンテナンスの性質と、データベースに関連付けられたプランによって異なります。

たとえば、高可用性 (HA) プラン (Premium、Private、Shield) では、データベースが別のデータベースのフォロワー​である場合を除き、Heroku は可能であれば常にフェイルオーバー戦略を使用します。HA 非対応プラン (Standard) と、すべてのフォロワーデータベース (プラン不問) では、Heroku は通常、切り替え戦略を使用します。

1 つ以上のフォロワーがあるデータベースでフェイルオーバーまたは切り替えのメンテナンスが発生した場合、Heroku はフォロワーのポイント先を代替データベースに変更しようとします。フォロワーのポイント先を代替データベースに変更するには、フォロワーデータベースを再起動する必要があります。

状況によっては、フォロワーのポイント先を代替データベースに設定できない場合、代替データベースが自動的に準備およびプロモートされます。

切り替えメンテナンスの監視と開始

Heroku によってデータベースの切り替えメンテナンスがスケジュールされると、代替データベースの作成が始まります。データベースのサイズによっては、代替データベースの作成に時間がかかることがあります。

代替データベースの作成中、pg:maintenance​ コマンドにより次の情報が表示されます。

$ heroku pg:maintenance DATABASE_NAME --app myapp
Maintenance scheduled for 2018-05-01 14:30:00 +0000, required by 2018-05-04 21:00:00 +0000, replacement currently being prepared, window is Tuesdays 14:30 to 18:30 UTC

この情報は、特定のメンテナンスでフェイルオーバーまたは再起動の戦略を使用している場合は表示されません​。

代替データベースの準備ができてメンテナンスが続行可能になると、pg:maintenance​ コマンドにより次の情報が表示されます。

$ heroku pg:maintenance DATABASE -a sushi
Maintenance scheduled for 2018-05-01 14:30:00 +0000, required by 2018-05-04 21:00:00 +0000, replacement ready, window is Tuesdays 14:30 to 18:30 UTC

制限

設定可能なメンテナンスウィンドウと手動でのメンテナンス実行は、本番環境プラン (Standard、Premium、Private、Shield) でのみ利用できます。

Heroku では、メンテナンスウィンドウに関するお客様の要望にお応えできるよう最善を尽くしますが、保証はいたしかねます。お客様のデータのセキュリティまたは整合性が脅かされる緊急事態が発生した場合、当社の裁量によって通常のウィンドウ以外の時期にメンテナンスを実行する場合があります。

よくある質問

どうしてメンテナンスが行われているのですか?

Heroku Postgres はマネージド型の Postgres オファリングであり、提供される最大の価値の 1 つは、セキュリティと機能更新のためのパッチが提供されることです。Heroku では、Heroku Postgres オファリングの一部としてセキュリティの脆弱性を監視し、積極的にパッチを適用します。

このメンテナンスはいつ実行されますか?

次回のメンテナンスウィンドウの間にメンテナンスが実行されることをお知らせするメールがお客様に届いているはずです。メンテナンスがいつ実行されるかは、heroku pg:maintenance​ コマンドを使用して確認できます。メンテナンスがスケジュールされている日時と、メンテナンスを実行する準備ができているかどうかの情報が表示されます。

アプリのダウンタイムは発生しますか?

どのようなメンテナンスにも一定のダウンタイムは必要です。高可用性 (HA) プラン (Premium/Private/Shield tier) をご利用の場合、障害発生時に自らを保護するための手順をお客様が実行済みですので、お客様はすでにこのことを認識しています。HA プランをご利用でない場合、Heroku ではお客様のアプリケーションのダウンタイムができる限り短くなるよう努めます。HA プランでは、メンテナンス後、新しい HA フォロワーが作成されてキャッチアップするまでの間、HA をご利用いただけない時間が発生します。

メンテナンスによるダウンタイムの間、sql_error_code = 25006 ERROR: cannot execute INSERT in a read-only transaction​ などのアプリエラーや、アプリケーションがデータベースに接続できないことを示す一般的なエラーが発生する場合があります。

ダウンタイムを最小化する方法は?

​

接続エラーへの弾力性をアプリに組み込む

多くの場合、メンテナンスのためのフェイルオーバーはすぐに発生しますが、アプリで接続を再確立するときの問題によって追加のダウンタイムが発生する可能性があります。このことが問題の場合は、データベースのメンテナンス後にアプリを自発的に再起動すると、接続に特有のエラーが発生しにくくなります。接続を再確立するときに指数バックオフを使用して、アプリ自体のエラー処理にそのような弾力性を組み込むこともできます。

読み取り専用フォロワーを使用する

データベースフォロワーをプロビジョニングして、データベースへの読み取り専用アクセスを提供できます。アプリは “読み取り専用” モードをサポートする必要があり、フォロワーへのアクセスのみを要求するように設定する必要があります。ユースケースによっては、この設定により、メインデータベースでメンテナンスが実行されている間、読み取り専用に機能低下したモードでアプリの実行を継続できる場合があります。

移行を実行する前にデータベースの準備ができていることを確認する

起動時に実行される移行がアプリにある場合は、まず、データベースへの読み書き可能な接続があることを_確認してから_​、移行を実行します。読み取り専用の接続で移行を実行しようとすると、アプリがクラッシュする可能性があり、結果として、その復旧のためにダウンタイムが増加します。 アプリが読み取り専用モードでないことは、SQL コマンド `SELECT pg_is_in_recovery()`​ を使用して確認できます。

メンテナンスを実行するために必要な手順はありますか?

メンテナンスには 3 つの実行方法があります。Heroku で自動的にメンテナンスを実行するのが最も一般的な方法です。Heroku では、お客様のデータベースメンテナンスウィンドウを使用して、このメンテナンスを自動的に実行するのに最適な時間を決定します。

メンテナンスの手動実行を希望する場合、2 つの方法があります。1 つ目は、heroku pg:maintenance --force​ です。この場合、HA フォロワーまたは非表示のフォロワー (キャッチアップ済みの場合) にすぐにフェイルオーバーします。アプリケーションはすぐに再起動し、新しいフォロワーをポイントします。

もう 1 つの方法では、PostgreSQL フェイルオーバーを実行する前にアプリケーションをメンテナンスモードにします​。この方法には、ユーザーのランディングページがクリーンになるなどの利点がありますが、メンテナンスモードの有効化と無効化を手動で行うことから、全体としてはダウンタイムが長くなる可能性があります。メンテナンスモードに関するページ​に、さらに詳しい情報があります。

このメンテナンスの実行方法には、Heroku が自動的に行うものと、お客様が手動で行うものの 2 つがあります。

自動実行

Heroku で自動的にメンテナンスを実行するのが最も一般的な方法です。Heroku では、お客様のデータベースメンテナンスウィンドウを使用して、このメンテナンスを自動的に実行するのに最適な時間を決定します。自動で実行する場合、お客様の側で必要な手順はありません。メンテナンスプロセスの途中でアプリが再起動するため、ユーザーによってはエラーや 1 ~ 3 分の遅延が発生する場合があります。

注: connection error​、pg is read only​ などのエラーがログに記録される場合があります。これらは切り替えプロセスの生成物であり、すべてがオンラインに戻っていれば無視しても安全です。

お客様による手動実行

メンテナンス中のユーザーエクスペリエンスをより自由に制御したい場合、お客様自らの手でメンテナンスを実行できます。メンテナンスを実行するには、スケジュールされたメンテナンスの前にいつでも heroku pg:maintenance:run DATABASE --force -a sushi​ コマンドを実行します。

ユーザーにできるだけエラーが表示されないよう、メンテナンスモード​を使用して、メンテナンスの実行中はアプリをオフにすることができます。次に例を示します。

heroku maintenance:on
heroku pg:maintenance:run --force
heroku pg:wait
heroku maintenance:off

‘読み取り専用’ または ‘データベースに依存しない’ モードがアプリに組み込まれている場合、それらのモードも使用できます。

# for example
heroku config:set READ_ONLY=true
heroku pg:maintenance:run --force
heroku pg:wait
heroku config:set READ_ONLY=false

メンテナンスの手動実行についての詳細は、「メンテナンスの種類​」を参照してください。

メンテナンスはどれくらいの頻度で発生しますか?

​ Postgres の重要なセキュリティパッチや、基盤となるソフトウェアおよびハードウェアのメンテナンスのため、Heroku Postgres データベースは定期的に更新されます。メンテナンスは少なくとも 90 日ごとに実行されます。

データベースのメンテナンス履歴を確認できますか?

Heroku では、アプリケーションで実行されるメンテナンスの履歴は提供されません。お客様が検索できるすべてのメンテナンスの前に、Heroku からメールが送信されます。

スケジュールされたメンテナンスの時間を変更できますか?

はい。メンテナンスウィンドウを変更​することで、所定の時間よりも前に、スケジュールされたメンテナンス時間を別の時間に変更できます。

DATABASE_URL または HEROKU_​POSTGRESQL_<COLOR>_​URL が変更されることはありますか?

ほとんどの場合、変更されません。アプリの新しいリリースが作成され、一部の環境設定が更新されたという通知があっても、値は同じままです。この変更があっても、アプリはそのまま再起動します。

関連カテゴリー

  • 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