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

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

作者头像
周小董
发布2019-03-25 10:59:12
2.4K0
发布2019-03-25 10:59:12
举报
文章被收录于专栏:python前行者python前行者

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

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

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

代码语言:javascript
复制
  [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
复制
  #/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
复制
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
复制
mysql> set global wait_timeout=60*60*30;

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

永久生效

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

代码语言:javascript
复制
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 条评论
热度
最新
推荐阅读
目录
  • 原因
    • 连接超时
    • 解决方法
      • 立即生效
        • 永久生效
        • 其他原因
        相关产品与服务
        云数据库 SQL Server
        腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档