pg_terminate_backendを複数件処理する方法

PostgreSQL

pg_terminate_backendって普通1件毎の処理だけど、どうしたら複数件一度に処理出来るの?

意外と調べてもなかなか出てこなくて困ったこと。pg_terminate_backendってpidを指定して実行するけど、1件しか指定出来なくて、カンマとかで区切ったりしてみても実行出来ずで、複数件一気に処理したい時に困った。。

そこで色々と調べていると海外のメディアで発見。このようにすることで可能でした。

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()
  AND pid <> pg_backend_pid()
  AND wait_event_type = 'Lock';

元々、SELECT pg_terminate_backendでプロセスをkillしていたところに、そのままFROM句を付けていけばいいという感じでした。

分かってしまえば簡単ですね。

最後に

今回DB周りで問題が起きてしまい、Lockしていたqueryをまとめてkillしました。
それでもまたLockが増えてきてしまい、という問題が起きたのですが、根本的な問題として、stateのidle transactionというのが起こっていて、そちらのレコードをkillしたら、今回は解消されました。

idle状態のtransactionで、問題が出るというのも不思議な気がしますが、ここらへんの知識が浅いので、少し勉強になりました。

コメントを残す