PostgreSQLのプロセスを停止させる方法のメモ
くっそ重いクエリを流してしまった!
CPU・メモリをゴリゴリ喰ってる!!
やばいッッッ!
- こんな場合にもプロセスを止めるといい
- トランザクション中にコミットもロールバックもせず放置され他のプロセスがロック開放待ちになった
- 高コストの処理を実行してしまい、結果を取得する前に終わらせてしまいたい
そんな時の対処法をご紹介します。
さぁ、いらないプロセスをブッKillそう!
事前にプロセスIDを調べておきましょう。
1 2 |
SELECT * from pg_stat_activity; |
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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がわかったら
下記のコマンドを実行してプロセスを止めます。
1 2 |
SELECT pg_cancel_backend(プロセスID); |
ちなみに縦表示は
1 2 |
x |
でできるようになります。
おまけ
ロック中のプロセスの一覧表示を行うクエリ
1 2 3 4 5 6 |
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; |