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;