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で、問題が出るというのも不思議な気がしますが、ここらへんの知識が浅いので、少し勉強になりました。