2

postgresql 8.3 でセッション (特定のセッションまたはすべてのセッションは関係ありません) を終了しようとしていますが、それを行うのに問題があります。新しいバージョン (8.4 以降) には、このトリックを実行する pg_terminate_backend コマンドがあることは知っていますが、これは postgresql 8.3 では使用できません。pg_stat_activity を使用すると、アクティブなすべてのセッションを確認できますが、それらを終了する方法はありません。

解決策は必ずしも sql コマンドである必要はありませんが、使用している OS に依存しないようにしたいと考えています (つまり、DOS/UNIX コマンドではありません)。

Windows サービスでの postgres サービスの停止と開始は完全に機能しますが、これは OS 固有のアプローチです。ただし、「pg_ctl restart -D DATA_DIR」を使用してもサービスは停止しません。実際に pg_ctl を使用してサービスを再起動しようとすると、奇妙な動作が発生します。Windowsが想定しているように、何らかの方法でpg_ctlを使用してプロセスを強制的にシャットダウンできる方法があれば、おそらくそれを使用できます。

とにかく、プラットフォーム固有ではない postgresql 8.3 の 1 つまたはすべてのセッションを終了する方法を探しています。どんな助けでも素晴らしいでしょう!

4

2 に答える 2

7

pg_cancel_backend()を使用できます。

select pg_cancel_backend(55555);

これはpg_stat_activityで使用できます。例えば:

select pg_cancel_backend(procpid)
from pg_stat_activity where current_query='<IDLE>';

それがうまくいかない場合は、これを試すことができます:

pg_ctl kill -TERM pid

それはOSに依存しないはずです。行動に本当の違いがあるかどうかはわかりません。

それ以外は、サーバーを停止して起動してみることができますが、それから奇妙な動作を示しました。(どんな種類?)

最後に、OS固有のオプションの場合、Linuxではもちろんkillコマンドを使用してみることができます。kill -15SIGTERM)は安全です。それが基本的にpg_terminate_backend使用するものです:kill -15 <pid>kill -9適度に危険であり、最後の手段としてのみ使用する必要があります

于 2013-03-21T21:59:11.533 に答える