PostgreSQLを使っている時にデットロックの発生などで実行中のプロセスの確認をしてkillしたい時の対応方法をメモがてら残しておく。
PostgreSQLでSQLでプロセスを確認する方法
<PostgreSQLでプロセスを確認するSQL>
このSQLで実行中のSQLのプロセスIDと実行した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の解説>
各情報は 統計情報関数を使って取得する。
ドキュメントのバージョンは12系だが、最新の13系でも使うことができる。
ポイントとなる部部をピックアップして解説。
- 9行目:pg_stat_get_backend_pid(sgbi.bid)
統計情報関数を使いバックエンドID番号に紐付くプロセスIDを取得する。 - 10行目:pg_stat_get_backend_activity_start(sgbi.bid)
統計情報関数を使いバックエンドID番号に紐付くSQLの開始時刻を取得する。 - 11行目:pg_stat_get_backend_activity(sgbi.bid)
統計情報関数を使いバックエンドID番号に紐付く実行SQLを取得する。 - 14~15行目: select pg_stat_get_backend_idset()
- 統計情報関数を使いバックエンドID番号を取得する。
PostgreSQLでSQLでプロセスをkillする方法
killする方法は2種類。
どちらもサーバシグナル送信関数を使ってプロセスをkillする。
killできる点では同じだが、詳細は挙動は異なるので注意。
<pg_cancel_backendでkillする>
実行中の SQL をキャンセルする。
セッションが残っているので、データベースへ再接続が不要。
- プロセスID
プロセスの確認SQLで取得したプロセスIDからkillしたいプロセスIDを指定。
SELECT pg_cancel_backend(int:プロセスID);
<pg_terminate_backendでkillする>
セッションを切断する。
セッションが切れるので、データベースへ再接続が必要。
- プロセスID
プロセスの確認SQLで取得したプロセスIDからkillしたいプロセスIDを指定。
SELECT pg_terminate_backend(int:プロセスID);
/