與Adobe Commerce上max_allowed_packet相關的資料庫錯誤

本文針對var/log/exception.log中的資料庫連線錯誤,提供解決方案,此錯誤可能在匯入大量產品或執行其他工作時發生,強制伺服器處理大於max_allowed_packet中設定的大於預設值16MB的封包。

受影響的產品和版本

問題

當MySQL使用者端或mysqld伺服器收到大於max_allowed_packet位元組的封包時,它會發出ER_NET_PACKET_TOO_LARGE錯誤(可在exception.log中看到)並關閉連線。 如果通訊封包太大,對於某些使用者端,您也可能在查詢​ 錯誤期間收到 ​與MySQL伺服器的連線中斷。

要再現的步驟

有各種不同的任務會產生此問題。 這可能包括嘗試將大量產品匯入Adobe Commerce或傳回太多資料的異動查詢。 結果是var/log/exception.log中的資料庫連線錯誤,以及其他問題,例如無法成功匯入產品。

原因

MySQL max_allowed_packets設定的預設值16MB不夠大,無法滿足您的需求。

解決方案

  1. 識別個別資料列超過目前max_allowed_packet限制的查詢。 這類查詢需要重寫以降低傳回的資料量。 若要這麼做,可在SELECT陳述式中減少資料行數目,或是為資料表設計中的各個資料行選擇較小的資料型別。 如果您有New Relic帳戶,請使用New Relic APM錯誤頁面New Relic APM資料庫頁面以及New Relic記錄檔來搜尋相關查詢。

  2. 為了快速修正,您可以在您提交票證時暫時要求增加max_allowed_packet大小,但這是由客戶工程團隊自行決定,因為值太大可能會導致網路阻塞,進而導致復寫失敗。

  3. 最佳實務是,您應該在CLI中針對某些大型資料庫表格執行下列命令:

    code language-none
    show table status like [table name to match]
    

    評估在這些資料表上執行的查詢,以判斷您是否超過建議的16MB max_allowed_packet大小。 請依照步驟一中的相同程式操作,以減少這類查詢傳回的資料。

相關閱讀

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a