回答:
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');
このようなクエリが役立つはずです(データベースの名前が「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
に似たものに役立つかもしれません。
これは、クライアント接続からデータベースを「解放」するために使用できるため、たとえば名前を変更できます。
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;
これにより、クライアントアプリに問題のある動作が発生する可能性があることに注意してください。トランザクションを使用しているために実際にデータが破損することはありません。