MySQL存盘阻塞“Lost connection to MySQL server during query”

  公测以来的两次全服维护,都遇到了个别服务器停服时间异常长的情况,具体表现为停服流程阻塞在MySQL存盘,待存储数据一直不减少,持续大概一个小时到两个小时之后继续存储,成功停服,并SQLError报错“Lost connection to MySQL server during query”。

  这两天同事查询一些资料大致弄清了问题原因,我们服务器停服瞬间会像MySQL发送大量数据进行存储,数据量过大触发了MySQL的net_read_timeout超时,MySQL报错断开连接,而服务器这边无法直接恢复,只能等待网络连接超时断开之后重连成功了继续存储,最终存储完成停服。

  两个修改方案,一个是按照官网建议增大net_read_timeout超时时间,另一个是缩短odbc.ini的Readtimeout和Writetimeout超时时间。前者的意义在于阀值提高不要触发MySQL的报错断开连接,后者的意义在于报错断开连接之后能尽快恢复重连继续存储。前者需要重启MySQL,维护时存在风险,我们决定先采用第二种方案。

以下为同事记录的总结文档:

一 问题描述

11月4日服务器停服维护,2023服务器存盘阻塞。

11月11日服务器停服维护,2028,2096,10018服务器存盘阻塞。

具体数据如下:


服务器id


报错时间


报错时DBServiceExec慢心跳最长时间


2028


2014-11-11_08:28:01


6013009ms (100min)


2096


2014-11-11_07:06:09


6000006ms(100min)


10018


2014-11-11_08:42:32


6601007ms(110min)


2023


2014-11-04_05:59:47


2950005ms(49min)

以上服务器异常表现类似,DBserviceExec慢心跳时间超长,出现下面错误日志后,存储恢复正常,服务器正常停服。

[unixODBC][MySQL][ODBC 3.51 Driver][mysqld-5.5.20-rel24.1-log]Lost connection to MySQL server during query

根据官网资料,这个问题一般出现在进行存储大量数据时,停服存盘符合这个情况。

详细内容见标红部分。

B.5.2.3 Lost connection to MySQL server

There are three likely causes for this error message.

Usually it indicates network connectivity trouble and you should check the condition of your network if this error occurs frequently. If the error message includes “during query,” this is probably the case you are experiencing.

Sometimes the “during query” form happens when millions of rows are being sent as part of one or more queries. If you know that this is happening, you should try increasing net_read_timeout from its default of 30 seconds to 60 seconds or longer, sufficient for the data transfer to complete.

More rarely, it can happen when the client is attempting the initial connection to the server. In this case, if yourconnect_timeout value is set to only a few seconds, you may be able to resolve the problem by increasing it to ten seconds, perhaps more if you have a very long distance or slow connection. You can determine whether you are experiencing this more uncommon cause by using SHOW GLOBAL STATUS LIKE ‘Aborted_connects‘. It will increase by one for each initial connection attempt that the server aborts. You may see “reading authorization packet” as part of the error message; if so, that also suggests that this is the solution that you need.

If the cause is none of those just described, you may be experiencing a problem with BLOB values that are larger than max_allowed_packet, which can cause this error with some clients. Sometime you may see anER_NET_PACKET_TOO_LARGE error, and that confirms that you need to increase max_allowed_packet.

二 解决方法

1 官网给出修改net_read_timeout 配置项。此修改需要重启Mysql。

2 错误日志是Mysql的Client端在Server端无响应超时后报出,可以通过修改Client端的超时配置项,减少响应等待时间。此修改需要修改odbc.ini配置文件。

Readtimeout=N,N单位为秒,实际等待时间为3*N 秒。

  Writetimeout=N,N单位为秒,实际等待时间为net_retry_count* N秒,Mysql默认配置net_retry_count为10,TCP/IP默认超时时间为10min,所以,可以看出最大超时时间为100min。和停服异常阻塞时间基本吻合。

根据11月10日2000服日志,总结向数据库写入和读取数据时的时间,建议配置项数值如下:

Readtimeout = 300,单位为秒,实际等待时间为900 秒,因每次连接处理为毫秒级,所以主要作用是减少等待超时时间。

Writetimeout = 180,单位为秒,实际等待时间为1800秒,因每次连接处理为毫秒级,所以主要作用是减少等待超时时间。

两个配置项具体信息见下表:


readtimeout


The timeout in seconds for attempts to read from the server. Each attempt uses this timeout value and there are retries if necessary,

so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected

earlier than the TCP/IP Close_Wait_Timeout value of 10 minutes. This option works only for TCP/IP connections, and only for Windows prior

to MySQL 5.1.12. Corresponds to the MYSQL_OPT_READ_TIMEOUToption of the MySQL Client Library. Added in 3.51.27.


writetimeout


The timeout in seconds for attempts to write to the server. Each attempt uses this timeout value and there are net_retry_countretries

if necessary, so the total effective timeout value isnet_retry_count times the option value. This option works only for TCP/IP

connections, and only for Windows prior to MySQL 5.1.12. Corresponds to the MYSQL_OPT_WRITE_TIMEOUT option of the MySQL Client Library.

Added in 3.51.27.

修改readtimeout 和 writetimeout主要是配置socket读写超时,配置项原理如下:

+void vio_timeout(Vio *vio, timeout_type which, uint milliseconds)

{

#ifdef __WIN__

-  ulong wait_timeout= (ulong) timeout * 1000;

-  (void) setsockopt(vio->sd, SOL_SOCKET,

- which ? SO_SNDTIMEO : SO_RCVTIMEO, (char*) &wait_timeout,

-        sizeof(wait_timeout));

+  ulong wait_timeout;

+#else

+  struct timeval tv;

+#endif /* __WIN__ */

+  int optname;

+  switch (which)

+  {

+    case VIO_READ_TIMEOUT:

+      optname = SO_RCVTIMEO;

+      break;

+    case VIO_WRITE_TIMEOUT:

+      optname = SO_SNDTIMEO;

+      break;

+    default:

+      return;

+  }

+#ifdef __WIN__

+  wait_timeout= (ulong) milliseconds;

+  setsockopt(vio->sd, SOL_SOCKET, optname, (char*) &wait_timeout,

+      sizeof(wait_timeout));

+#else

+  tv.tv_sec = milliseconds / 1000;

+  tv.tv_usec = milliseconds % 1000 * 1000;

+  setsockopt(vio->sd, SOL_SOCKET, optname, &tv, sizeof(tv));

#endif /* __WIN__ */

}

 

时间: 2024-12-26 11:04:16

MySQL存盘阻塞“Lost connection to MySQL server during query”的相关文章

虚拟机中MySQL连接问题:Lost connection to MySQL server at 'reading initial communication packet, system error: 0 以及 host is not allowed to connect mysql

环境:在VirtualBox中安装了Ubuntu虚拟机,网络使用了NAT模式,开启了端口转发. 局域网内其他计算机访问虚拟机中的MySQL Server出现两个问题: Lost connection to MySQL server at 'reading initial communication packet, system error: 0 以及 host is not allowed to connect mysql 1.解决Lost connection to MySQL server

Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'

在远程连接mysql的时候,连接不上,出现如下报错:Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0截图如下: 原因分析:mysql开启了DNS的反向解析功能,这样mysql对连接的客户端会进行DNS主机名查找.mysql处理客户端解析过程:1)当mysql的client连过来的时候,服务器会主动去查client的域名.2)首先查找 /etc/hosts 文

使用navicat连接mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'

使用navicat时,报错截图如下: 原因分析: mysql开启了DNS的反向解析功能,这样mysql对连接的客户端会进行DNS主机名查找. mysql处理客户端解析过程: 当mysql的client连过来的时候,服务器会主动去查client的域名. 首先查找 /etc/hosts 文件,搜索域名和IP的对应关系. 如果hosts文件没有,则查找DNS设置,进行DNS反向解析,直到timeout连接失败. mysql的DNS反向解析: mysql接收到连接请求后,获得的是客户端的ip,为了更好的

mysql链接错误:Lost connection to MySQL server at 'reading authorization packet', system error: 0

在远程连接mysql的时候,连接不上,出现如下报错:Lost connection to MySQL server at 'reading authorization packet', system error: 0原因分析:mysql开启了DNS的反向解析功能,这样mysql对连接的客户端会进行DNS主机名查找.mysql处理客户端解析过程:1)当mysql的client连过来的时候,服务器会主动去查client的域名.2)首先查找 /etc/hosts 文件,搜索域名和IP的对应关系.3)如

mysql连接报错 Lost connection to MySQL server at 'sending authentication information', system error: 32

如果mysql连接报错Lost connection to MySQL server at 'sending authentication information', system error: 32 一种可能的原因是系统打开文件数过多 mac系统默认是256个,如果数据库打开文件过多,会因为系统限制而报错. 解决方案有两种: 1. 修改mysql配置,默认是一个表一个文件,可以修改为一个库一个文件 修改mysql配置文件/etc/my.cnf,添加如下配置,删除原来的数据库重新生成,记得提前d

MySQL中查询时"Lost connection to MySQL server during query"报错的解决方案

一.问题描述: mysql数据库查询时,遇到下面的报错信息: 二.原因分析: dw_user 表数据量比较大,直接查询速度慢,容易"卡死",导致数据库自动连接超时.... 三.解决办法: 方案1.在mysql配置文件[myslqd]下面添加一行设置skip-name-resolve.需要重启mysql服务. 方案2.在hosts文件内添加: ip与主机名的映射关系[这种方式不用重启] 如: 在hosts文件中添加: 127.0.0.1 localhost 其他网上的方法: 1. 代码层

MySQL导入数据提示Lost connection to MySQL server

数据库版本为Mariadb 5.5,使用K8S进行管理mysql -uroot -p xxxx < xxxxx.sql在本地提示ERROR 2013 (HY000) at line 1320: Lost connection to MySQL server during query 这个是因为mysql的max_allow_packet默认的只有16MB,我们在mysql的配置文件中添加一行max_allowed_packet=100M 或者修改pod下的args参数args: ["--c

Lost connection to MySQL server at &#39;reading authorization packet&#39; 处理解决办法

Mysql Version : 5.1.73 Os Version : Centos 5.9 问题叙述: 今天一个php程序从客户端连接Mysql被监测到在偶尔的连接过程中报错,信息如下: Lost connection to MySQL server at 'reading authorization packet',看到这个错误提示,第一想到是客户端连接不上,服务端本地是否能连接.经验证,服务端本地是可以连接的,这就松了口气,一方面有很多任务是跑在Mysql服务端的,如果本地无法连接,会造成

使用cmd命令登录mysql数据库时报2013-Lost connection to MYSQL server at &#39;waiting for initial communication packet&#39;,system error:0

[错误内容]:SQL Error (2013): Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0 [错产生经过]:链接MySQL时出现. [解决办法]:打开my.ini,找到[mysqld]项,在其后加入一句:skip-name-resolve,保存,重启mysql服务即可~ 以上就是解决MySQL Error (2013): Lost connectio