2017-01-01 37 views
1

まず私は、実行中のクエリを表示するには、このクエリを実行します。PostqreSQLで実行中のクエリを停止するには?

SELECT pg_cancel_backend(pid); 

しかし、私はもう一度をpg_stat_activityを実行すると、それはまだすべてを示しています。

select * from pg_stat_activity; 

その後、私はそれらを停止するには、このクエリを実行しますクエリ!

なぜクエリを強制終了しませんでしたか?

+1

セッションまたはリクエストが存在しなくなったときに[停止(長い)SQLクエリをPostgreSQLで実行していますか?](http://stackoverflow.com/questions/3508627/stop-long-running-sql-query-in- postgresql-when-session-or-requests-no-longer-e) –

+0

自動コミットをオフにしましたか?その場合、 'pg_stat_activity'の内容はあなたのトランザクションを終了しない限り更新されません –

答えて

0

可能な説明の数:あなたはアクティブなクエリを見ていない

  • 、クエリテキストがバックアップされ、現在のアイドルに走っただけで、最後のクエリです。その場合、キャンセルするものがないので、pg_cancel_backendは何もしません。 stateフィールドをpg_stat_activityにチェックしてください。

  • アクティブクエリは、実行中の間にCHECK_FOR_INTERRUPTS()ではない拡張コードで実行されています。これは、通常、PL/Perl、PL/Pythonなどのような独自のライブラリ、ソケットなどを使用して、CPU、I/O、またはネットワークアクティビティの多くを実行する拡張機能を実行している場合です。

  • アクティブなクエリは、長時間実行されているループなどの割り込みをチェックしないPostgreSQLバックエンドコードで実行されています。これはバグです。そのような事件が見つかった場合は報告してください。

  • バックエンドは、ブロッキングオペレーティングシステムコール(通常はディスクI/Oまたはネットワークソケット書き込み)で待機しています。そのブロック操作が終了するまで、キャンセルメッセージに応答することができないかもしれませんが、SIGTERMを受信した場合、そのシグナルハンドラは通常、それを回避することができますが、必ずしもそうではありません。

一般に、「大きなハンマー」としてpg_terminate_backendを使用することは安全です。 pg_terminate_backend()によって送信されるSIGTERMは、しばしば、必ずしもそうではないが、取り消しに応答できないバックエンドを終了させることが多い。

ないkill -9SIGKILLPostgreSQLのバックエンド(postgresプロセス)。共有メモリの安全性を保護するため、PostgreSQLサーバ全体が緊急再起動されます。

+0

私は定期的に別の落とし穴に遭遇します。私は通常、自動コミットのturneed ** off **で実行し、 'pg_stat_activity'はそのトランザクションを終了すると更新されます。 'pg_stat_activity'へのアクセスは常に"反復可能な読み取り "分離レベルで行われるようです –

+0

@a_horse_with_no_name http://stackoverflow.com/q/41421429/398670を参照してください。 –

0

私はpg_cancel_backend(pid)の代わりにpg_terminate_backend(pid)を使うべきです。

+0

それが単純なら、' pg_cancel_backend'を気にしません。 –

関連する問題