Errore piloni: "Il server MySQL è andato via"
Domanda
Sto usando Pylons (un framework Python) per servire una semplice applicazione web, ma sembra morire di tanto in tanto, con questo nel registro degli errori: (2006, 'MySQL server has gone away')
Ho fatto un po' di controlli e ho visto che ciò era dovuto al fatto che le connessioni a MySQL non venivano rinnovate.Questo non dovrebbe essere un problema però, perché il sqlalchemy.pool_recycle
nel file di configurazione dovrebbe mantenerlo automaticamente in vita.L'impostazione predefinita era 3600
, ma l'ho richiamato 1800
a causa di questo problema.Ha aiutato un po', ma 3600
Dovrebbe stare bene secondo i documenti.Gli errori si verificano ancora con una certa regolarità.Non voglio abbassarlo troppo però e DOS il mio database :).
Forse qualcosa nella mia configurazione MySQL è sciocco?Non so dove guardare esattamente.
Altri dettagli rilevanti:
Python 2.5
Pylons: 0.9.6.2 (w/ sql_alchemy)
MySQL: 5.0.51
Soluzione
Penso di averlo risolto.Si è scoperto che ho avuto un semplice errore di configurazione.Il mio file ini diceva:
sqlalchemy.default.url = [connection string here]
sqlalchemy.pool_recycle = 1800
Il problema è che il mio environment.py
file dichiarava che il motore avrebbe mappato solo le chiavi con il prefisso: sqlalchemy.default
COSÌ pool_recycle
è stato ignorato.
La soluzione è semplicemente cambiare la seconda riga dell'ini in:
sqlalchemy.default.pool_recycle = 1800
Altri suggerimenti
Potresti voler controllare le variabili di timeout di MySQL:
show variables like '%timeout%';
Probabilmente ti interessa wait_timeout
(meno probabile ma possibile: interactive_timeout
).Su Debian e Ubuntu, i valori predefiniti sono 28800 (MySQL interrompe le connessioni dopo 8 ore), ma forse il valore predefinito per la tua piattaforma è diverso o chi amministra il server ha configurato le cose in modo diverso.
AFAICT, pool_recycle
in realtà non mantiene attive le connessioni, le fa scadere da solo prima che MySQL le uccida.Non ho familiarità con i tralicci, ma se si causa l'intermittenza delle connessioni, eseguire a SELECT 1;
è un'opzione che li manterrà in vita al costo di un carico del server praticamente nullo e di un traffico di rete minimo.Un ultimo pensiero:riesci in qualche modo a utilizzare una connessione che i tralicci pensano sia scaduta?