[django1.6]跑批任务错误(2006, 'MySQL server has gone away')

有个django的定时任务,调用django的orm来对数据库进行数据处理。

在交互环境下直接启动pyhton脚本没有问题,放在定时任务中时候,总是出现

(2006, ‘MySQL server has gone away‘)

的错误,开始以为是定时框架外部调用的问题,但是后来想想也不合理,为啥直接在shell中调用就没错呢,

想到django1.6的一些数据库连接的新属性(例如持久化连接等)会不会有影响,于是google了下。

看到django官网上有人提过这个类似于bug的东西:

https://code.djangoproject.com/ticket/21597

如果单纯的查询这个数据库错误,很多都是让你修改mysql的配置,看下这里最终给的建议把。

If you hit this problem and don‘t want to understand what‘s going on, don‘t reopen this ticket, just do this:

  • RECOMMENDED SOLUTION: close the connection with from django.db import connection;
    connection.close()
     when you know that your program is going to be idle for a long time.
  • CRAPPY SOLUTION: increase wait_timeout so it‘s longer than the maximum idle time of your program.

In this context, idle time is the time between two successive database queries.

这个方案就说把django到mysql的数据库连接关闭了,然后重新建立一个来查询,如果想了解下为什么,可以重头看下这讨论。

from django.db import connection
...
def is_connection_usable():
    try:
        connection.connection.ping()
    except:
        return False
    else:
        return True
...

def do_work():
    while(True): # Endless loop that keeps the worker going (simplified)
        if not is_connection_usable():
            connection.close()
        try:
            do_a_bit_of_work()
        except:
            logger.exception("Something bad happened, trying again")
            sleep(1)

简单的理解,就是django1.6 会自动保持连接, 因为我这个任务时24小时执行一次, 第一执行的时候django和mysql建立的一个链接A, 结果这个任务10分钟就完成了,连接A开始睡眠,django继续保持这连接。

23小时50分钟以后,这个任务又开始执行了,但是由于msyql的waittime默认是8个小时,连接A这个时候已经死了(msyql单方面解除合同,django还蒙在鼓里),django还用连接A去连接mysql,肯定得到一个gone away的结果。

所有我们在每次执行任务之前去检查连接是否存活,如果没了那么就close,django自动重新建立一个,这样就消除了上面的错误。

本文出自 “orangleliu笔记本”博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/41480417

作者orangleliu 采用署名-非商业性使用-相同方式共享协议

[django1.6]跑批任务错误(2006, 'MySQL server has gone away')

时间: 2024-08-30 02:00:38

[django1.6]跑批任务错误(2006, 'MySQL server has gone away')的相关文章

Zabbix错误提示MySQL server has gone away解决

Zabbix错误提示MySQL server has gone away解决 相信细心的同学在使用Zabbix的过程中,会遇到[Z3005] query failed: [2006] MySQL server has gone away 这个错误提示,虽然出现错误提示,但实际并不会影响Zabbix Server的正常使用.那么,这个问题能不能解决呢?本文将带你彻底解决此问题的出现. 欢迎关注OneOaaS 微信公众号,获得更多Zabbix相关知识和运维知识. 1 错误现象 22773:20160

#2006 - MySQL server has gone away

#2006 - MySQL server has gone away 对于web应用来说,经常会用到mysql,而数据的备份与还原是web应用经常做的事,一般来说,用客户端工具phpmyadmin,sqlyog 等,来备份数据库没有任何问题,还原时经常碰到mysql提示的#2006错误. Error: 2006 (CR_SERVER_GONE_ERROR) Message: MySQL server has gone away 原因可能是sql语句过长,超过mysql通信缓存区最大长度: 调整m

(2006, ‘MySQL server has gone away‘)

django 中,导入excel到mysql中.excel 转成sql,然后导入mysql. sql过大,出现(2006, 'MySQL server has gone away')错误. 改mysql 配置my.cnf,[mysqld]中的 max_allowed_packet = 64M ait_timeout = 86400 解决.

[Err] 2006 - MySQL server has gone away

1.错误描述 [Err] 2006 - MySQL server has gone away 2.错误原因 在将数据库脚本利用MySQL客户端导入时,出现这个错误:结果查明,由于脚本中的insert语句过多,插入数据量过大,导致MySQL客户端和服务器连接断开 3.解决办法 (1)修改MySQL配置文件my.ini 设置max_allowed_packed参数 (2)查看MySQL连接是否超时 (3)查看服务是否中断 版权声明:本文为博主原创文章,未经博主允许不得转载.

MySQL导入sql脚本错误:2006 - MySQL server has gone away

下面我给各位同学介绍在mysql中导入数据库时提示MySQL server has gone away问题的解决方法,如果你碰到mysql提示MySQL server has gone away错误我们可进入参考. 到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24Line no.:85Error Code: 2006 - MySQL server has gone away 最终找到原因,原来是My

ThinkPHP出现General error: 2006 MySQL server has gone away的解决方法

错误: #13 {main}SQLSTATE[HY000]: General error: 2006 MySQL server has gone awayFILE: \ThinkPHP\Library\Think\Db\Driver.class.php(169) 原因分析: 本次错误提示是在cli模式运行,隔一段时间就会出现,查询资料后发现mysql默认没隔8个小时(2880000秒)就会断开 解决方案,解决方式找了三个 方法1 配置mysql.cnf(windows系统则是my.ini),指定

SQLyog恢复数据库报错解决方法【Error Code: 2006 - MySQL server has gone away】

https://blog.csdn.net/niqinwen/article/details/8693044 导入数据库的时候 SQLyog 报错了 Error Code: 2006 – MySQL server has gone away 搜了下,说是max_allowed_packet (MySQL的一个参数)设置的值不够大. 那我改下就行了 嘿嘿 In Windows: In the MySQL server installation directory,in my.ini file, a

Yii2 解决2006 MySQL server has gone away问题

Yii2 解决2006 MySQL server has gone away问题 Yii2版本 2.0.15.1 php后台任务经常包含多段sql,如果php脚本执行时间较长,或者sql执行时间较长,经常会碰到mysql断连,报2006 MySQL server has gone away错误.通常,mysql断连了,重连数据库就好了,但是在哪里执行重连呢?这是一个值得思考的问题. 手动重连 最直接的解决办法,是在执行较长sql,或者脚本执行合适的时机,手动重连 \Yii::$app->db->

mysql error: (2006, 'MySQL server has gone away')

max_allowed_packet=16M wait_timeout=400000 interactive_timeout = 400000 vim /etc/my.cnf  mysqld 中加入上面的内容. mysql error: (2006, 'MySQL server has gone away')