Heroku Postgres のプラン容量オーバー
最終更新日 2024年04月29日(月)
Table of Contents
ご利用の Heroku Postgres データベースが、ご利用のプランの割り当てを超えた場合、問題を解決するための指示が記載された警告メールが届きます。データベースがプラン制限内になるまでアクセスが無効化される施行日が Heroku によって設定される場合もあります。アクセスが制限されないよう、必要な措置を講じてください。
プラン容量オーバーのステータス
Heroku Postgres データベースのステータスを表示するには、heroku pg:info
コマンドを実行します。データベースが容量オーバーの場合、ステータスには、Over Plan Capacity: Action Required
または Over Plan Capacity: Access Restricted
が表示されます。
Action Required (要対処)
ご利用のデータベースのサイズがプランの容量を超過しているため、施行日までにアップグレードするかデータを削除する必要があります。施行日は、メールまたはアプリケーションログから見つけることができます。
Access Restricted (アクセス制限中)
データベースのサイズがプランの容量を超過し、施行日を過ぎています。制限付きアクセスは、次のことを意味します。
- 1 つのデータベース接続が許可されます
- 接続では
READ
、DELETE
、およびTRUNCATE
アクセスが許可されます
フルアクセスを回復するには、データベースをアップグレードするかデータを削除してください。
データベースの容量が 30 日を超えて超過している場合、Heroku は使用量を下げるためにデータベースで VACUUM FULL
を実行して不要な行を削除します。
解決のための手順
データ使用状況の確認
Postgres データベースを確認するには、heroku pg:info
を使用します。この出力にはプランやデータベースサイズが示されるため、プランをアップグレードするか、またはデータを削除するかを決定できます。
$ heroku pg:info HEROKU_POSTGRESQL_COBALT -a example-app
=== HEROKU_POSTGRESQL_COBALT_URL
Plan: Standard 0
Status: Over Capacity: Action Required
Data Size: 144.6 GB
プランのアップグレード
ストレージを増加するために、Heroku Postgres プランをアップグレードできます。このオプションが推奨されます。アップグレードすると、データの損失を回避でき、ダウンタイムを最小限に抑えることができます。データベースはいつでもダウングレードできます。
最も簡単なアップグレード方法は、addons:upgrade
コマンドを使用する方法です。
$ heroku addons:upgrade HEROKU_POSTGRESQL_COBALT_URL heroku-postgresql:standard-2 -a example-app
アップグレードツールの詳細については、pg:upgrade での手動アップグレードに関する記事を参照してください。
データの削除
データベースに接続できない場合は、すべての dyno をシャットダウンしてから、制限された資格情報で接続してください。それでもデータベースに接続できない場合は、Heroku サポートにお問い合わせください。
プラン制限内に戻すために、アップグレードする代わりにデータを削除できます。
フォークを使用した削除テスト
データベースからデータを削除する前に、フォークを作成して、データを操作する前に実験することができます。
フォークを作成した後、次の手順に従ってデータを削除できます。これらの例では pg:psql
を使用して、SQL クエリでデータベースを直接変更します。これらの SQL クエリはサンプルです。
データの削除
データを削除するには、特定の行を削除するための条件を使用するか、データを切り捨てることができます。
$ heroku pg:psql HEROKU_POSTGRESQL_COBALT -a example-app
# Delete records older than 30 days
example-app::HEROKU_POSTGRESQL_COBALT=> DELETE FROM logs WHERE created_at < (now() - '30 days'::interval);
制限付きアクセスには DROP
は含まれません。重要ではない大規模なデータテーブルからすべてのデータを削除するには、TRUNCATE
を使用できます。
term
example-app::HEROKU_POSTGRESQL_COBALT=> TRUNCATE TABLE logs;
インデックス再構築
削除または切り捨て後にインデックスの領域確保のためにインデックス再構築を行います。
example-app::HEROKU_POSTGRESQL_COBALT=> REINDEX TABLE CONCURRENTLY logs;
バキューム
テーブルで VACUUM FULL を実行すると、テーブルに AccessExclusive ロックが設定され、実行中は他のクエリの読み取りがブロックされます。
Postgres プランの測定基準はディスク使用率です。Postgres ではディスク上で削除を実行せず、再使用できる領域にマークを付けます。未使用ディスク領域を解放するには、VACUUM FULL
を使用します。これをフォークでテストするとき、VACUUM FULL
の所要時間に注意を払うことで、本番環境への影響を評価することができます。
example-app::HEROKU_POSTGRESQL_COBALT=> VACUUM FULL;
VACUUM
操作の種類とその動作のしくみについては、「Heroku Postgres での VACUUM の管理」を参照してください。
ライブデータベースでの削除実行
VACUUM FULL
を使用している間は、実行中にユーザーがアクセスできないように、アプリをメンテナンスモードにします。ユーザーのアクセスが制限されている場合は、アプリケーションがデータベースに対して必要な接続を開けないため、そのアプリケーションはすでに動作不能になっている可能性がありますが、安全のためにメンテナンスモードを使用してください。
プラン容量を追跡するためのログエントリの使用
サービスが容量オーバーになると、Heroku Postgres は Logplex にログメッセージを出力します。ログメッセージは CLI またはログ記録アドオンを通じて利用できます。
ログエントリは、標準のログ形式に従います。
データベースが容量オーバーの場合は、次のようになります。
$ heroku logs -a example-app
2020-07-20T23:14:08.000000+00:00 app[heroku-postgres]: source=HEROKU_POSTGRESQL_GREEN_URL addon=postgresql-octagonal-423563 sample#restricted=false sample#database-capacity-used-bytes=107889578475 sample#database-capacity-used-percentage=157.00 sample#database-capacity-bytes=68719476736 sample#enforcement-date=2020-08-19 00:00:00 +0000 message=Database size is over plan capacity, access will be restricted by 2020-08-19 00:00:00 +0000.
施行日を過ぎている場合は、次のようになります。
$ heroku logs -a example-app
2020-08-28T23:14:08.000000+00:00 app[heroku-postgres]: source=HEROKU_POSTGRESQL_GREEN_URL addon=postgresql-octagonal-423563 sample#restricted=true sample#database-capacity-used-bytes=107889578475 sample#database-capacity-used-percentage=157.00 sample#database-capacity-bytes=68719476736 message=Database size is over plan capacity, access has been restricted.