如何解決 Amazon RDS for MySQL 或 Aurora MySQL 相容中的「讀取通訊封包時發生錯誤」錯誤?

2 分的閱讀內容
0

我收到「讀取通訊封包時發生錯誤」的錯誤訊息。我想解決在 Amazon Relational Database Service (Amazon RDS) for MySQL 或 Amazon Aurora MySQL 相容版本的資料庫執行個體中發生的這項錯誤。

簡短說明

如果伺服器用戶端連線中斷、不當關閉或失敗,Amazon RDS 即會遞增 aborted_clientsaborted_connects 的狀態計數器。aborted_clients 參數說明因用戶端未正確關閉連線即當機而中止的連線數量。aborted_connects 參數說明嘗試連線至 MySQL 伺服器失敗的次數。

log_error_verbosity 指定處理適用於錯誤日誌的詳細程度。如果此參數的值超過數值 2,RDS for MySQL 即會將此資訊寫入您的錯誤日誌:

[Warning] Aborted connection xxx to db: '<database name>' user: '<user name>' host: '<host IP>' (Got an error reading communication packets)

每次 aborted_clients 或 aborted_connects 指標值的狀態計數器遞增時,即會觸發此警告。Amazon RDS 會使用資料庫錯誤日誌擷取此資訊。如需詳細資訊,請參閱 MySQL 伺服器網站上的通訊錯誤和中止連線

可觸發中止連線的因素包括但不限於:

  • 用戶端或驅動程式不相容性
  • 可關閉任何閒置連線或封鎖連線的防火牆或 Proxy。
  • 不當關閉用戶端伺服器連線,並導致 RDS for MySQL 內部的休眠中連線數量增加。
  • 不當終止連線的用戶端應用程式。如果連線已閒置一段時間,MySQL 即會強制關閉這些連線。然後,您會看到中止連線的訊息。
  • 超過 wait_timeoutinteractive_timeout 閾值的閒置連線。
  • 取得連線封包時,超過 connect_timeout 秒數閾值的用戶端連線。
  • net_write_timeoutnet_read_timeout 等參數的值不足。
  • max_allowed_packet 參數值已超過。如果值太小或查詢需要的記憶體超過 RDS for MySQL 的配置量,即會觸發中止連線的警告。

解決方案

如果您在 RDS for MySQL 或 Aurora MySQL 相容中收到 中止連線錯誤,請務必檢閱您的 MySQL 參數值。識別問題的根本原因後,請更新參數並測試新的值,同時監控 MySQL 錯誤日誌

當您對 Amazon RDS 中的中止連線錯誤進行疑難排解時,請考慮使用下列方法:

  • 檢查您是否使用 Amazon RDS 參數群組的預設值。與連線逾時相關的參數預設值可能不適用於您的資料庫執行個體。如需詳細資訊,請參閱設定 Amazon RDS for MySQL 參數的最佳實務與連線逾時相關的參數區段。
  • connect_timeout 設定較高的值,以查看是否有助於減少中止連線錯誤訊息的發生。此參數指定 MySQL 伺服器執行個體必須等待多久時間 (以秒為單位),才能以不良的信號交換回應。
  • 修改 interactive_timeoutwait_timeout。使用連線共用的應用程式 (像是 Java) 必須具備符合連線共用設定的逾時。
  • 如果執行個體必須處理大型查詢,請增加 max_allowed_packet 的值。如果資料列的資料比用戶端的 max_allowed_packet 值更多,即會回報錯誤。如果您使用的是大型的 BLOB 欄或長字串,請增加這個值。如需詳細資訊,請參閱設定 Amazon RDS for MySQL 參數的最佳實務max_allowed_packet 區段。
  • 增加 net_write_timeoutnet_read_timeout 的值。注意: 這些值可設為與 wait_timeout 相同的值。
  • 請確定 RDS for MySQL 或 Aurora MySQL 相容連線正確關閉。退出資料庫前,請務必從用戶端應用程式調用 mysql_close() 函數。

疑難排解提示

如果您仍會收到中止連線錯誤訊息,請嘗試下列疑難排解提示:

sudo tcpdump -vvv --interface eth0 port 3306 -W 10 -C 100

相關資訊

如何修改 Amazon RDS 資料庫參數群組的值?

為什麼 RDS 資料庫執行個體上的資料庫連線中斷?

如何開啟 Aurora Serverless 叢集上的日誌,以檢視並下載日誌?