我的Laravel5.7网站经历了一些问题,我认为这些问题是相互关联的(但发生在不同的时间):
PDO::prepare(): MySQL server has gone awayE_WARNING: Error while sending STMT_PREPARE packet. PID=10PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry (我的数据库似乎经常尝试在同一秒钟内写两次相同的记录。我一直无法弄清楚为什么或如何复制它;它似乎与用户行为无关。)几个月来,我一直看到这样可怕的日志消息,我完全无法复制这些错误(并且无法诊断和解决它们)。
我还没有发现任何实际的症状,也没有从用户那里听到任何抱怨,但是错误信息似乎并不微不足道,所以我真的很想了解和解决问题的根源。
我尝试过将我的MySQL配置更改为使用max_allowed_packet=300M (而不是400万的默认设置 ),但是当我有超过几个访问者访问我的站点的时候,仍然经常会遇到这些异常。
我还设置了(从5M到10M),因为这个建议
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size = 218M作为进一步的背景:
artisan queue:work --sleep=3 --tries=3 --daemon)的队列工作者。mysqlslap查询(不过,我完全是新手),甚至在模拟数百个并发客户端时,我也没有发现任何慢的地方。SHOW VARIABLES;和SHOW GLOBAL STATUS; 在这里的结果。我的my.cnf是:
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size = 218M
max_allowed_packet=300M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow_query_log.log
long_query_time = 10
log_queries_not_using_indexes = 0对于我应该探索什么来诊断和解决这些问题有什么想法吗?谢谢。
发布于 2019-04-02 08:05:21
我在一个长期运行的PHP脚本上遇到了同样的情况(它在Redis列表上侦听;每个动作都是快速的,但脚本基本上永远运行)。
我在开始时创建PDO对象和一个准备好的语句,然后再使用它们。
在我开始脚本的第二天,我得到了完全相同的错误:
PHP Warning: Error while sending STMT_EXECUTE packet. PID=9438 in /...redacted.../myscript.php on line 39
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away在我的例子中,它是一个开发服务器,没有负载,MySQL在同一个盒子上.因此,这不太可能来自外部因素。这很可能与我使用同一个MySQL连接太久而超时有关。而且PDO也不麻烦,因此任何后续查询都将返回"MySQL服务器已经消失“。
在wait_timeout中检查“MySQL”的值:
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.06 sec)
mysql> show local variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)我看到28800秒=8小时,这似乎与我的错误时间一致。
在我的例子中,重新启动MySQL服务器,或者将wait_timeout设置得很低,同时保持相同的PHP运行,使得重现问题变得非常容易。
总体而言:
回到你的案子
https://stackoverflow.com/questions/53469793
复制相似问题