第一部分是在正確識別在所有的時間點運行的查詢。爲此,我使用此查詢:
SELECT (SELECT COUNT(1) FROM pg_stat_activity) AS total_connections,
(SELECT COUNT(1) FROM pg_stat_activity
WHERE current_query in ('<IDLE>', '<IDLE> in transaction'))
AS idle_connections,
current_query
FROM pg_stat_activity
WHERE current_query NOT IN ('<IDLE>', '<IDLE> in transaction')
AND NOT procpid=pg_backend_pid();
注意! 「current_query」在postgresql的後續版本中簡單地稱爲「查詢」(從9.2開始)
這會去掉所有閒置的數據庫連接(看到IDLE連接不會幫你修復它)和「NOT procpid = pg_backend_pid()「將該查詢本身排除在結果中(這會使你的輸出大大增加)。您還可以通過datname如果要隔離特定數據庫進行過濾。
我需要這些結果的方式,是很容易對它們進行查詢,所以我使用的數據庫上的表。這應該工作: CREATE TABLE connection_audit ( 快照時間戳沒有時區NOT NULL DEFAULT現在(), total_connections整數, idle_connections整數, 查詢文本 ) WITH( OIDS = FALSE );
這將存儲在「快照」當前時間戳,總的和空閒連接和查詢本身。
我寫了一個腳本將頂部查詢插入表中並將其保存到名爲「pg_connections.sql」的文件中。
我跑到一個腳本,將這些成果轉化爲表中的每一第二:
while true ; do psql -U user -d database_name -f 'pg_connections.sql' >> connections.log ; sleep 1; done
這是什麼切實做好被寫入所有當前執行的查詢表。
尾隨connections.log文件顯示腳本是否按預期運行(但它並非真正需要)。顯然,每秒鐘都要這樣運行一個腳本可能會對系統造成負擔,但是當你沒有其他方式來查找這些信息時,這是一個短期措施,所以它應該是值得的。只要你需要積累足夠的數據,並希望它應該付錢,就運行這個腳本。
您可以自己標記爲正確的答案。 –