“MySQL server has gone away” error – 解决方案

MySQL server has gone away 错误信息意味着MySQL服务器(mysqld)超时并关闭了连接。 默认情况下,如果没有任何反应,MySQL 将在八小时(28800 秒)后关闭连接。 但是,在某些情况下,您的 Web 主机、DBA 或应用程序开发人员可能会减少此超时设置,如下所述。

MySQL server has gone away,解决这个错误可能会令人沮丧。 部分原因是,为了解决此错误,有时解决方案涉及多个层级原因、应用程序或服务配置更改。 本文包含我见过的针对此 MySQL 服务器一般错误的解决方案。 如果您发现此页面上未列出或链接的解决方案,请给我留言或发表评论。

1. MySQL server has gone away 日志示例

请记住,可以通过多种方式记录此错误,如下所列。 此外,有时,错误仅表明更深层次的潜在问题。 这意味着该错误可能是由于连接应用程序或远程服务中的问题或错误造成的。 在这种情况下,您需要检查具有相同时间戳的所有相关错误日志,以确定是否是另一个问题造成的。 应用程序性能监控解决方案和 PHP 堆栈跟踪工具可以提供帮助。 考虑到这一点,以下是 MySQL server has gone away error 的错误日志示例:

General error: 2006 MySQL server has gone away

Error Code: 2013. Lost connection to MySQL server during query

Warning: Error while sending QUERY packet

PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

2. MySQL wait_timeout

MySQL服务器出现错误的原因通常是因为超出了MySQL的wait_timeout。 MySQL wait_timeout 是服务器在关闭非交互式连接之前等待该连接上的活动的秒数。 您应该确保 wait_timeout 没有设置得太低。 MySQL wait_timeout 的默认值为 28800 秒。 通常,它会被任意降低。 也就是说,在不影响数据库连接的情况下将 wait_timeout 设置得越低,可能是 MySQL 数据库效率的良好标志。 另外,检查变量:net_read_timeout、net_write_timeout 和 Interactive_timeout。 在 my.cnf 中调整或添加以下行以满足您的要求:

wait_timeout=90
net_read_timeout=90
net_write_timeout=90
interactive_timeout=300
connect_timeout=90

3. PHP 配置中的 MySQL 连接超时

查看您的 php.ini 配置文件。 您将找到 MySQL 配置选项。 确保 mysql.connect_timeout 设置不低于上面讨论的 MySQL wait_timeout。 PHP 选项 mysql.connect_timeout 不仅用于连接超时。 也是在等待 MySQL 服务器的第一个响应时。 尝试增加 mysql.connect_timeout 以匹配或超过 MySQL wait_timeout 并确保 mysql.allow_persistent 已打开(默认 = 已启用)。

mysql.connect_timeout=90
mysql.allow_persistent=1

重要提示:首先阅读 PHP 持久数据库连接,了解其优点和注意事项。

另外,调整 PHP 的 default_socket_timeout。 例如,PHP 脚本可能运行缓慢的查询。 创建利用default_socket_timeout 的等待。 最终,它因“MySQL server has gone away”错误而退出。 在发送仇恨邮件之前,请先阅读此处。 这是摘录:

“默认情况下,PHP 将流的读取超时设置为 60 秒。 这是通过 php.ini、default_socket_timeout 设置的。 此默认值适用于未设置其他超时值的所有流。 mysqlnd 没有设置任何其他值,因此长时间运行的查询的连接可以在 default_socket_timeout 秒后断开,从而导致错误消息 2006 – MySQL server has gone away”

default_socket_timeout=90

为了彻底,如有必要,还可以调整 php.ini 中的 max_execution_time 和 max_input_time 。 如果 PHP 的执行时间长于 max_execution_time,那么 MySQL 服务器可能会断开连接。

max_execution_time = 90
max_input_time = 90

4. MySQL max_allowed_packet

max_allowed_packet 是一个数据包的最大大小。 默认大小 4MB 有助于 MySQL 服务器捕获大的(可能是不正确的)数据包。 从 MySQL 8 开始,默认值已增加到 16MB。 如果 mysqld 收到太大的数据包,它会认为出现问题并关闭连接。 要解决此问题,您应该增加 my.cnf 中的 max_allowed_packet,然后重新启动 MySQL。 此设置的最大值为 1GB。 例如:

max_allowed_packet = 512M

5. MySQL innodb_log_file_size

您可能需要增加 my.cnf 配置中的 innodb_log_file_size MySQL 变量。 MySQL的innodb_log_file_size应该是innodb_buffer_pool_size的25%(如果可能的话,不少于20%)。 请记住,该值越大,从数据库崩溃中恢复所需的时间就越长。 (来源:Phpmyadmin 顾问)

这意味着,例如,如果您的缓冲池大小设置为 innodb_buffer_pool_size=16G 并且您的 innodb_log_files_in_group 设置仍设置为建议的默认值 2 个文件 (innodb_log_files_in_group=2),那么您的 innodb_log_files_size 应设置为 2G。 这将创建两 (2) 个日志文件,每个文件大小为 2GB,相当于 innodb_buffer_pool_size=16G 的 25%。

警告:您必须停止 MySQL 服务器才能更改 innodb_log_file_size 或 innodb_log_files_in_group。 如果你不这样做,你就会面临灾难的风险! (阅读:MySQL 日志重做说明。)

6. 其他原因导致MySQL server has gone away

远程 MySQL 连接

请记住,我之前提到过,错误有时仅表明存在更深层次的潜在问题。 例如,与第三方服务的远程 MySQL 连接。 使用 osCommerce、Magento 等的第 3 方支付处理插件。

MySQL数据库字符集和排序规则

将默认数据库字符集更改为 latin1 并将默认排序规则更改为 latin1_general_ci 似乎已经解决了 MySQL 服务器已消失的问题。

超出 MySQL max_connections 设置

Max_connections 设置允许的同时客户端连接的最大数量。 这个设置要小心!! 当设置太大时,可能会出现内存和其他资源耗尽的情况,并且调度开销也会增加。 作为指导,将 max_connections 设置为大约之前最大同时客户端连接数的两倍。 例如,如果正常运行一个月后,最大并发客户端连接数为 114,则设置为 max_connections=250。 在你对这个设置疯狂之前,请阅读:MySQL 如何处理客户端连接。

仍未解决? 请参阅 MySQL 的帮助页面。

Oracle 为 MySQL 服务器已消失错误整理了一个很好的自助页面。 在该页面上,他们还建议您确保 MySQL 在查询期间没有停止/重新启动。 摘抄:

“您可以通过执行mysqladmin版本并检查服务器的正常运行时间来检查MySQL服务器是否死机并重新启动。 如果客户端连接因 mysqld 崩溃并重新启动而中断,那么您应该集中精力查找崩溃的原因。”

文章评论

0条评论