クライアントを強制的にPostgreSQLから切断する方法はありますか?私はDB2のforce application all
の等価物を探しています。PostgreSQLを使用してクライアントを強制的に切断する
私はデータベースボックスを開いているときにデータベースダンプをロードできないため、私の開発ボックスでこれを行いたいと思います。私はそれらを最初にやめなければならない。
クライアントを強制的にPostgreSQLから切断する方法はありますか?私はDB2のforce application all
の等価物を探しています。PostgreSQLを使用してクライアントを強制的に切断する
私はデータベースボックスを開いているときにデータベースダンプをロードできないため、私の開発ボックスでこれを行いたいと思います。私はそれらを最初にやめなければならない。
pg_terminate_backend
機能とpg_stat_activity
システムビューを組み合わせてください。
メーリングリストにthis threadが見つかりました。これは、SIGTERMを使用してクライアントを切断させることを示唆しています。
db2 force application all
ほどきれいではありません。
キルはPostgreSQL 8.4でアイドル状態のプロセスを:
SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
WHERE current_query LIKE '<IDLE>';
Postgres v9.1.4の魅力のように動作します。洞察に感謝します! –
最新のpostgresバージョン: 'pid、(SELECT pg_terminate_backend(pid))がpg_stat_activityからkillされました。状態がLIKE 'idle';' –
@Mike Weller:ありがとう、これが私のためでした! – jipiboily
おそらくより重い利きのアプローチは、その後使用されるがする必要があります。
for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done
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、私の答えを投稿し
:次の行で
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"データベースからクエリを実行します。
問題データベース自体の外で、スーパーユーザーが行うことは、私にとって完璧に機能しました。
pg_cancel_backend()は切断されず、現在のクエリのみをキャンセルします。次のクエリは、まだそこにある同じ古い接続を使用して任意の秒に来ることができます。 –
修正済み。ありがとうございました! –