サーバーを停止せずに特定のデータベースへのすべての接続を削除するにはどうすればよいですか?


45

サーバーを再起動したり、他のデータベースへの接続を切断したりせずに、特定のPostgreSQLデータベースに対して現在開かれているすべての接続(セッション)をドロップしたい。

どうやってやるの?


lowth.com/cutterを使用してこれ実現できるとどこかで読みました。

回答:


22

StackOverflowに関する非常によく似た質問に対する私の答えを以下に示します。

postgresqlのバージョンによっては、バグが発生する可能性pg_stat_activityがあります。これにより、ドロップされたユーザーからのアクティブな接続が省略されます。これらの接続は、pgAdminIII内にも表示されません。

自動テスト(ユーザーも作成する)を実行している場合、これはおそらくシナリオです。

この場合、次のようなクエリに戻す必要があります。

 SELECT pg_terminate_backend(pg_stat_activity.procpid) 
 FROM pg_stat_get_activity(NULL::integer) 
 WHERE datid=(SELECT oid from pg_database where datname = 'your_database');

8
エラー:テーブル "pg_stat_activity"のFROM句エントリがありません(psql(9.6.1))
user1767316

4
これはもう機能しません。上記のエラーを取得してください^
軽量

以下の回答を参照してくださいSzymon Guz
Dfranc3373

FROM句がありません、動作しません
Vipul

78

このようなクエリが役立つはずです(データベースの名前が「db」であると仮定):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';

pid以前は呼び出されていたprocpidので、9.2よりも古いバージョンのpostgresを使用している場合は、次のことを試すことができます:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';

ただし、他のユーザーとの接続を解除するには、スーパーユーザーである必要があります。

またREVOKE CONNECT ON DATABASE FROM PUBLIC、それGRANTに似たものに役立つかもしれません。


3

これは、クライアント接続からデータベースを「解放」するために使用できるため、たとえば名前を変更できます。

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;

これにより、クライアントアプリに問題のある動作が発生する可能性があることに注意してください。トランザクションを使用しているために実際にデータが破損することはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.