本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
調整RDS後 SQL Aurora 波與 Amazon DevOps 大師主動洞察
DevOpsGuru 主動洞察會偵測 Postgre SQL 資料庫執行個體上可能導致問題的 上的狀況,並在發生問題之前讓您瞭解這些狀況。RDS主動洞察可以提醒您交易連接中長時間運行的閒置。如需疑難排解交易連線中長時間執行閒置的詳細資訊,請參閱 資料庫在交易連線中長時間閒置
DevOps大師可以執行以下操作:
-
透過交叉檢查一般建議設定與您的資料庫設定,避免許多常見的資料庫問題。
-
警告您機群內的重大問題,若未勾選,可能導致更嚴重的問題。
-
提醒您新發現的問題。
每個主動洞察都包含問題原因分析和修正動作建議。
有關 Amazon DevOps 大師 Amazon 的更多信息RDS,請參閱使用 Amazon 專用的 Amazon DevOps 大師分析性能異常 RDS。
資料庫在交易連線中長時間閒置
資料庫的連線已經超過 1800 秒都處在 idle in transaction
狀態。
支援的引擎版本
所有版本的 RDSPostgre SQL Postgre 都支援此洞察資訊。SQL
Context
idle in transaction
狀態的交易可以擁有封鎖其他查詢的鎖定。也可以防止 VACUUM
(包含自動清空) 清理無效資料列,導致索引或資料表膨脹,或導致交易 ID 包圍。
造成此問題的可能原因
在互動式工作階段中起始的交易,BEGIN或使用COMMITROLLBACK、或END命令STARTTRANSACTION未結束的交易。這會導致交易移至 idle in
transaction
狀態。
動作
您可以透過查詢 pg_stat_activity
,找出閒置的交易。
在SQL客戶端中,運行以下查詢以列出idle in transaction
狀態中的所有連接,並按持續時間對其進行排序:
SELECT now() - state_change as idle_in_transaction_duration, now() - xact_start as xact_duration,* FROM pg_stat_activity WHERE state = 'idle in transaction' AND xact_start is not null ORDER BY 1 DESC;
根據洞察的原因,我們會建議不同的動作。
End 交易
當您使用BEGIN或在互動式工作階段中啟動交易時 STARTTRANSACTION,它會移至idle in transaction
狀態。它會保持在此狀態,直到您透過發出COMMITROLLBACK、END指令或完全中斷連線以復原交易來結束交易為止。
終止連線
使用以下查詢,終止與閒置交易的連線:
SELECT pg_terminate_backend
(pid)
;
pid 是連線的程序 ID。
設定 idle_in_transaction_session_timeout 參數
在新的參數群組中設定 idle_in_transaction_session_timeout
參數。設定此參數的優點在於,不需要手動介入即可終止長時間閒置的交易。如需有關此參數的詳細資訊,請參閱 Postgre SQL 文件
當交易處於 idle_in_transaction 狀態超過指定時間時,連線終止後,Postgre SQL 記錄檔中會報告下列訊息。
FATAL: terminating connection due to idle in transaction timeout
檢查狀AUTOCOMMIT態
AUTOCOMMIT依預設為開啟。但是,若客戶端意外將其關閉,請確認重啟。
-
在 psql 用戶端執行下列命令:
postgres=>
\set AUTOCOMMIT on
-
在 pgadmin 中,通過從向下箭頭中選擇選AUTOCOMMIT項來打開它。
檢查應用程式程式碼中的交易邏輯
調查應用程式邏輯,找出可能的問題。考慮下列動作:
-
檢查應用程序中的 JDBC auto 提交是否設置為 true。另外,請考慮在程式碼中使用明確的
COMMIT
命令。 -
檢查錯誤處理邏輯,確認其是否會在發生錯誤後關閉交易。
-
檢查交易開啟時,您的應用程式是否需要長時間處理查詢傳回的資料列。若是如此,請考慮對應用程式進行編碼,在處理資料列之前關閉交易。
-
檢查交易是否包含許多長時間執行的操作。若是如此,請將單一交易分割為多筆交易。
相關指標
下列 PI 指標與此洞察相關:
-
idle_in_transaction_count - 處於
idle in transaction
狀態的工作階段數量。 -
idle_in_transaction_max_time - 處於
idle in transaction
狀態的最長時間執行交易。