プログラミング

【2021年最新版】PostgreSQLでSQLでプロセスを確認とkillする方法

2021年9月7日

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);

/

-プログラミング
-, , ,