与Adobe Commerce上max_allowed_packet相关的数据库错误

本文为导入大量产品或执行其他任务强制服务器处理大于max_allowed_packet中设置的大于默认值16MB的数据包时,var/log/exception.log中可能发生的数据库连接错误提供了解决方案。

受影响的产品和版本

问题

当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]
    

    评估在这些表上运行的查询,以确定是否超过建议的max_allowed_packet大小(16MB)。 执行步骤一中的相同过程,减少此类查询返回的数据。

相关阅读

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