2013-07-03 5 views
54

にはいくつかの自動接続のデータベースをドロップすることができない:私はDBからの接続を終了Postgresqlの私は私が取得するデータベースをドロップしようとするたびので、DB

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB'; 

:私が使用している場合

ERROR: database "pilot" is being accessed by other users 
DETAIL: There is 1 other session using the database. 

しかし、後で誰かが自動的にそのデータベースに接続してこのエラーを出すと、データベースを削除しようとすると。それは何ができるのでしょうか? 誰が私を除いて、このデータベースを使用しません。

答えて

54

あなたは将来の接続を防ぐことができます:;:

REVOKE CONNECT ON DATABASE thedb FROM public; 

(およびおそらく他のユーザー/役割psql\l+を参照)

を次に、あなた自身を除いて、このDBへの接続をすべて終了することができますprocpidと呼ばれていたpid古いバージョンでは

SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = current_database() AND pid <> pg_backend_pid(); 

ので、あなたはそれに対処する必要があります。あなたは自動接続しようとしていたものは何でもCONNECT権は、もはやそうすることはできないはず取り消されたので

これでDBをドロップできるようになります。

これは、通常の操作でスーパーユーザー接続を使用している場合は機能しませんが、その場合はまずその問題を解決する必要があります。

+2

同じ名前の別のデータベースを後でインポートする場合は、connect capabパブリックバックへの寛大さ: 'データベースへの接続を許諾します。 – Mike

18

だけで、それはから来るの接続が、何であるか確認してください。あなたはこれをすべて見ることができます:

select * from pg_stat_activity where datname = 'TARGET_DB'; 

おそらくあなたの接続ですか?

+4

sudo kill -9結果が表示された後の端末のPID –

42

私は私が手にデータベースを削除しようとするたびに:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB'; 

それは確かに動作します:あなたが次に使用

REVOKE CONNECT ON DATABASE TARGET_DB FROM public; 

を取り消す必要がある

ERROR: database "pilot" is being accessed by other users 
DETAIL: There is 1 other session using the database. 

まず。

4

あなたのマシン上の他のサービスには潜在的な影響は、単に

5

service postgresql restart私は、この問題の解決策は、このコマンドによって、端末

ps -ef | grep postgres 

殺す過程でこのコマンドを実行しよう見つからない場合は

sudo kill -9 PID 
関連する問題