前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >OperationalError: (2006, 'MySQL server has gone away')

OperationalError: (2006, 'MySQL server has gone away')

作者头像
周小董
发布于 2019-03-25 02:59:12
发布于 2019-03-25 02:59:12
2.5K00
代码可运行
举报
文章被收录于专栏:python前行者python前行者
运行总次数:0
代码可运行

在使用 Python + MySQLdb 部署项目的时候,执行计划任务报错

OperationalError (2006, ‘MySQL server has gone away’)

解决办法1: 原因是由于长时间的执行批量的MYSQL语句造成,修改/etc/my.cnf 在[mysqld]段落加入wait_timeout=90000 示例文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  [mysqld]
  datadir=/var/lib/mysql
  socket=/var/lib/mysql/mysql.sock
  # Default to using old password format for compatibility with mysql 3.x
  # clients (those using the mysqlclient10 compatibility package).
  old_passwords=1
  # 修正 OperationalError: (2006, 'MySQL server has gone away') 错误
  wait_timeout=100000

其他省略… 然后 重启mysql服务,再次访问问题页面,没有再出现如上问题,问题得到暂时解决

解决办法2: 修改数据库连接代码 使用mysql ping来检查连接,实现超时自动重新连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  #/usr/bin/env python
  import MySQLdb
  con=MySQLdb.Connect( host="foobar.com",
                       port=3306,
                       user="loginname",
                       passwd="loginpassword",
                       db="foobar")
  con.ping(True)
  cur=con.cursor()

推荐使用第2种解决方法,从代码彻底解决!


原因

连接超时

我出现问题就是这个原因. 进入mysql,执行下面的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show global variables like '%timeout';

+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 28800    |
+----------------------------+----------+

wait_timeout 是28800秒,即mysql链接在无操作28800秒后被自动关闭

解决方法

立即生效

执行下面的sql命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> set global wait_timeout=60*60*30;

该命令是将wait_timeout设置为30小时. 用这种方法,修改完立即生效. 如果重启mysql, 又恢复原来的28800秒.

永久生效

该方法修改完之后, 需要重启mysql才能生效. 编辑mysql配置文件my.cnf,添加或修改为下面这条命令. (我的mysql配置文件路径: /etc/mysql/my.cnf )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wait_timeout = 108000

其他原因

还有一些其他原因, 简单描述一下 1: mysql服务关闭 2: 数据包 过大 解决方法: 修改 max_allowed_packet 的值, 方法同上.

参考:http://blog.51cto.com/luruoyu/788315 https://blog.csdn.net/win_turn/article/details/78196789?utm_source=copy

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年10月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验