文章目录

  • 一、前言
  • 二、了解wait_timeout 和interactive_timeout 两个参数
    • 1、命令行操作
    • 2、wait_time 设置失效问题
    • 3、参考手册概念,解释两个参数
    • 4、那么什么算是交互式,什么算是非交互式呢
  • 三、python重现 mysql server has gone away
    • 1、通过代码测试两个参数影响
      • (1)当两个参数都设置为10s的时候:
      • (2)当wait_timeout =10,而interactive_timeout =1000
      • (3)当interactive_timeout =10,而wait_timeout =1000
      • (4)设置两个参数都为10s,程序sleep(15)看看效果
    • 2、不设置重连,直接执行相应的sql看看
    • 3、总结
  • 四、捕获mysql错误并重新连接的完整代码

一、前言

本篇主要是通过python程序连接数据库的错误,从而引出mysqlwait_timeout 参数和interactive_timeout的概念,继而重现程序错误,从根源上解决问题。

需求:
       python脚本监听文件,当文件行数增加10行则执行一次数据库持久化操作。只是文件有时候可能需要几十分钟才增加10行,此时操作数据库会出现:MySQL server has gone away 的错误,并且脚本被停止。

根据以上错误,首先是要重现MySQL server has gone away的情况,看看是哪个参数造成的,又该通过哪种方式来捕获这种错误。大家随便一百度就能知道影响数据库连接时间的参数一般是wait_timeoutinteractive_timeout 两个参数,下面就着重重现一下错误,并总结下遇到的问题

关于python如何捕获mysql的各种错误,可以参考我的上篇文章:python怎么捕获mysql报错

二、了解wait_timeout 和interactive_timeout 两个参数

为了重现错误,我们设置两个参数都为10s,即10s后数据库就自动断开连接了,先通过命令行测试下看看。

1、命令行操作

不管是设置wait_timeout 还是设置 interactive_timeout = 10,执行sql命令行都会报错:

错误1 :

ERROR 2013 (HY000): Lost connection to MySQL server during query

重新执行sql,则会重新连接,此时的错误才是我们想要的 gone away

错误2 :

mysql> show variables like '%timeout%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    27
Current database: *** NONE ***

本来想着会直接报:MySQL server has gone away 的错误,没想到先报的是数据库失去连接错误,博主怀疑这两个参数是否会影响两种错误的产生。

2、wait_time 设置失效问题

这个刚开始还挺奇怪的,明明设置的wait_time =10interactive_timeout =1000,但是实际查看的时候,总是发现wait_time =1000 了,真是奇了怪了,为何这个参数会自己改变呢?

修改wait_timeout不生效的问题:

https://www.cnblogs.com/azhqiang/p/5454000.html

通过这个链接可以发现,实际上wait_timeout是受interactive_timeout 影响,只是为什么会出现这种情况呢?

3、参考手册概念,解释两个参数

interactive_timeout:

The number of seconds the server waits for activity on an interactive connection before closing it. An interactive client is defined as a client that uses the CLIENT_INTERACTIVE option to mysql_real_connect()

wait_timeout:

The number of seconds the server waits for activity on a noninteractive connection before closing it. On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value,depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect())

他们都是session/global级别的,简单的说前者用于描述交互式的客户端的空闲超时,后者用于非交互式的客户端的空闲超时,但是这里也揭示了,如果是交互式客户端连接的session那么wait_timeout将被interactive_timeout覆盖掉,换句话说如果是非交互式的客户端连接的session将不会使用interactive_timeout覆盖掉wait_timeout,也就是interactive_timeout没有任何作用了。一旦会话登陆成功,如果想要会话级别修改超时参数,不管交互式还是非交互式都是修改wait_timeout参数才会生效。

参考:

http://blog.itpub.net/7728585/viewspace-2637237/

这篇文章解析的相当清楚,例子也很生动,总结来说就是:

如果是交互式客户端连接的session那么wait_timeout将被interactive_timeout覆盖掉,换句话说如果是非交互式的客户端连接的session将不会使用interactive_timeout覆盖掉wait_timeout,也就是interactive_timeout没有任何作用了。

4、那么什么算是交互式,什么算是非交互式呢

交互式操作:
       通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议。(小黑框方式)

非交互式操作:
       就是你在你的项目中进行程序调用。比如一边是tomcat web服务器,一边是数据库服务器,两者怎么通信?在java web里,我们通常会选择hibernate或者是jdbc来连接。那么这时候就是非交互式操作。 (代码连接方式)

根据上面所述的,之前命令行测试属于交互式操作,那咱们程序连接的应该就是非交互式连接,如果想要程序重现这个问题,那么需要设置非交互式的wait_time的值

三、python重现 mysql server has gone away

到底哪个参数会造成错误1,哪些参数会造成 错误2呢。在命令行测试的时候,发现总是先出现错误1,再出现错误2,那么这两个错误是否是分开受到两个参数的影响呢?如何重现出来我们想要的: mysql server has gone away 错误。

通过代码测试,不继续在命令行测试了。代码为非交互式操作。

1、通过代码测试两个参数影响

(1)当两个参数都设置为10s的时候:

 try:conn.ping()except MySQLdb.Error, e:print 'error'# sqlError = "Error %d:%s" % (e.args[0], e.args[1])print e.args[0]print e.args[1]try:conn.ping()except MySQLdb.OperationalError,e:print 'error1'print epass

这段代码打印如下:

error
2013
Lost connection to MySQL server during query
error1
(2006, 'MySQL server has gone away')

经过试验,还是没直接获得MySQL server has gone away的错误,都是先报数据库失去连接,然后再进行重连,此时才报出:MySQL server has gone away

(2)当wait_timeout =10,而interactive_timeout =1000

error
2013
Lost connection to MySQL server during query
2013
error1
(2006, 'MySQL server has gone away')
2222_2

结果和上面一致,并没有单独报MySQL server has gone away的错误。

(3)当interactive_timeout =10,而wait_timeout =1000

没有报错,程序正常执行。当代码连接mysql的时候,相当于是非交互式,那么此时的interactive_timeout 相当于没用了,用的是wait_timeout 的值,所以程序没报错。

(4)设置两个参数都为10s,程序sleep(15)看看效果

import timetime.sleep(15)error
2013
Lost connection to MySQL server during query
2013
error1
(2006, 'MySQL server has gone away')

通过频繁的测试发现,出现错误1错误2似乎并不是这两个参数来操纵的,因为这两个错误总是一起出现的,这就和原来的猜想不一样了。不过仔细想想也是,你想要操作Mysql,肯定是要先检查是否存在子线程的,发现不存在就报个错,重新连接失败再报个错,比较符合逻辑

2、不设置重连,直接执行相应的sql看看

try:cursor.execute(insert_sql)  # 直接执行sqlexcept MySQLdb.Error, e:print 'error'# sqlError = "Error %d:%s" % (e.args[0], e.args[1])print e.args[0]print e.args[1]print e[0]try:cursor.execute(insert_sql)except MySQLdb.OperationalError, e:print 'error1'print epass

打印结果如下:

error
2006
MySQL server has gone away
2006
error1
(2006, 'MySQL server has gone away')

这里发现,在直接执行sql的时候,会直接报MySQL server has gone away的错误。OK,报错已经重现。

3、总结

这个报错并不是interactive_timeoutwait_timeout 这两个参数影响的。估计是,mysql在直接执行sql的时候,会主动去线程池寻找子进程,找不到的时候,先抛出Lost connection to MySQL server during query错误,然后尝试重连的时候抛出MySQL server has gone away错误。

我们上面的代码是一直在尝试重连,所以先抛出错误1,再抛出错误2 。而直接执行sql的时候,错误1错误2给覆盖了,因此打印出来的MySQL server has gone away,实际上错误1 依然存在。

四、捕获mysql错误并重新连接的完整代码

代码如下:

 try:cursor.execute(insert_sql)except MySQLdb.OperationalError:  # 先检测数据库连接的问题,检测无误则执行sqlprint 'connect error1'cursor = MakeDbConnection()   # 重新连接sql,函数里面的是connect()方法
try:cursor.execute(insert_sql)except MySQLdb.ProgrammingError:    # 捕获sql语句执行的错误try:xxxxxxxxxxxxxxx          # 根据各自的需求,重新调整下cursor.execute(insert_sql)       #重新执行sqlexcept:passexcept UnicodeDecodeError:     # 捕获编码错误,如捕获代码不是utf-8的错误pass

如此便可避免数据库丢失连接的错误,捕获到连接失败,则重新连接,然后执行代码即可,妈妈再也不用担心我的脚本会自己停掉了。

end

python重现 mysql server has gone away错误以及解决方案相关推荐

  1. (2006, 'MySQL server has gone away') 错误解决 - dba007的空间 - 51CTO技术博客

    (2006, 'MySQL server has gone away') 错误解决 - dba007的空间 - 51CTO技术博客 (2006, 'MySQL server has gone away ...

  2. mysql gone away 测试_python测试开发django-58.MySQL server has gone away错误的解决办法

    前言 使用django执行sql相关操作的时候,出现一个"MySQL server has gone away"错误,后来查了下是sql执行过程中,导入的文件较大时候,会出现这个异 ...

  3. navicat mysql server has gone away_Navicat中MySQL server has gone away错误怎么办【转载】

    打开navicat的菜单中的tools,选择server monitor,然后在左列选择数据库,右列则点选variable表单项,寻找max_allowed_packet,将其值改大. 改好之后,再次 ...

  4. Navicat远程连接MySQL时报错:2003-Can‘t connect to MySql server on ‘localhost‘(10038)错误

    Navicat远程连接MySQL时,报错: 2003-Can't connect to MySql server on 'localhost'(10038)错误 一般是一下几个原因: 1.MySQL服 ...

  5. cannot mysql server on_轻松解决cant connect to MySQL server on 'xxx'(10038)错误

    轻松解决cant connect to MySQL server on 'xxx'(10038)错误 2017-08-04分类:数据库编辑:阅读(4565) 本地navicate连接部署在linux服 ...

  6. (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案

    (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案 参考文章: (1)(转)python requests 高级用法 -- 包括SSL 证书错误的解决方案 (2)ht ...

  7. MySql数据导入导出及解决ERROR2006(MySQL server has gone away)错误

    mysql数据导入导出方法总结 MySQL数据备份还原方式总结: 一.将数据导入到指定的数据库 第一种导入方式: (linux下和Windows 下语法是一样的,只是路劲的书写方式不同而已) 1.创建 ...

  8. MySQL5.7执行mysqld命令出现Can‘t change dir to ‘C:\Program Files\MySQL\MySQL Server 5.7\data\‘错误

    执行mysqld -P3307 出现如下错误: mysqld: Can't change dir to 'C:\Program Files\MySQL\MySQL Server 5.7\data\' ...

  9. mysql 偶然出现 2003_数据库偶尔出现MySQL server has gone away 错误

    首先感谢以下两边文章的作者,我是参阅了2位作者的文章之后,经过测试加入自己的理解. 说说mysql_connect和mysql_pconnect的区别,这俩函数用法上差不多,网上有说应该用pconne ...

最新文章

  1. Visual Studio 2008 每日提示(十四)
  2. apache 开启 gzip 压缩服务
  3. Android中关于dip和px以及转换的总结
  4. 中标麒麟linux系统安装打印机_中标软件+天津麒麟=中国国产操作系统新旗舰
  5. 前端学习(2214):认识react(1)
  6. Bloom-Filter算法 简介
  7. android中设置lmargin简书,超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用...
  8. 体系结构笔记(1)Fundamentals of Computer Design
  9. Android layout优化
  10. Windows XP终极优化设置(精心整理)
  11. ue4 基于motion vector粒子优化的一些感悟
  12. BCM SIP ALG原理及实现(应用层实现机制)
  13. 计算机安全知识策划书,安全知识竞赛策划书
  14. AutoVue 21.0.1新版本特性:支持在没有Applets的浏览器中运行
  15. js eval Uncaught SyntaxError: unexpected token: ‘:‘
  16. 浙大 计算机 设计学 考研科目,2020浙江大学软件工程考研参考书目
  17. Makefile的常见错误信息
  18. React 使用阿里巴巴矢量图标库管理Icon图标的Icon-antd用法
  19. 搜索战火重燃,夸克升级个人云服务做网盘的逻辑是什么?
  20. 【算法与数据结构】——乘法逆元

热门文章

  1. 通过sftp打开php.ini,PhpStorm中如何使用SFTP功能 详细操作方法
  2. Java-反射简介及例子
  3. xface 远程桌面 无法使用tab键盘
  4. RetinaFace Mxnet转TensorRT
  5. MobileNet 笔记
  6. TensorRT安装及使用教程
  7. MSB3721 命令““C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin\nvcc.exe“ 已退出 返回代码为1
  8. ubi-partman failed with exit code 141
  9. C++使用thread类多线程编程
  10. 矩阵y=wx+b 位置