💻
PostgreSQLでプロセス確認とプロセスkill
最近、PostgreSQL のロックに遭遇することが頻発してる。
備忘もかねて、プロセスの確認と kill する方法を残しておく。
対象
- PostgreSQL でプロセスを確認したい人
- PostgreSQL で処理を kill したい人
環境
- PostgreSQL12
プロセス確認
SQL の解説も書いているので興味があれば参考に。
sql
select
sel.pid as プロセス ID,
sel.start as 開始時刻,
sel.sql as 実行 SQL
from
(
select
pg_stat_get_backend_pid(sgbi.bid) as pid,
pg_stat_get_backend_activity_start(sgbi.bid) as start,
pg_stat_get_backend_activity(sgbi.bid) as sql
from
(
select
pg_stat_get_backend_idset() as bid
) as sgbi
) as sel
where
sel.sql <> '' -- 現在実行中の SQL が存在する場合のみ取得
-- and
-- sel.procpid ='' -- プロセス ID が特定できればここで指定
order by
pid desc; -- プロセス ID 順にソート
;
SQL の解説
各情報は 統計情報関数を使って取得する。
ポイントとなる部分をピックアップして解説。
行 | コード | 説明 |
---|---|---|
8 | pg_stat_get_backend_pid | バックエンド ID 番号に紐付くプロセス ID を取得 |
9 | pg_stat_get_backend_activity_start | バックエンド ID 番号に紐付く処理の開始時刻を取得 |
10 | pg_stat_get_backend_activity | バックエンド ID 番号を取得 |
14 | select pg_stat_get_backend_idset | バックエンド ID 番号に紐付く実行 SQL を取得 |
プロセスを kill する方法
kill する方法は 2 パターン。
kill できる点では同じだが、挙動は異なるので注意。
pg_cancel_backend で kill する
実行中の SQL をキャンセルする。
セッションが残っているので、データベースへ再接続が不要。
sql
SELECT pg_cancel_backend(int:プロセス ID);
プロセス ID:プロセス確認で取得したプロセス ID
pg_terminate_backend で kill する
セッションを切断する。
セッションが切れるので、データベースへ再接続が必要。
sql
SELECT pg_terminate_backend(int:プロセス ID);
プロセス ID:プロセス確認で取得したプロセス ID
Discussion