(2006,Mysql Server has gone away)问题处理

最近遇到了一个奇怪的问题,更换mysql db的连接地址之后,偶尔出现简单的sql查询语句报(2006,Mysql Server has gone away)错误。大概的排查过程记录如下。


原因分析

根据Mysql官网的描述,可能的原因如下:

1.Mysql服务宕机

可通过show status like ‘uptime’;来查询服务器运行时间:
在这里插入图片描述

排除服务器宕机问题。

2.Mysql连接超时

通过show global variables like '%timeout';查看超时参数:
在这里插入图片描述
可以看到,interactive_timeout和wait_timeout参数均为8h,可以排除超时问题。

3.mysql请求连接进程被主动kill

这种情况一般由dba触发,主动kill慢查。通过show global status like 'com_kill';查看:
在这里插入图片描述
排除连接进程被kill问题。

4.Your SQL statement was too large

查询的结果集超过max_allowed_packet限制时也会报错。通过show global variables like 'max_allowed_packet';查看:
在这里插入图片描述
该参数为64m,排除结果集过大问题。

其他原因

排除以上原因后,还有可能的原因有:连接数过多内存不足等。

内存不足

根据stackOverflow上面看到的说法,有可能是内存不足导致的:
在这里插入图片描述
但这个内存指的是程序服务器内存还是db服务器内存呢? 通过free -h查看应用服务器内存:
在这里插入图片描述
可供应用程序使用的内存为105G,完全是足够的。db服务器无法直接登录,也看不到内存使用,但是如果db服务器内存出现性能问题,dba肯定会有反应,因此基本也可以排除。

连接数太多

查看当前打开的连接数量和最大使用的连接数量如下:
在这里插入图片描述
可以看到,当前连接数为1178。最大的连接数为1631,出现的时间也不是最近的时间,可以排除连接数过多的问题。

继续查看其他参数:
在这里插入图片描述

  • threads_connected:创建用来处理连接的线程数
  • threads_running: 激活的处理连接的线程数

其他参数也基本正常。而业务应用场景中,会话session也是用完之后就关闭的,不存在超过8h的连接。至此,找不到问题原因。幸而这种情况只是偶尔出现,不影响服务的可用性。后面找到原因后,再来更新解决方案。


最终原因

后来再次追查原因,发现数据库连接池参数很有问题。用的是python的sqlAlchemy,如下所示:

mysql_engine = create_engine(settings.get('mysql', 'host'),
                             pool_size=settings.getint('mysql', 'pool_size'),
                             max_overflow=10,
                             echo=settings.getboolean('mysql', 'echo'),
                             encoding=settings.get('mysql', 'charset'),
                             pool_recycle=20000
                             )

Session = sessionmaker(bind=mysql_engine)

这里连接池大小为2,最大连接数为10,连接保活时间为20000s,约5.5h。而新的db有连接断开机制,因此会出现连接存在超过8小时,被db主动断开的情况。

将pool_size修改为2,max_overflow改为100,pool_recycle为60,修改后不再报错,问题解决!


附录

mysql数据库常用参数:
show status like '%下面变量%'

  • Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
  • Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。
  • Connections 试图连接MySQL服务器的次数(累计数据,非当前)
  • Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。
  • Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。
  • Delayed_writes 用INSERT DELAYED写入的行数。
  • Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。
  • Flush_commands 执行FLUSH命令的次数。
  • Handler_delete 请求从一张表中删除行的次数。
  • Handler_read_first 请求读入表中第一行的次数。
  • Handler_read_key 请求数字基于键读行。
  • Handler_read_next 请求读入基于一个键的一行的次数。
  • Handler_read_rnd 请求读入基于一个固定位置的一行的次数。
  • Handler_update 请求更新表中一行的次数。
  • Handler_write 请求向表中插入一行的次数。
  • Key_blocks_used 用于关键字缓存的块的数量。
  • Key_read_requests 请求从缓存读入一个键值的次数。
  • Key_reads 从磁盘物理读入一个键值的次数。
  • Key_write_requests 请求将一个关键字块写入缓存次数。
  • Key_writes 将一个键值块物理写入磁盘的次数。
  • Max_used_connections 同时使用的连接的最大数目。
  • Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。
  • Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。
  • Open_tables 打开表的数量。
  • Open_files 打开文件的数量。
  • Open_streams 打开流的数量(主要用于日志记载)
  • Opened_tables 已经打开的表的数量。
  • Questions 发往服务器的查询的数量。
  • Slow_queries 要花超过long_query_time时间的查询数量。
  • Threads_connected 当前打开的连接的数量。
  • Threads_running 不在睡眠的线程数量。
  • Uptime 服务器工作了多少秒

参考资料

[1]. https://stackoverflow.com/questions/7942154/mysql-error-2006-mysql-server-has-gone-away

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当出现"[ERR] 2006 - MySQL server has gone away"错误时,这通常表示与MySQL服务器的连接已中断。这个错误可能有多种原因,下面是可能导致这个错误的一些常见情况: 1. 连接超时:如果在与MySQL服务器的连接期间没有活动,连接可能会超时并被关闭。这可能是由于服务器配置中的超时设置或网络问题导致的。 2. 数据库负载过大:如果MySQL服务器在处理大量请求或执行复杂查询时负载过高,它可能会关闭长时间没有活动的连接。这可以通过增加服务器的处理能力或优化查询来解决。 3. 数据包大小超过限制:如果尝试插入的内容超过了MySQL服务器的最大数据包大小限制(默认为4MB),服务器可能会关闭连接。这可以通过修改服务器的max_allowed_packet参数来解决。 4. 网络问题:如果在客户端和服务器之间存在网络问题,例如连接不稳定或中断,可能会导致连接关闭。 为了解决这个问题,可以考虑以下解决方案: 1. 增加连接超时时间:可以在MySQL服务器的配置文件中增加连接超时时间,确保连接不会在没有活动的情况下被关闭。 2. 优化查询和数据库性能:检查数据库中的查询和表结构,确保它们被正确优化。可以考虑使用索引、分区、缓存等技术来提高数据库性能。 3. 增加max_allowed_packet参数的值:如果需要插入大量的数据,请确保max_allowed_packet参数的值足够大。 4. 检查网络连接:确保网络连接稳定,没有中断或其他问题。 总结起来,当出现"[ERR] 2006 - MySQL server has gone away"错误时,可能是由于连接超时、数据库负载过大、数据包大小超过限制或网络问题导致的。可以通过增加连接超时时间、优化查询和数据库性能、增加max_allowed_packet参数的值以及检查网络连接来解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [(2006Mysql Server has gone away)问题处理](https://blog.csdn.net/xiaoyi52/article/details/107737189)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [pymysql.err.OperationalError: (2006, “MySQL server has gone away (BrokenPipe](https://blog.csdn.net/u010033674/article/details/114916324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值