2009-04-07 14 views
30

クライアントを強制的にPo​​stgreSQLから切断する方法はありますか?私はDB2のforce application allの等価物を探しています。PostgreSQLを使用してクライアントを強制的に切断する

私はデータベースボックスを開いているときにデータベースダンプをロードできないため、私の開発ボックスでこれを行いたいと思います。私はそれらを最初にやめなければならない。

答えて

20

pg_terminate_backend機能とpg_stat_activityシステムビューを組み合わせてください。

+2

pg_cancel_backend()は切断されず、現在のクエリのみをキャンセルします。次のクエリは、まだそこにある同じ古い接続を使用して任意の秒に来ることができます。 –

+0

修正済み。ありがとうございました! –

0

メーリングリストにthis threadが見つかりました。これは、SIGTERMを使用してクライアントを切断させることを示唆しています。

db2 force application allほどきれいではありません。

36

キルはPostgreSQL 8.4でアイドル状態のプロセスを:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity 
    WHERE current_query LIKE '<IDLE>'; 
+0

Postgres v9.1.4の魅力のように動作します。洞察に感謝します! –

+13

最新のpostgresバージョン: 'pid、(SELECT pg_terminate_backend(pid))がpg_stat_activityからkillされました。状態がLIKE 'idle';' –

+0

@Mike Weller:ありがとう、これが私のためでした! – jipiboily

1

おそらくより重い利きのアプローチは、その後使用されるがする必要があります。

for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done 
5

This SO answerは美しく、(水平ルールの間araqnidからの完全な引用を説明私は再び):


T ○印データベース「applogs」などの新しい接続を受け付けません。

update pg_database set datallowconn = false where datname = 'applogs'; 

別の可能性は、クライアントの役割(複数可)のためにデータベースにアクセス「を接続する」取り消すことであろう。

データベース= killバックエンドからユーザーを切断します。したがって、たとえば、「applogs」のデータベースから他のすべてのユーザーを切断する:

select pg_terminate_backend(procpid) 
from pg_stat_activity 
where datname = 'applogs' and procpid <> pg_backend_pid(); 

をあなたはそれらの両方を完了したら、あなたは「applogs」に接続ユーザーのみです。バックエンドが実際に切断を完了するまでに実際に遅延が発生する可能性はありますか? MarkJLから


更新:バックエンドが切断終えるまでの遅延は確かにあります。

もう一度言いましたが、procpid列がPostgreSQL 9.2以降でpidという名前に変更されました。

私はMilen A. Radevの答えよりもはるかに役立つと思いますが、技術的には同じですが、使用例や実際の提案はありません。私は私のスクリプトでそれらのいずれかを使用することができませんでしたので、私は、サーバー9.3、私の答えを投稿し

+0

バックエンドの切断に間違いがあります。 – MarkJL

+1

@ MarkJLありがとうございました。回答に追加しました(このコメントは数日後に削除されます) – mirabilos

4

:次の行で

psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';" 

、あなたは「my_database_to_alter」でヨーヨーが欲しいものを行うことができます。ご覧のように、ほとんどのpostgresqlインストールに存在する "postgres"データベースからクエリを実行します。

問題データベース自体の外で、スーパーユーザーが行うことは、私にとって完璧に機能しました。

関連する問題