我使用 Amazon Relational Database Service (Amazon RDS) for MySQL 或 Amazon Aurora MySQL 相容版本的資料庫執行個體。我收到「讀取通訊封包時發生錯誤」的錯誤訊息。
簡短說明
如果伺服器用戶端連線中斷、未正確關閉或失敗,Amazon RDS 即會遞增 aborted_clients 或 aborted_connects 的狀態計數器。aborted_clients 參數說明 Amazon RDS 因用戶端當機且未正確關閉連線而中止的連線數量。aborted_connects 參數說明嘗試連線至 MySQL 伺服器失敗的次數。
如果其中一個參數的值增加,則您會在記錄中收到下列錯誤:
"[警告] 已中止 abc 與 db 的連接:'資料庫名稱' 使用者:'使用者名稱' 主機:'主機 IP' (讀取通訊封包發生錯誤)"。
如果 log_error_verbosity 的值超過 2,則您也會收到前述的錯誤。log_error_verbosity 參數指定管理要記錄至錯誤日誌的事件的詳細程度。
如需詳細資訊,請參閱 MySQL 網站上的 B.3.2.9 通訊錯誤和中止連線。
下列因素可能會導致讀取通訊封包時發生錯誤的錯誤:
- 用戶端或驅動程式不相容性。
- 可關閉任何閒置連線或封鎖連線的防火牆或 Proxy。
- 不正確關閉用戶端伺服器連線,並導致 RDS for MySQL 內部的休眠中連線數量增加。
- 不正確終止連線的用戶端應用程式。
**注意:**MySQL 強制關閉長時間閒置的連線。
- 超過 wait_timeout 或 interactive_timeout 閾值的閒置連線數。
- 取得連線封包時,超過 connect_timeout 秒數閾值的用戶端連線。
- net_write_timeout 和 net_read_timeout 等參數的值不足。
- max_allowed_packet 參數值已超過。
注意: 如果值太小或查詢需要的記憶體超過 Amazon RDS for MySQL 的配置量,則您會收到上述的錯誤。
解決方法
檢查連線逾時參數值。找出問題的根本原因之後,請根據您識別的問題變更參數值。然後,在測試新值時監視 MySQL 錯誤日誌。
疑難排解您的組態
檢查您是否使用 Amazon RDS 參數群組的預設值。您可能需要修改資料庫執行個體的預設連線逾時值。如需詳細資訊,請參閱與連線逾時相關的參數區段,位於設定 Amazon RDS for MySQL 參數最佳實務,第 3 部分: 與安全性、作業管理性和連線逾時相關的參數。
為 connect_timeout 設定較高的值,以測試此值是否會降低錯誤讀取通訊封包錯誤的發生次數。connect\ _timeout 參數定義 MySQL 伺服器資料庫執行個體回應不成功交握之前必須等待的秒數。如需詳細資訊,請參閱 MySQL 網站上的 connect_timeout。
您也可以修改 interactive_timeout 和 wait_timeout。如需有關這些參數的詳細資訊,請參閱 MySQL 網站上的 wait_timeout 或 interactive_timeout。使用連線共用的應用程式 (像是 Java) 必須具有與連線共用設定相符的逾時。
如果執行個體必須管理大型查詢、大型 BLOB 欄或長字串,則增加 max_allowed_packet 的值。如果資料列的資料超過 max_allowed_packet 值,則會收到錯誤。如需詳細資訊,請參閱 max_allowed_packet 區段,位於設定 Amazon RDS for MySQL 參數的最佳實務,第 3 部分: 與安全性、作業管理性和連線逾時相關的參數。或者,請參閱 MySQL 網站上的 max_allowed_packet。此外,增加 net_write_timeout 和 net_read_timeout 的值。
注意: 您可以將 net_write_timeout 和 net_read_timeout 設定為與 wait_timeout 相同的值。如需詳細資訊,請參閱 MySQL 網站上的 net_write_timeout和 net_read_timeout。
請確定 RDS for MySQL 或 Aurora MySQL 相容連線正確關閉。退出資料庫前,請務必從用戶端應用程式呼叫 mysql_close() 函數。
進階疑難排解
如果您仍然收到讀取通訊封包時發生錯誤的錯誤訊息,請執行下列任一動作:
相關資訊
如何修改 Amazon RDS 資料庫參數群組的值?
為什麼 RDS 資料庫執行個體上的資料庫連線中斷?
如何開啟 Aurora Serverless 叢集上的日誌,以檢視並下載日誌?