Heroku Postgres
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年11月17日(木)
Table of Contents
Heroku dyno、Heroku Postgres、および Heroku Data for Redis® の無料プランは 2022 年 11 月 28 日で提供を終了します。詳細は、FAQ を参照してください。 資格のある学生の皆様は、新しい Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
Heroku Postgres は、Heroku が直接提供するマネージド SQL データベースサービスです。PostgreSQL ドライバーを使用して、Heroku が公式にサポートするすべての言語を含むどの言語の Heroku Postgres データベースにもアクセスできます。
Heroku CLI から使用できるさまざまな管理コマンドに加え、Heroku Postgres には、Web ダッシュボード、データクリップとクエリを共有する機能、およびその他の複数の役立つ機能が用意されています。
Heroku Postgres プランについて
Heroku Postgres は、Essential、Standard、Premium、Private、Shield というサービスの異なる層にまたがる、さまざまなプランを提供しています。各プランが提供する内容の詳細については、「Choosing the Right Heroku Postgres Plan」(適切な Heroku Postgres プランの選択) を参照してください。
Heroku Postgres プランの価格情報は、Heroku Postgres アドオンページで確認できます。
アプリの要件が最終的に、選択した初期プランで提供されたリソースより大きくなりすぎた場合、簡単にデータベースをアップグレードできます。
Heroku Postgres のプロビジョニング
Heroku Postgres をプロビジョニングする前に、それがまだアプリに対してプロビジョニングされていないことを確認します。Heroku では、特定のライブラリ (pg
Ruby gem など) を含むアプリに対して Postgres を自動的にプロビジョニングします。
heroku addons
コマンドを使用して、アプリがすでに Heroku Postgres をプロビジョニングしているかどうかを判定します。
$ heroku addons
Add-on Plan Price State
────────────────────────────────────────────────────────── ───── ─────── ───────
heroku-postgresql (postgresql-concave-52656) mini $5/month created
heroku-postgresql
に、アプリのアドオンリストが表示されていない場合は、次の CLI コマンドでプロビジョニングできます。
$ heroku addons:create heroku-postgresql:<PLAN_NAME>
たとえば、Mini プランデータベースをプロビジョニングするには、次のように実行します。
$ heroku addons:create heroku-postgresql:mini
Creating heroku-postgresql:mini on ⬢ example-app... $5/month
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pg:copy
Created postgresql-concave-52656 as DATABASE_URL
プロビジョニングコマンドに --version
フラグを含めることで、プロビジョニングする Postgres のバージョンを指定できます。
$ heroku addons:create heroku-postgresql:<PLAN_NAME> --version=12
PostgreSQL バージョンのサポートの詳細を確認してください。
選択したプランに応じて、データベースは使用可能になるまでに最長 5 分かかることがあります。heroku pg:wait
コマンドでステータスを追跡できます。このコマンドは、データベースが使用できるようになるまでブロックします。
プロビジョニングプロセスの一部として、DATABASE_URL
環境設定がアプリの設定に追加されます。DATABASE_URL
には、アプリがデータベースにアクセスために使用する URL が含まれています。アプリにすでに Heroku Postgres データベースがあり、別のものをプロビジョニングしている場合は、この環境設定の名前が代わりに HEROKU_POSTGRESQL_<COLOR>_URL
(HEROKU_POSTGRESQL_YELLOW_URL
など) という形式になります。
heroku config
コマンドで、アプリの環境設定の名前および値を確認できます。
アプリの DATABASE_URL
環境設定の値は、いつでも変化する可能性があります。
Heroku アプリの内部または外部のどちらでも、この値に依存しないでください。
この時点で、空の PostgreSQL がプロビジョニングされます。既存のデータソースからデータを入力するには、インポート手順を参照するか、この記事の言語固有の手順に従って、アプリケーションから接続してください。
ローカルの設定
Heroku では、Postgres をローカルで実行して環境間でのパリティを確保することをお勧めします。ローカル環境で PostgreSQL をインストールするための複数の事前にパッケージ化されたインストーラーがあります。
Postgres がインストールされ、接続できるようになったら、アプリがローカルでの実行時にそこに接続できるように、DATABASE_URL 環境変数をエクスポートする必要があります。
-- for Mac and Linux
$ export DATABASE_URL=postgres://$(whoami)
-- for Windows
$ set DATABASE_URL=postgres://$(whoami)
Postgres は (インストールの一部として設定されている) ユーザーアカウント名に一致するローカルデータベースに接続します。
Postgres on Mac の設定
Postgres.app は Mac OS 10.7 以上を必要とします。
- Postgres.app をインストールし、設定手順に従います。
- Postgres CLI ツールをインストールします。
- 新しいターミナルウィンドウを開いて、変更内容が保存されたことを確認します。
- 正しく機能したことを確かめます。OS X バージョンの
psql
は、Postgres.app
ディレクトリを含むパスを指している必要があります。
バージョン 10 を使用している場合、出力は次のようになります。
$ which psql
/Applications/Postgres.app/Contents/Versions/latest/bin/psql
次のコマンドは正しく機能します。
$ createdb
$ psql -h localhost
psql (10.14)
Type "help" for help.
=# \q
アプリはログイン時に自動的に開始するように設定されていることも確認します。
PostgreSQL には、pg_dump
や pg_restore
を含む、いくつかの有効なバイナリが付属しています。これらをどのターミナルセッションでも使用できるようにするには、Postgres.app に付属している /bin
ディレクトリを PATH に (できれば .profile
、.bashrc
、.zshrc
などに) 追加します。
PATH="/Applications/Postgres.app/Contents/Versions/latest/bin:$PATH"
Postgres on Windows の設定
Windows インストーラーを使用して、Postgres on Windows をインストールします。
必ず、Postgres インストールの bin
ディレクトリを追加するように、PATH 環境変数を更新してください。このディレクトリは C:\Program Files\PostgreSQL\<VERSION>\bin
と同様です。heroku pg:psql
などのコマンドは PATH に依存し、PATH が正しくない場合は機能しません。
Postgres on Linux の設定
パッケージマネージャから Postgres をインストールします。使用する実際のパッケージマネージャーコマンドは、ディストリビューションによって異なります。次は、Ubuntu、Debian、その他の Debian から派生したディストリビューションで機能します。
$ sudo apt-get install postgresql
ディストリビューションにパッケージマネージャーがないか、または Postgres パッケージを使用できない場合は、いずれかの汎用インストーラを使用して Linux に Postgres をインストールします。
psql
クライアントは通常、/usr/bin
にインストールされます。
$ which psql
/usr/bin/psql
次のコマンドは正しく機能します。
$ psql
psql (9.3.5)
Type "help" for help.
maciek# \q
プライマリデータベースの指定
DATABASE_URL
環境設定は、アプリのプライマリ Heroku Postgres データベースの URL を指定します。1 つのデータベースを持つアプリの場合は、その URL がこの環境設定に自動的に割り当てられます。
複数の Postgres データベースを持つアプリの場合は、heroku pg:promote
でプライマリデータベースを設定します。一般的なユースケースには、リーダー/フォロワー高可用性設定、またはデータベースアップグレードプロセスの一部が含まれます。
アプリケーション間での Heroku Postgres の共有
heroku addons:attach
コマンドを使用して、単一の Heroku Postgres データベースを複数のアプリ間で共有できます。
$ heroku addons:attach my-originating-app::DATABASE --app example-app
Attaching postgresql-addon-name to example-app... done
Setting HEROKU_POSTGRESQL_BRONZE vars and restarting example-app... done, v11
アタッチされたデータベースの URL は、名前形式 HEROKU_POSTGRESQL_[COLOR]_URL
で環境設定に割り当てられます。上記の例では、環境設定の名前は HEROKU_POSTGRESQL_BRONZE_URL
です。
共有されるデータベースは、必ずしも、共有されるいずれか特定のアプリのプライマリデータベースではありません。他のデータベースに使用した同じコマンドで、共有されたデータベースをプロモートします。
heroku addons:detach
コマンドを使用して、別のアプリとの Heroku Postgres インスタンスの共有を停止できます。
$ heroku addons:detach HEROKU_POSTGRESQL_BRONZE --app example-app
Detaching HEROKU_POSTGRESQL_BRONZE to postgresql-addon-name from example-app... done
Unsetting HEROKU_POSTGRESQL_BRONZE config vars and restarting example-app... done, v11
バージョンのサポート
PostgreSQL プロジェクトは毎年、新しいメジャーバージョンをリリースします。それぞれのメジャーバージョンは、リリースの直後に Heroku Postgres によってサポートされます。
Heroku Postgres は、その時々で少なくとも 3 つのメジャーバージョンをサポートしています。Heroku では現在、Postgres バージョン 14 をデフォルトとして提供しています。現在サポートされているバージョンは、次のとおりです。
プラン | バージョン | ステータス | EOL 日 |
---|---|---|---|
Essential | 9.6 | 非推奨 | 2021-11-11 |
Essential | 10 | 非推奨 | 2022-11-10 |
Essential | 11 | 使用可能 | 2023-11-09 |
Essential | 12 | 使用可能 | 2024-11-14 |
Essential | 13 | 使用可能 | 2025-11-13 |
Essential | 14 | 使用可能 (デフォルト) | 2026-11-12 |
Standard 以上 | 9.6 | 非推奨 | 2021-11-11 |
Standard 以上 | 10 | 非推奨 | 2022-11-10 |
Standard 以上 | 11 | 使用可能 | 2023-11-09 |
Standard 以上 | 12 | 使用可能 | 2024-11-14 |
Standard 以上 | 13 | 使用可能 | 2025-11-13 |
Standard 以上 | 14 | 使用可能 (デフォルト) | 2026-11-12 |
ユーザーは、おおよそ 3 年に 1 回アップグレードするように要求されます。ただし、データベースの PostgreSQL バージョンをどの時点でもアップグレードして最新バージョンの利点を得ることができます。
Heroku Postgres での PostgreSQL バージョンの非推奨プロセスは、その EOL 日の 1 年前に始まります。非推奨プロセスは、Changelog 経由で発表されます。
サポートされている古い PostgreSQL バージョンでデータベースを作成するには、addons:create
コマンドで –version フラグを使用します。
非推奨のデータベースの移行
PostgreSQL プロジェクトは、最初のリリースから 5 年後に、メジャーバージョンのサポートを停止します。Heroku Postgres は、これらのバージョンを非推奨にして、PostgreSQL のサポートされていないメジャーバージョンでデータベースが実行しないようにします。
独自のスケジュールで互換性をテストし、予期しない問題に関する計画を立て、データベースを移行できるように、サポートが終了する前にバージョンアップグレードを実行することを強くお勧めします。
Essential 層のデータベース
バージョンのサポート終了 (EOL) の 1 年前に、Heroku は、非推奨バージョンでの新しい Essential 層データベースのプロビジョニングを止めます。
その時点で、Heroku は、非推奨バージョンで実行されている Essential 層データベースの使用可能な最後のデフォルトバージョンへの移行を開始します。
Standard 層以上のデータベース
- バージョンのサポート終了 (EOL) の 1 年前に、Heroku は、影響を受けるデータベースの非推奨プロセスについてメール経由で顧客に通知します。
- EOL の 6 か月前に、Heroku は、非推奨バージョンでの新しい Standard 層以上のデータベースのプロビジョニングを止めます。既存のデータベースのフォークとフォロワーの作成は許可されます。
- EOL の 1 か月前に、Heroku は、引き続き非推奨バージョンで実行されているデータベースの強制アップグレードメンテナンスをスケジュールします。
従来のインフラストラクチャ
Heroku ではまた、場合によっては、次の理由でインフラストラクチャの古いバージョンも非推奨にします。
- データベースの下で実行されているオペレーティングシステムがセキュリティ更新の受信を停止する。
- オペレーティングシステムのサポートが経過期間のために実用的でなくなった (必要なパッケージやパッチが使用できなくなるか、またはサポートが困難になった)。
- サーバーインスタンスが、Heroku の現在のインフラストラクチャとは大幅に異なるためにサポートが非現実的になった。
データベースが従来のインフラストラクチャで実行しているかどうかを確認するには、pg:info
を使用します。
$ heroku pg:info
=== DATABASE_URL, HEROKU_POSTGRESQL_IVORY_URL
Plan: Standard 0
Status: Available
Data Size: 8.09 MB
Tables: 0
PG Version: 12.5
Connections: 7/120
Connection Pooling: Available
Credentials: 1
Fork/Follow: Available
Rollback: earliest from 2021-01-24 18:59 UTC
Created: 2020-12-01 02:27
Region: us
Data Encryption: In Use
Continuous Protection: On
Forked From: HEROKU_POSTGRESQL_SILVER
Maintenance: not required
Maintenance window: Wednesdays 21:30 to Thursdays 01:30 UTC
Add-on: postgresql-cubed-48277
パフォーマンス分析
パフォーマンス分析についての詳細は、「Heroku Postgres のパフォーマンス分析」を参照してください。
CLI の使用
CLI を使用した Heroku Postgres の管理についての詳細は、「CLI を使用した Heroku Postgres の管理」を参照してください。
Heroku Postgres への接続
Heroku Postgres への接続についての詳細は、「Heroku Postgres への接続」を参照してください。
プラン間の移行
データベースプラン間の更新および移行に関するこの詳細なガイドを参照してください。
データの所在
データベースがプロビジョニングされると、そのデータベースに関連付けられたデータは、それが作成されるリージョン内で保管されます。ただし、Heroku Postgres に付随するサービスや、このデータベース群を管理するシステムは、プロビジョニングされたデータベースと同じリージョン内に配置されない可能性があります。
- ディザスタリカバリーの Postgres Continuous Protection は、データベースが置かれている同じリージョンにベースバックアップおよびログ先行書き込みを保管します。
- アプリケーションログは、Logplex にルーティングされ、米国でホスティングされます。アプリケーションのログに加えて、これにはシステムログと、アプリケーションにアタッチされたすべてのデータベースの Heroku Postgres ログが含まれます。
- Heroku Postgres クエリおよびエラーのログ記録は、
heroku addons:create heroku-postgres:...
でデータベースを作成するときに--block-logs
フラグを使用することによってブロックできます。 - PG バックアップスナップショットは米国で保管されます。別のリージョン内の論理バックアップを取得するには、「Heroku Postgres の論理バックアップ」を参照してください。
- データクリップは米国で保管されます。
ログのブロック
アドオン作成時に、データベースに対して実行されるクエリのログ記録を防止するためにフラグを渡すことができます。このオプションが有効になっている場合は、データベースがプロビジョニングされた後に、それを無効にすることはできません。有効になった後、それを無効にする必要がある場合は、新しいデータベースへの移行が必要になります。
ログ内のクエリをブロックすると、アプリケーションをデバッグしたり、アプリケーションパフォーマンスをチューニングしたりするのに役立つ Heroku の機能が低下します。
$ heroku addons:create heroku-postgresql:standard-0 -a example-app --block-logs
アドオンの削除
Heroku Postgres データベースを破棄するには、アドオンを削除する必要があります。
$ heroku addons:destroy heroku-postgresql
同じ種類のデータベースが 2 つある場合は、その環境設定名を使用してアドオンを削除する必要があります。たとえば、HEROKU_POSTGRESQL_GRAY_URL
を削除するには、次のように実行します。
heroku addons:destroy HEROKU_POSTGRESQL_GRAY
削除されたデータベースが DATABASE_URL
で使用されていたのと同じものであった場合は、その DATABASE_URL
環境設定がアプリで設定解除されます。
データベースを、破棄された後に再設定することはできません。PG バックアップを使用するか、またはデータをエクスポートすることによって、事前にデータのスナップショットを取得してください。
サポート
すべての Heroku Postgres サポートおよびランタイムの問題は、Heroku サポートチャネルのいずれかを介して送信する必要があります。