1

場合によっては、pgAdmin でクエリを「停止」し、コマンド ラインから run を実行して kill したpg_cancel_backend後でも、クエリが実行され続けることがあります。pg_terminate_backend私が見つけた唯一のオプションは、postgres サービスを完全に停止して再起動することです (通常は を使用しpg_ctl -m immediateます)。現在Postgres 9.1を使用しています。

実行中のプロセスを完全に終了する他のオプションはありますか?

4

2 に答える 2

3

これは実際には起こってはいけません。バックエンドが行っている問題は何ですか?小切手:

ps -C postgres -o pid,ppid,stat,start,time,%cpu,%mem,blocked,ignored,wchan:80,cmd

あなたがそれを知っているなら、と交換-C postgresしてください。太線-p the_pidの後に表示されるプロセス名を必ず含めてください。chan行全体で答えを更新します。

また、バックエンドからバックトレースを取得して、バックエンドが何をしているのかを確認することもできます。あなたはおそらくLinuxまたはBSDkillを使用しているので、試してみてください。

gdb -p the_pid
(gdb) bt
... blah blah copy this blah ...
(gdb) q

例えば:

gdb -p 914
......blah blah ........
(gdb) bt
#0  0x0000003c31ceacc3 in __select_nocancel () from /lib64/libc.so.6
#1  0x00000000005f73b6 in ?? ()
#2  0x00000000005f7c36 in SysLogger_Start ()
#3  0x00000000005f60b0 in PostmasterMain ()
#4  0x0000000000457039 in main ()
(gdb) q
A debugging session is active.

        Inferior 1 [process 914] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/postgres, process 914

可能であれば、最初にデバッグシンボルパッケージをインストールしてください。私は自分のマシンでPg9.1を使用していないので、上記のバックトレースはあまり役に立ちません。Pgwikiの記事を参照してください。

バックトレースは非常に長くなる可能性があるため、質問に直接リンクするのではなく、ペーストビンサイトにドロップして、ここにリンクすることを検討してください。

于 2012-09-19T23:40:07.463 に答える
1

これを再考すると、PostgreSQL バックエンドがしばらくの間何もしていない作業を行っている場所がありますCHECK_FOR_INTERRUPTS。これらのパッチは可能な限り回避されますが、それでも発生します。

そのような事例を見つけた場合は、報告してください。

割り込みをチェックするまでバックエンドを完全に停止することはできないため、単に待機する必要があります。または、データベース サーバー全体を再起動できます。対象のバックエンドを (eg)で強制終了するとkill -9、PostgreSQL はshared_buffers破損の可能性があると見なし、すぐに強制的に再起動して、現在のすべてのセッションを切断します。そのため、代わりに即時シャットダウンを使用することもできます。

于 2014-02-10T08:03:06.937 に答える