為什麼我在連線至 Amazon Aurora MySQL 執行個體時會遇到「過多連線」錯誤?

2 分的閱讀內容
0

我在嘗試連線至 Amazon Aurora MySQL 資料庫執行個體時遇到「過多連線」錯誤。我的資料庫執行個體的最大連線值是多少?如何調整這個值?

簡短描述

如果在您嘗試連線至 Amazon Aurora MySQL 資料庫叢集或執行個體時,用戶端遇到「過多連線」錯誤,則表示其他用戶端正在使用所有可用連線。這是由 max_connections 參數所定義。

您可能會看到下列任何症狀:

  • Amazon CloudWatch 中的 DatabaseConnections 指標接近或等於 Aurora MySQL 資料庫執行個體的 max_connections 值。
  • max_connections 參數的值高於資料庫執行個體類別為連線佈建的可用記憶體。請在 CloudWatch 中檢查是否存在 FreeableMemory 指標值較低之類的跡象。
  • 您在 MySQL 錯誤日誌中收到 ERROR 1040(): 過多連線錯誤。

您達到 max_connections 值的原因如下:

  • 連線至資料庫執行個體的用戶端/應用程式數量突然或逐漸增加。導致的原因如下:
    • 工作負載增加導致連線增加。
    • 資料表/列層級鎖定導致用戶端/應用程式連線增加。
  • 作業結束後,用戶端/應用程式未正確關閉連線。
  • wait_timeout 和/或 interactive_timeout 等連線逾時參數值較高,這可能導致休眠中連線增加。

在解決最大連線錯誤之前,請先檢閱目前在資料庫執行個體上執行的所有執行緒。然後,在資料庫執行個體上啟用日誌記錄。

顯示目前在 Aurora MySQL 資料庫執行個體上執行的執行緒

SHOW FULL PROCESSLIST 命令會顯示目前在資料庫執行個體上執行的執行緒。登入您的資料庫執行個體,然後執行下列查詢:

SHOW FULL PROCESSLIST\G

您也可以執行下列查詢以取得相同的結果集:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST

**注意:**您必須為使用者帳戶授予 MySQL PROCESS 伺服器管理特殊權限,才能查看在 MySQL 資料庫執行個體上執行的所有執行緒。否則,SHOW PROCESSLIST 僅顯示與您正在使用的 MySQL 帳戶相關的執行緒。如需詳細資訊,請參閱 MySQL 文件中的 MySQL 提供的特殊權限

注意SHOW FULL PROCESSLISTINFORMATION_SCHEMA.PROCESSLIST 陳述式可能會對效能產生負面影響,因為它們需要 Mutex。

在 Aurora MySQL 資料庫執行個體上啟用日誌記錄

透過 enabling general_logslow_query_log進階稽核日誌參數在 Aurora MySQL 資料庫執行個體上啟用日誌記錄。

解決方法

使用下列其中一種方法解決最大連線錯誤:

  • 檢閱現有連線,可能的話,將其終止以釋放連線壓力。例如,首先終止處於休眠狀態的連線。
  • 增加資料庫執行個體的最大連線數。

終止資料庫執行個體上的現有連線

透過執行 rds_killrds_kill_query 命令,終止目前在您的資料庫執行個體上執行的使用者工作階段或查詢:

CALL mysql.rds_kill(thread-ID);
CALL mysql.rds_kill_query(thread-ID);

增加資料庫執行個體的最大連線數

使用下列方法增加資料庫執行個體的最大連線數:

  • 將執行個體擴展至更多記憶體的資料庫執行個體類別。 **注意:**擴展資料庫執行個體類別會導致中斷。
  • 使用自訂執行個體層級參數群組,為 max_connections 參數設定較大的值。增加 max_connections 參數不會導致中斷,但是如果資料庫執行個體使用預設參數群組,則應將參數群組變更為自訂參數群組。變更參數群組會導致中斷。如需詳細資訊,請參閱使用資料庫參數群組

**注意:**Aurora MySQL 資料庫執行個體的最大允許連線數由資料庫執行個體的執行個體層級中的 max_connections 參數確定。請參閱以下範例:

max_connections = GREATEST({log(DBInstanceClassMemory/805306368)*45},{log(DBInstanceClassMemory/8187281408)*1000})

檢查資料庫執行個體的 max_connections 參數的目前值。若要這麼做,請檢查附加至資料庫執行個體的參數群組,或執行下列查詢:

select @@max_connections;

max_connections 參數具有以下規格:

  • 可以在資料庫叢集和資料庫執行個體參數群組上設定。但是,執行個體層級參數設定會生效。
  • 允許的值是 1-16000 範圍內的整數。

如需 Aurora MySQL 可用的每個資料庫執行個體類別的 max_connections 預設值的詳細資訊,請參閱 Aurora MySQL 資料庫執行個體的最大連線數.

**注意:**Aurora MySQL 和 Amazon Relational Database Service (Amazon RDS) MySQL 資料庫執行個體的記憶體額外負荷不同。對於使用相同執行個體類別的 Aurora MySQL 和 RDS MySQL 資料庫執行個體,max_connections 值可能不同。列出的值僅適用於 Aurora MySQL。

調整 max_connections 參數的最佳做法

使用資料庫執行個體的 max_connections 參數時,請務必考慮下列事項。

  • 如果系統對其他主要記憶體取用者 (例如緩衝集區和查詢快取) 使用的是預設值,則需要調整系統的預設連線限制。如果您變更資料庫叢集的這些設定,請考慮調整連線限制,以增加或減少資料庫執行個體的可用記憶體。
  • max_connections 設定為略高於您預期在每個資料庫執行個體上開啟的最大連線數。
  • 如果您還啟用 performance_schema,請謹慎設定 max_connections 參數。效能架構記憶體結構將根據伺服器組態變數 (包括 max_connections) 自動調整大小。您設定的變數越高,效能架構使用的記憶體就越多。在極端情況下,這可能會導致小型執行個體類型 (例如 T2 和 T3) 發生記憶體不足問題。如果您使用的是效能架構,最佳做法是將 max_connections 保留為預設值。如果您打算將 max_connections 設定為明顯高於預設值的值,請考慮停用效能架構。 **注意:**如果您為 Aurora MySQL 資料庫執行個體啟用效能洞察,則效能架構會自動啟用。

您還可以考慮對下列 MySQL 連線參數進行調整:

  • wait_timeout: 伺服器在關閉非互動式 TCP/IP 或 UNIX 檔案連線之前等待其活動的秒數。
  • interactive_timeout: 伺服器在關閉互動式連線之前等待其活動的秒數。
  • net_read_timeout: 在捨棄讀取之前,等待來自 TCP/IP 連線的更多資料的秒數。
  • net_write_timeout: 在捨棄寫入之前,等待來自 TCP/IP 連線寫入區塊的秒數。
  • max_execution_time: SELECT 陳述式的執行逾時時間 (以毫秒為單位)。
  • **max_connect_errors:**如果中斷連線的數量超過此參數,則會封鎖主機繼續連線。
  • max_user_connections: 任何指定 MySQL 帳戶允許同時連線的最大數量。

**注意:**本文不提供這些參數的建議值或自訂值,因為這些值會根據個別使用案例而有所不同。


相關資訊

Aurora MySQL 資料庫執行個體的最大連線數

如何檢查 Amazon RDS MySQL 資料庫執行個體的正在執行的查詢?

結束工作階段或查詢

AWS 官方
AWS 官方已更新 3 年前