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

版权声明:如需转载本文章,请保留出处! https://blog.csdn.net/xc_zhou/article/details/83031482

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

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

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

  [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来检查连接,实现超时自动重新连接

  #/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,执行下面的命令:

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命令

mysql> set global wait_timeout=60*60*30;

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

永久生效

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

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

猜你喜欢

转载自blog.csdn.net/xc_zhou/article/details/83031482