広告 PostgreSQL

【PostgreSQL】実行中のプロセスをキャンセルして停止させる

PostgreSQLのプロセスを停止させる方法のメモ

くっそ重いクエリを流してしまった!

CPU・メモリをゴリゴリ喰ってる!!

やばいッッッ!

  • こんな場合にもプロセスを止めるといい
  • トランザクション中にコミットもロールバックもせず放置され他のプロセスがロック開放待ちになった
  • 高コストの処理を実行してしまい、結果を取得する前に終わらせてしまいたい

そんな時の対処法をご紹介します。

さぁ、いらないプロセスをブッKillそう!

事前にプロセスIDを調べておきましょう。

SELECT * from pg_stat_activity;

実行例

postgres=# SELECT * from pg_stat_activity;
-[ RECORD 1 ]----+--------------------------------
datid            | 12870
datname          | postgres
pid              | 16883
usesysid         | 10
usename          | postgres
application_name | psql
client_addr      |
client_hostname  |
client_port      | -1
backend_start    | 2014-06-13 16:47:55.094149+09
xact_start       | 2014-06-13 16:49:46.132018+09
query_start      | 2014-06-13 16:49:46.132018+09
state_change     | 2014-06-13 16:49:46.132022+09
waiting          | f
state            | active
query            | SELECT * from pg_stat_activity;

上記のクエリを流して、止めたいプロセスIDがわかったら
下記のコマンドを実行してプロセスを止めます。

SELECT pg_cancel_backend(プロセスID);

ちなみに縦表示は\xでできるようになります。

おまけ

ロック中のプロセスの一覧表示を行うクエリ

SELECT l.pid, db.datname, c.relname, l.locktype, l.mode
FROM pg_locks l
        LEFT JOIN pg_class c ON l.relation=c.relfilenode
        LEFT JOIN pg_database db ON l.database = db.oid
ORDER BY l.pid;

Sponsor Link

-PostgreSQL