1. ホーム
  2. database

[解決済み] postgresql のセッション/接続を切断する

2022-03-21 03:56:12

質問

Postgresql の接続をすべて切断するにはどうすればよいですか?

を試しています。 rake db:drop が、出る。

ERROR:  database "database_name" is being accessed by other users
DETAIL:  There are 1 other session(s) using the database.

から見えるプロセスをシャットダウンしてみました。 ps -ef | grep postgres が、これもうまくいきません。

kill: kill 2358 failed: operation not permitted

解決方法は?

を使用することができます。 pg_terminate_backend() を使用して接続を切断します。この関数を使用するには、スーパーユーザーである必要があります。これはすべてのオペレーティングシステムで同じように動作します。

SELECT 
    pg_terminate_backend(pid) 
FROM 
    pg_stat_activity 
WHERE 
    -- don't kill my own connection!
    pid <> pg_backend_pid()
    -- don't kill the connections to other databases
    AND datname = 'database_name'
    ;

このクエリを実行する前に リブーク のCONNECT権限で、新規の接続を回避することができます。

REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;

Postgres 8.4-9.1 を使用している場合、pid の代わりに procpid を使用します。

SELECT 
    pg_terminate_backend(procpid) 
FROM 
    pg_stat_activity 
WHERE 
    -- don't kill my own connection!
    procpid <> pg_backend_pid()
    -- don't kill the connections to other databases
    AND datname = 'database_name'
    ;