【问题标题】:work-around for (2006, 'MySQL server has gone away')?(2006, 'MySQL server has gone away') 的解决方法?
【发布时间】:2015-12-02 22:07:21
【问题描述】:

这个问题是我的确切问题

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

对这个原本未解决的问题的明显解决方法是增加wait_timeout 以执行

背景

我有一个 celery 任务,每天在特定时间运行一次。最初它工作正常,但从上周开始我开始得到:

Exception_ocoured_: (2013, 'Lost connection to MySQL server during during 查询')

这个 celery 任务只是从 db 中获取一些详细信息,最多 4000 行并将邮件发送给最终用户。

问题:

有什么方法可以增加这个超时时间只针对在 django 环境中面临这个问题的特定 celery 任务,因为我不想干扰本机设置?

我正在寻找一个 djangoish 解决方案,其生命周期仅与此 celery 任务执行的时间一样长。

例如:

@task
def doSomething():
    try:
       set_timeout_for_mysql = 20000 # <== main agenda for this question
       # OR
       ping_resp = somehow_test_mysql_con()
       while(ping_resp == False):
          keep trying to connect or create new connection
       # do_operations 
    except Exception, e:
       # log exception

规格:

In [18]: django.VERSION
Out[18]: (1, 7, 7, 'final', 0)

django-celery==3.0.21

PS: 如果有人在不影响核心设置的情况下解决了这个问题,任何其他解决方法都可以解决!!!

【问题讨论】:

    标签: mysql django exception


    【解决方案1】:
    from django.db import close_old_connections
    
    ...
    close_old_connections()
    ...  # do some db jobs, it will reconnect db
    

    祝你好运

    【讨论】:

    • 是的……我知道晚了!! :)
    【解决方案2】:

    您可以为每个会话(连接)设置wait_timeout

    set wait_timeout=10000;
    SHOW VARIABLES LIKE 'wait_timeout';
    

    但是,您确定错误来自wait_timeout。另一个解决方案是 max_allowed_pa​​cket。你可以增加它,看看是不是这个问题。

    【讨论】:

    • max_allowed_packet 和这个set wait_timeout,不确定我是否可以在我的芹菜def 中直接提及这个,还是需要单独的实现?
    猜你喜欢
    • 2013-12-16
    • 2011-12-11
    • 2011-02-04
    • 2016-01-19
    • 2020-06-15
    • 2020-05-28
    • 2012-12-19
    • 2012-10-30
    相关资源
    最近更新 更多