跳至內容

如何對在 Aurora PostgreSQL 相容版資料庫叢集上執行查詢時,發生的「Statement timeout」錯誤進行疑難排解?

2 分的閱讀內容
0

我想對在 Amazon Aurora PostgreSQL 相容版資料庫叢集上執行查詢時,發生的陳述式逾時錯誤進行疑難排解。

解決方法

重要:Performance Insights 將於 2026 年 6 月 30 日終止服務。您可以在 2026 年 6 月 30 日之前升級至 Database Insights 的進階模式。若您未升級,使用 Performance Insights 的資料庫叢集將預設為 Database Insights 的標準模式。只有 Database Insights 的進階模式才支援執行計畫與隨需分析。如果您的叢集預設為標準模式,那麼您可能無法在主控台上使用這些功能。若要啟用進階模式,請參閱啟用 Amazon RDS 的 Database Insights 進階模式啟用 Amazon Aurora 的 Database Insights 進階模式

如果查詢未在 statement_timeout 參數指定的時間內完成執行,則 statement_timeout 參數會取消該查詢。您會收到以下錯誤訊息:

「ERROR: canceling statement due to statement timeout.」

若要疑難排解此錯誤,請採取以下動作。

檢查已設定的 statement_timeout 參數

若要在資料庫叢集參數群組資料庫參數群組中檢查 statement_timeout 參數,請執行以下 SELECT 查詢:

SELECT name, setting, unit, context, source FROM pg_settings WHERE name = 'statement_timeout';

預期輸出:

       name        | setting | unit | context |       source
-------------------+---------+------+---------+--------------------
 statement_timeout | 5000    | ms   | user    | configuration file

**注意:**在範例輸出中,statement_timeout 參數的值為 5000 毫秒。「來源」欄位顯示為「組態檔」,表示該參數設為叢集參數群組層級。

接著,請在角色層級與資料庫層級檢查 statement_timeout 參數。

若要檢查資料庫叢集中所有角色的角色層級組態,請執行以下查詢:

SELECT r.rolname, d.datname, s.setconfig
FROM pg_db_role_setting s
JOIN pg_roles r ON r.oid = s.setrole
LEFT JOIN pg_database d ON d.oid = s.setdatabase
WHERE s.setconfig::text LIKE '%statement_timeout%'
ORDER BY r.rolname;

若要檢查叢集中所有資料庫的資料庫層級組態,請執行以下查詢:

SELECT d.datname, rs.setconfig
FROM pg_db_role_setting rs
JOIN pg_database d ON d.oid = rs.setdatabase
WHERE rs.setrole = 0;

檢閱輸出結果,確認是否在角色或資料庫層級設定任何 statement_timeout 組態,這些設定可能會覆寫叢集層級設定。

**注意:**使用 ALTER ROLE SET 設定的 Statement_timeout 參數不會繼承到子角色。如果您為角色設定 statement_timeout 參數,則只有在您登入該角色時才能使用此參數。如需更多資訊,請參閱 PostgreSQL 網站上的 ALTER ROLE

識別已取消的 SQL 查詢

檢視 PostgreSQL 錯誤日誌檔案,然後判斷 log_min_error_statement 參數是否設為 ERROR 或更低的嚴重性。識別失敗的陳述式後,找出失敗的 SQL 與資料表名稱。如需更多資訊,請參閱了解 log_line_prefix 參數

識別查詢執行時間過長的原因

如果您找到失敗的 SQL 查詢,請使用 CloudWatch Database Insights 來識別遭封鎖的交易。

若要使用 CloudWatch Database Insights 分析效能,請完成以下步驟:

  1. 開啟 Amazon Relational Database Service (Amazon RDS) 主控台。
  2. 在導覽窗格中,選擇 Databases (資料庫)。
  3. 選取您的 Aurora PostgreSQL 資料庫叢集。
  4. 選擇 Monitoring (監控) 索引標籤。
  5. 在 Performance Insights 選擇 View details (檢視詳細資料)。
  6. 檢閱資料庫負載。您可以依等待事件、SQL 查詢、主機或使用者將資料庫負載分組,以識別遭封鎖的交易。

如果問題可穩定重現,請為您的資料庫執行個體設定 log_min_duration_statement 參數,並使用 auto_explain 模組。如需更多資訊,請參閱如何記錄 Amazon RDS PostgreSQL 或 Aurora PostgreSQL 的查詢執行計畫,以調整查詢效能?

您可以使用 EXPLAINEXPLAIN ANALYZE 命令來取得查詢執行計畫。如需更多資訊,請參閱如何在 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 相容版資料庫執行個體中,識別與疑難排解效能問題及執行緩慢的查詢?

檢查來源資料表中是否存在無效資料列

無效資料列或元組可能會增加 SELECT 時間。若要檢查來源資料表中是否有大量無效資料列,請執行以下查詢:

SELECT * FROM pg_stat_user_tables WHERE relname = 'table_name';

**注意:**將 table_name 替換為來源資料表的名稱。

相關資訊

如何結束 Amazon RDS for PostrgreSQL 或 Aurora PostgreSQL 相容版資料庫執行個體上,執行時間過長的查詢?

如何確定是什麼原因導致 Amazon RDS PostgreSQL 或 Aurora PostgreSQL 資料庫執行個體上的查詢遭到封鎖?

AWS 官方已更新 6 個月前