まず私は、実行中のクエリを表示するには、このクエリを実行します。PostqreSQLで実行中のクエリを停止するには?
SELECT pg_cancel_backend(pid);
しかし、私はもう一度をpg_stat_activityを実行すると、それはまだすべてを示しています。
select * from pg_stat_activity;
その後、私はそれらを停止するには、このクエリを実行しますクエリ!
なぜクエリを強制終了しませんでしたか?
まず私は、実行中のクエリを表示するには、このクエリを実行します。PostqreSQLで実行中のクエリを停止するには?
SELECT pg_cancel_backend(pid);
しかし、私はもう一度をpg_stat_activityを実行すると、それはまだすべてを示しています。
select * from pg_stat_activity;
その後、私はそれらを停止するには、このクエリを実行しますクエリ!
なぜクエリを強制終了しませんでしたか?
可能な説明の数:あなたはアクティブなクエリを見ていない
、クエリテキストがバックアップされ、現在のアイドルに走っただけで、最後のクエリです。その場合、キャンセルするものがないので、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 -9
(SIGKILL
)PostgreSQLのバックエンド(postgres
プロセス)。共有メモリの安全性を保護するため、PostgreSQLサーバ全体が緊急再起動されます。
私は定期的に別の落とし穴に遭遇します。私は通常、自動コミットのturneed ** off **で実行し、 'pg_stat_activity'はそのトランザクションを終了すると更新されます。 'pg_stat_activity'へのアクセスは常に"反復可能な読み取り "分離レベルで行われるようです –
@a_horse_with_no_name http://stackoverflow.com/q/41421429/398670を参照してください。 –
私はpg_cancel_backend(pid)の代わりにpg_terminate_backend(pid)を使うべきです。
それが単純なら、' pg_cancel_backend'を気にしません。 –
セッションまたはリクエストが存在しなくなったときに[停止(長い)SQLクエリをPostgreSQLで実行していますか?](http://stackoverflow.com/questions/3508627/stop-long-running-sql-query-in- postgresql-when-session-or-requests-no-longer-e) –
自動コミットをオフにしましたか?その場合、 'pg_stat_activity'の内容はあなたのトランザクションを終了しない限り更新されません –