2015-08-03 26 views
1

我週期性地向PostgreSQL發送連接問題 - 「致命:其餘連接插槽保留給非複製超級用戶連接」或「達到隊列池大小5溢出限制10,連接計時出,超時30「取決於psycopg或金字塔是否引發異常。確定事務管理器安裝正確後,不知道爲什麼我仍然沒有連接。使用Python和PostgreSQL跟蹤數據庫連接問題

我知道連接數據是和pg_stat_activity但它是一個單一的快照。有沒有什麼是真正運行在(從它的一個問題,直到問題需要重新啓動應用程序的時間之前最好)一段時間看到隨着時間的推移連接,這樣我可以看到剛纔的方法嗎?

回答

3

第一部分是在正確識別在所有的時間點運行的查詢。爲此,我使用此查詢:

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文件顯示腳本是否按預期運行(但它並非真正需要)。顯然,每秒鐘都要這樣運行一個腳本可能會對系統造成負擔,但是當你沒有其他方式來查找這些信息時,這是一個短期措施,所以它應該是值得的。只要你需要積累足夠的數據,並希望它應該付錢,就運行這個腳本。

+0

您可以自己標記爲正確的答案。 –