与Adobe Commerce上max_allowed_packet相关的数据库错误
本文为导入大量产品或执行其他任务强制服务器处理大于max_allowed_packet
中设置的大于默认值16MB的数据包时,var/log/exception.log
中可能发生的数据库连接错误提供了解决方案。
受影响的产品和版本
- Adobe Commerce内部部署,所有支持的版本
问题
当MySQL客户端或mysqld服务器收到大于max_allowed_packet字节的数据包时,它会发出ER_NET_PACKET_TOO_LARGE错误(可在exception.log
中看到)并关闭连接。 对于某些客户端,如果通信数据包太大,则在查询 错误期间您还可能会收到 与MySQL服务器的丢失连接。
重现步骤
各种任务都可能导致此问题。 这可能包括尝试将大量产品导入Adobe Commerce或发送过多数据的事务性查询。 结果是var/log/exception.log
中的数据库连接错误和其他问题,如未成功导入产品。
原因
MySQL max_allowed_packets
设置的默认值16MB不够大,无法满足您的需求。
解决方案
-
标识单个行超过当前
max_allowed_packet
限制的查询。 需要重写此类查询以减少返回的数据量。 可以通过在SELECT
语句中具有更少列数或为表设计中的各个列选择更小的数据类型来实现这一点。 如果您拥有New Relic帐户,请使用New Relic APM错误页面、New Relic APM数据库页面和New Relic日志搜索相关查询。 -
为快速修正,您可以在提交票证时临时请求增加
max_allowed_packet
的大小,但这由客户工程团队自行决定,因为值过大可能会导致网络拥塞,进而导致复制失败。 -
作为最佳实践,您应在CLI中针对某些大型数据库表运行以下命令:
code language-none show table status like [table name to match]
评估在这些表上运行的查询,以确定是否超过建议的
max_allowed_packet
大小(16MB)。 执行步骤一中的相同过程,减少此类查询返回的数据。
相关阅读
- 我们的开发人员文档中的内部部署安装概述。
- 数据库上载将断开与支持知识库中 MySQL的连接。
- 在我们的支持知识库中云基础架构上Adobe Commerce的数据库最佳实践。
- 解决支持知识库中数据库性能问题的最佳实践。
- 在Commerce实施行动手册中修改数据库表的最佳实践