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; 
			 
			