2

PostgreSQL の接続リークを調査しており、いくつかの診断情報を収集したいと考えています。

特に、作成した各接続にいくつかの情報を関連付けて、直接クエリできるようにしたいと考えています。

MS-SQL でこの種のものを設計していた場合、接続ファクトリを変更して、各接続が確立された後に@@spid 、バックトレース、およびその他の診断情報を含む診断テーブルに対して upsert を実行します。

次に、何が起こっているのかを診断するために、spid の診断テーブルに参加しているsysprocessesにクエリを実行できます。これにより、各接続に関連付けられたクリーンなアプリケーションバックトレースが得られます。

PostgreSQL で同様のことを達成するにはどうすればよいですか?

4

1 に答える 1

4

PostgreSQL は、各接続を処理するために新しいプロセスをフォークします。このプロセスの PID は簡単に取得できます。

SELECT pg_backend_pid();

topこれは、標準の管理ツール ( 、psなど)で表示されるプロセス ID に対応します。標準ツール ( kill) を使用して接続を終了することも、適切な権限があれば、 と言って接続を終了することもできますSELECT pg_terminate_backend(pid)

データベースでは、現在のセッションのリストにもアクセスできます。

SELECT * FROM pg_stat_activity;

最後に 1 つ: PID は、クエリが実行された時点で一意であることが保証されていますが、最終的にはオペレーティング システムによって再利用されます。PID を のbackend_start列と組み合わせることで、一意性を確保できますpg_stat_activity。さらに言えば、それをログにまとめることもできます。

INSERT INTO log_table (pid, backend_start, message, backtrace)
SELECT procpid, backend_start, 'my message', 'my backtrace'
FROM pg_stat_activity
WHERE procpid=pg_backend_pid();
于 2012-10-04T18:41:46.130 に答える