Heroku「psql:FATAL:残りの接続スロットは非レプリケーションスーパーユーザー接続用に予約されています」


120

私はPostgresqlバックエンドを備えたHerokuでアプリを開発しています。定期的に、CLIとサーバーのページの読み込みの両方からデータベースにアクセスしようとすると、次のエラーメッセージが表示されます。

psql: FATAL: remaining connection slots are reserved for non-replication superuser connections

これを以前に見た人、または私を正しい方向に向けるのを手伝ってくれませんか?


1
同じ問題がある。私は、Herokuサポートが一部のサーバーで「いくつかの問題を検出した」とどこかで読んだところ、問題のユーザーに新しい基本データベースをプロビジョニングし、pgbackupsを使用してそれに移行することを勧めました。私の問題は、アプリが新しくてバックアップをまだ作成していないことです。もちろん、同じエラーを作成しようとすると、次のエラーが発生します。D
AndréLaszlo

記録のために、私はheroku pgbackupsこのエラーにもかかわらず、コマンドを使用してバックアップを作成することができました。
markshiz 2013年

この問題を再現するには、大量の端末を作成します。.batこのためのWindowsのスクリプト:for /l %%x in (1, 1, 100) do ( start psql )ここで、100はバックエンドの望ましい数です。
koxt 14

私も同じ問題を抱えていました。私が使用して新しいデータベースにデータを転送することができませんでしたpg:backups copypg:backups captureから、それに接続することで、pgAdmin自分のコンピュータ、または私が想像できる他の方法で。pg:killall助けにもならなかった。1時間後、私は再試行し、接続は50〜50だったので、数回の試行の後、成功pg:backups copyし、アプリが宙に浮いています。今日は…楽しい日ではなかった。これをググったら、水を一杯飲みなさい。
Aur Saraf、2015

1
私は今これを再び持っています。私の以前の経験を文書化してどれほど幸運か...編集:今回は再起動で十分でした。
Aur Saraf、2015年

回答:


56

max_connections構成設定を増やすか、(おそらくより良い)接続プール使用して、多数のユーザー要求を小さい接続プールにルーティングする必要があります。

https://wiki.postgresql.org/wiki/Number_Of_Database_Connections


14
また、一般的な問題は、クライアント側のアプリがクラッシュして接続を開いたままにし、再起動時に新しい接続を開くようなものです。この種のことが頻繁に発生すると、接続が不足します。または、アプリが正しく構成されておらず、開いている接続が多すぎる。
スコットマーロウ

5
Herokuで構成設定を変更できないと思います。開いているすべての接続を閉じる方法はありますか?
nathancahill 2012

1
うまくいけば、サーバーはかなり積極的にキープアライブパケット用に構成されます。これにより、接続が突然切断された場合、セッションは適切な時間で終了します。それが構成されていない場合、データベースのスーパーユーザーとしてログインできればpid、セッションの値を識別し、pg_terminate_backend()関数を使用してそれらを強制終了できます。この問題を回避するには、クライアント側を突然終了させるのではなく、必ず接続を適切に閉じてください。
kgrittn

データベースへのすべての接続を終了@nathancahill:heroku pg:killall
ロコ

9

この例外は、接続を閉じるのを忘れたときに発生しました


7

Heroku「psql:FATAL:残りの接続スロットは非複製スーパーユーザー接続用に予約されています」を参照してください。

Herokuでは、データベースのロードバランシングに問題が発生することがあります。

André Laszlomarkshizそして私はすべて質問へのコメントでそれを扱うことを報告しました。

サポート呼び出しを節約するために、同様の問題についてHerokuサポートから受け取った応答は次のとおりです。

こんにちは、

ホビー層データベースの制限の1つは、非通知メンテナンスです。多くの趣味データベースは単一の共有サーバー上で実行され、ハードウェアのメンテナンスのためにそのサーバーを再起動したり、負荷分散のためにデータベースを別のサーバーに移行したりする必要がある場合があります。その場合、ログにエラーが表示されるか、接続に問題があります。サーバーが再起動している場合、データベースがオンラインに戻るまで15分以上かかることがあります。

接続プールを維持するほとんどのアプリ(RailsのActiveRecordなど)は、データベースへの新しい接続を開くことができます。ただし、アプリが再接続できない場合があります。その場合は、herokuでアプリを再起動して、オンラインに戻すことができます。

これは、重要な本番アプリケーションでホビーデータベースを実行しないことをお勧めする理由の1つです。標準データベースとプレミアムデータベースには、ダウンタイムイベントの通知が含まれており、一般的にパフォーマンスが高く、安定しています。pg:copyを使用して、標準またはプレミアムプランに移行できます。

これが継続する場合は、heroku addons:addを使用して(別のサーバー上の)新しいデータベースをプロビジョニングしてから、pg:copyを使用してデータを移動してみてください。ホビーティアのルールは、9ドルの基本プランと無料のデータベースに適用されます。

おかげで、ブラッドリー


1
月額50ドルのデータベースプランを利用している場合の返信定型文は何でしょうか。
mpoisot

1
趣味の層だけが共有データベースサーバーを使用します。月額$ 50のプランでは、独自のサーバーを使用しているため、この問題が発生した場合は、独自のアプリでサーバーを作成します。月額50ドルのプランでは、より多くの管理オプションがあるため、診断と修正が簡単です。
ジェサミンスミス2017

標準オプションでできる管理オプションは何ですか?また、接続数が200だけのこのメッセージが表示されます。
Pencilcheck

6

私は実際にジャンゴエンドに接続プーリングを実装しようとしました:

https://github.com/gmcguire/django-db-pool

しかし、利用可能な接続の数を標準の開発DB割り当てである20のオープン接続よりも低くしても、このエラーは引き続き発生しました。

postgresqlデータベースをAmazon RDSの無料/安価な階層に移動する方法に関する記事がここにあります。これにより、max_connectionsより高く設定できます。これにより、PGBouncerを使用してデータベースレベルで接続をプールすることもできます。

https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

更新:

Herokuが私のオープンチケットに応答し、私のデータベースがネットワークで不適切に負荷分散されていると述べました。彼らは彼らのシステムの改善が将来同様の問題を防ぐべきであると言いました。それにもかかわらず、サポートによってデータベースが手動で再配置され、パフォーマンスが著しく向上しました。


データベースを移動することは、データベースを完全に制御するための最良のソリューションだと思います。その記事をありがとう。
nathancahill 2013年

-3

次のコマンドを実行して、postgresデータベースを再起動します。

postgres -D /usr/local/var/postgres

Postgres DBはHerokuによってホストされているサービスなので、これは機能しません。
flurdy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.