問題のあるセッションは、pg_terminate_backend関数を使って終了できます。
SELECT pg_terminate_backend(PID);
長時間実行中のクエリを特定する
PostgreSQLでセッションを終了する前に、どのセッションを対象にするかを把握する必要があります。長時間実行中のクエリを見つけるには、pg_stat_activityビューを使い、stateカラムとquery_startカラムで絞り込みます。
SELECT pid, usename, state, query, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
出力例:
| pid | usename | state | query | duration |
|---|---|---|---|---|
| 1236 | appuser | active | UPDATE orders SET status=’paid’; | 00:20:34 |
| 1234 | postgres | active | SELECT * FROM users; | 00:05:12 |
セッションを終了する
問題のあるセッションを特定したら、pg_terminate_backend関数を使ってそのセッションを終了できます。
SELECT pg_terminate_backend(1236);
このコマンドはバックエンドへの接続を強制的に終了します。プロセスにSIGTERMシグナルを送信して安全に終了させるため、終了前に後処理を行う最後の機会が与えられます。このコマンドを実行する前に、実行中のクエリの内容を必ず確認し、出力結果を検討してください。
セッション終了を自動化する
セッションの問題が頻繁に発生する環境では、スクリプトを使ってセッションの終了を自動化できます。長時間実行中のクエリを終了する基本的なスクリプトの例を以下に示します:
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN
SELECT pid
FROM pg_stat_activity
WHERE state = 'active'
AND now() - query_start > interval '10 minutes'
LOOP
PERFORM pg_terminate_backend(r.pid);
END LOOP;
END $$;
このスクリプトは、10分以上実行されているアクティブなセッションをすべて終了します。
pg_cancel_backend関数を使う
セッションを強制終了するのではなく、そのセッションで実行中のクエリだけをキャンセルしたい場合もあります。そのようなときはpg_cancel_backend関数を使用できます。
SELECT pg_cancel_backend(PID);
PIDは、キャンセルしたいクエリを実行しているセッションのプロセスIDに置き換えてください。
このコマンドはプロセスにSIGINTを送信してクエリをキャンセルします。pg_terminate_backendほど強引ではなく、実行中のクエリはキャンセルされますが、セッション自体は維持されます。
なお、pg_cancel_backendとpg_terminate_backendはいずれもスーパーユーザー権限を必要とします。終了またはキャンセルしようとしているセッションがスーパーユーザーのものである場合、これらのコマンドを正常に実行するにはスーパーユーザー権限が必要です。
まとめ
これでPostgreSQLでセッションを強制終了する方法がわかりました。PostgreSQLのセッション管理は、データベース管理者にとって重要なスキルです。問題のあるセッションを的確に特定して終了することで、PostgreSQLデータベースのパフォーマンスと信頼性をより良く維持できます。これらのコマンドは誤って使うと重要なデータ処理を中断させ、PostgreSQLデータベースの整合性を損なう恐れがあるため、慎重に使用してください。
こちらの記事もおすすめです:
Beekeeper Studioは無料のオープンソースのデータベースGUIです
これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper Studio 利用者の声
「Beekeeper Studioで以前のSQLワークフローを完全に置き換えました。高速で直感的で、データベース作業がまた楽しくなりました。」
「多くのデータベースGUIを試してきましたが、Beekeeperは機能とシンプルさのバランスが絶妙です。とにかくちゃんと動きます。」