我收到「讀取通訊封包時發生錯誤」的錯誤訊息。我想解決在 Amazon Relational Database Service (Amazon RDS) for MySQL 或 Amazon Aurora MySQL 相容版本的資料庫執行個體中發生的這項錯誤。
簡短說明
如果伺服器用戶端連線中斷、不當關閉或失敗,Amazon RDS 即會遞增 aborted_clients 或 aborted_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 伺服器網站上的通訊錯誤和中止連線。
可觸發中止連線的因素包括但不限於:
解決方案
如果您在 RDS for MySQL 或 Aurora MySQL 相容中收到 中止連線錯誤,請務必檢閱您的 MySQL 參數值。識別問題的根本原因後,請更新參數並測試新的值,同時監控 MySQL 錯誤日誌。
當您對 Amazon RDS 中的中止連線錯誤進行疑難排解時,請考慮使用下列方法:
- 檢查您是否使用 Amazon RDS 參數群組的預設值。與連線逾時相關的參數預設值可能不適用於您的資料庫執行個體。如需詳細資訊,請參閱設定 Amazon RDS for MySQL 參數的最佳實務的與連線逾時相關的參數區段。
- 為 connect_timeout 設定較高的值,以查看是否有助於減少中止連線錯誤訊息的發生。此參數指定 MySQL 伺服器執行個體必須等待多久時間 (以秒為單位),才能以不良的信號交換回應。
- 修改 interactive_timeout 和 wait_timeout。使用連線共用的應用程式 (像是 Java) 必須具備符合連線共用設定的逾時。
- 如果執行個體必須處理大型查詢,請增加 max_allowed_packet 的值。如果資料列的資料比用戶端的 max_allowed_packet 值更多,即會回報錯誤。如果您使用的是大型的 BLOB 欄或長字串,請增加這個值。如需詳細資訊,請參閱設定 Amazon RDS for MySQL 參數的最佳實務的 max_allowed_packet 區段。
- 增加 net_write_timeout 和 net_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 叢集上的日誌,以檢視並下載日誌?