Django pleure ‘MySQL server has gone away’


Dans certaines circonstances, par exemple une transaction ouverte pendant trop longtemps, MySQL ferme la connexion avec son client.

Cela arrive par exemple quand on l’utilise comme broker pour celery. On a des tâches qui plantent, et quand on met du debug, on lit un (2006, 'MySQL server has gone away') bien cryptique.

Généralement je recommande de changer de backend ici. Passer à redis pour cet usage par exemple.

Mais parfois on ne peut pas. La solution est alors de forcer Django à réinitialiser la connexion en la fermant. Il faut le faire au niveau où on a remarqué que la requête échouait. Dans notre cas, au début de chaque tâche celery :

from django.db import connection 
 
@task
def do_stuff():
    connection.close()
    # le reste du code

Voyant la connexion fermée, Django va en ouvrir une nouvelle à la prochaine requête automatiquement.

Cela a, évidement, un impact sur les performances, donc choisissez bien entre mettre une rustine et changer la roue.

One thought on “Django pleure ‘MySQL server has gone away’

  • Juju

    Excellent, ça fait des mois que j’ai ce problème et que je ne sais pas comment le résoudre !
    J’utilise celery mais mon hébergeur ne me permet pas d’utiliser Redis donc j’ai la BDD MySQL comme backend… En général ça marche pas trop mal mais environ une ou deux fois par mois celery plante à cause de ça.
    Merci pour l’astuce.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.