4 回答
TA贡献1780条经验 获得超1个赞
对我来说,解决这个问题的是增加最大数据包大小。
在 中my.cnf
,我添加了:
max_allowed_packet=200M
然后service mysql stop
,,,service mysql start
它成功了:)
TA贡献1824条经验 获得超6个赞
我们收到了类似的关于数据包乱序的 PHP 警告。为我们解决这个问题的是增加MySQL my.cnf 中的max_connections 。您当前的 max_connections 可能是 1024。我们将其增加到 4096,警告消失了。在 MySQL 中,您可以使用以下命令查看当前的 max_connections:
SHOW VARIABLES LIKE "%max_connections%"; or mysqladmin variables | grep max_connections
TA贡献1943条经验 获得超7个赞
我遇到了一个可重现的类似问题,这是一个编程错误:
我使用的是无缓冲的数据库游标,并且在触发其他数据库操作之前没有关闭游标。抛出的确切错误是Packets out of order. Expected 1 received 2.
TA贡献1966条经验 获得超4个赞
首先要检查的是wait_timeout
MySQL 服务器的时间,与应用程序在查询之间花费的时间有关。通过在 SQL 查询之间休眠时间超过wait_timeout秒,我能够一致地重新创建此错误。
如果您的应用程序执行查询,然后在一段时间内执行其他操作,并且花费的时间超过该时间,则 MySQL 服务器将终止连接,但您的 PHP 代码可能不知道服务器已断开连接。如果 PHP 应用程序随后尝试使用关闭的连接发出另一个查询,它将生成此错误(在我的测试中,与Expected 0 received 1
.
您可以通过以下方式解决此问题:
wait_timeout
在服务器上全局扩展或使用命令在每个会话的基础上扩展SET session wait_timeout=<new_value>;
捕获错误并重试一次
wait_timeout
当您知道查询之间已经过去了超过几秒时,抢先重新连接到服务器。
此错误也可能由于其他问题而发生。我会检查您是否使用持久连接,而不是一遍又一遍地连接到服务器。有时,连接过程,尤其是许多并发工作人员的连接过程,会导致大量网络开销,从而可能导致此类问题。
另外,有时,在生产、高交易量的服务器中,会发生奇怪的网络问题,并且这种情况可能只是偶尔发生,甚至在您的情况下似乎是通过环回接口发生的。
无论如何,最好编写您的代码,以便它可以优雅地处理错误并重试。通常,您可以将 SQL 查询包装在 a 中try..catch
,以便在发生此错误时捕获它并重试。
- 4 回答
- 0 关注
- 202 浏览
添加回答
举报