2016-11-17 1 views
6

J'utilise SQLAlchemy avec deux bases de données MySQL. L'une d'elles est ma base de données de développement hébergée localement sur ma machine et l'autre est un serveur MySQL fourni par ClearDB sur Heroku pour la production.Diagnostic de la connexion Lost 2013 à MySQL

J'ai une longue session ouverte avec la base de données pendant qu'elle effectue une opération de synchronisation avec un autre service. Sur ma machine locale, cela se termine bien mais en production, je reçois l'erreur (2013, 'Perte de connexion au serveur MySQL lors de la requête').

J'ai lu d'autres articles qui indiquent que la taille de la requête est trop grande ou que la variable d'actualisation du pool doit être ajustée. Je ne crois pas que la charge utile de transaction est relativement grande et la définition d'une variable pool_recycle lors de l'appel de SQLAlachemy create_engine n'a pas semblé fonctionner. Est-ce que quelqu'un d'autre a éprouvé ce problème ou a pu m'aider à affiner la raison sous-jacente de cette erreur - il semble être un piège pour tous et je ne sais pas où aller à partir d'ici.

Comme demandé dans les commentaires, les deux systèmes renvoient les mêmes valeurs pour select @@interactive_timeout, @@wait_timeout: 28800, 28800.

Merci

+1

Veuillez interroger cette requête SQL à la fois sur votre base de données dev et sur la base de données de production. 'select @@ interactive_timeout, @@ wait_timeout'. S'il vous plaît [modifier] votre question pour nous dire quelles valeurs vous avez sur vos deux bases de données. Les bases de données de production ont parfois des délais d'attente plus courts que les bases de données de développement. –

+0

Ah, je voulais vraiment inclure ces chiffres quand j'ai commencé à poster ceci ... mais j'ai oublié. J'ai mis à jour ma question. Merci @ O.Jones – freebie

+0

Avez-vous sélectionné les variables dans une session client interactive? Si c'est le cas, vous devez faire SELECT @@ global.interactive_timeout, @@ global.wait_timeout'. Dans une session interactive, le wait_timeout de niveau session est ajusté au timeout interactif, donc inutile. – elenst

Répondre

2

Même si les deux bases de données semblent utiliser les mêmes délais d'attente et config, en général. Il s'est avéré être un timeout effectué ailleurs par ClearDB. ClearDB surveille les connexions et les tue lorsqu'elles sont ouvertes pendant plus d'une minute. Je ne pouvais pas trouver ce docuemnted à l'origine.

Le correctif était en train de définir le paramètre pool_recycle sur pool_recycle=60 lors de la création du moteur. Ma tentative précédente à ceci j'utilisais un nombre arbitraire (parce que je ne connaissais pas le délai d'attente de ClearDB) plus haut que ceci.