Cron plante MySQL

8

Après avoir déménagé sur un nouveau serveur, je reçois le problème de crash MySQL [1] une fois par jour, qui arrive dans mon e-mail et ennuyeux sans parler de son impact potentiel. Des conseils sur la façon de déboguer ce problème?

De toute évidence, le crash se produit $schedule->save(), j'ai donc essayé de l'envelopper avec un essai ... attraper, mais cela n'a pas aidé

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
Trace:
#0 /var/www/vhosts/site/store/lib/Zend/Db/Adapter/Pdo/Abstract.php(305): PDO->beginTransaction()
#1 /var/www/vhosts/site/store/lib/Zend/Db/Adapter/Abstract.php(495): Zend_Db_Adapter_Pdo_Abstract->_beginTransaction()
#2 /var/www/vhosts/site/store/lib/Varien/Db/Adapter/Pdo/Mysql.php(219): Zend_Db_Adapter_Abstract->beginTransaction()
#3 /var/www/vhosts/site/store/app/code/core/Mage/Core/Model/Resource/Abstract.php(76): Varien_Db_Adapter_Pdo_Mysql->beginTransaction()
#4 /var/www/vhosts/site/store/app/code/core/Mage/Core/Model/Abstract.php(313): Mage_Core_Model_Resource_Abstract->beginTransaction()
#5 /var/www/vhosts/site/store/app/code/core/Mage/Cron/Model/Observer.php(125): Mage_Core_Model_Abstract->save()
#6 /var/www/vhosts/site/store/app/code/core/Mage/Core/Model/App.php(1338): Mage_Cron_Model_Observer->dispatch(Object(Varien_Event_Observer))
#7 /var/www/vhosts/site/store/app/code/core/Mage/Core/Model/App.php(1317): Mage_Core_Model_App->_callObserverMethod(Object(Mage_Cron_Model_Observer), 'dispatch', Object(Varien_Event_Observer))
#8 /var/www/vhosts/site/store/app/Mage.php(447): Mage_Core_Model_App->dispatchEvent('default', Array)
#9 /var/www/vhosts/site/store/cron.php(46): Mage::dispatchEvent('default')
#10
{main}

Paramètres de délai:

mysql> show global variables like '%timeout%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 30       |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 3600     |
+----------------------------+----------+
10 rows in set (0.00 sec)
Zifius
la source
1
C'est PHP qui perd sa connexion avec MySQL. Connaître magento, c'est probablement parce que le fichier cron.php prend des heures à s'exécuter. Essayez de regarder vos paramètres de délai d'expiration MySQL ...
Matt Humphrey
Pourriez-vous consulter le journal mysql! mysql se bloque et redémarre probablement une fois que vous essayez d'interroger cette table
Meabed
Le problème @MattHumphrey est qu'il ne se produit qu'une fois par jour alors que cron.php s'exécute toutes les 15 minutes, les délais d'attente sont déjà assez élevés
Zifius
1
Je ne pense pas que ce soit une question spécifique à Magento. Ce que vous décrivez est un délai d'expiration de connexion sur un serveur MySQL, qui est normalement restauré en définissant une option de reconnexion sur la connexion et en envoyant une requête ping au serveur avant utilisation. Je regarderais votre configuration MySQL ( my.cnf) pour voir quel est le délai d'attente et l'augmenter. Voir stackoverflow.com/questions/4284194/… pour plus de détails.
Karlson
@Zifius Quels sont les paramètres de délai d'attente?
Karlson

Réponses:

5

Comme d'autres l'ont dit, il est probablement déclenché par un script de longue durée. Tout script dont l'exécution est longue sans utiliser la base de données peut potentiellement expirer.

Je l'ai déjà fait auparavant. Nous avons un script qui se connecte à un serveur distant, télécharge quelques centaines de fichiers xml, les analyse et les convertit en un fichier .csv pour importation via le module Magento ImportExport intégré. Nous avons un module de journalisation personnalisé, qui nous permet de suivre ce qui s'est passé avec nos routines. La toute première chose que fait la classe est d'ajouter une ligne à cette table de journal pour dire que la routine a commencé. Il faut ensuite 5 à 10 minutes pour récupérer les fichiers xml distants. Après avoir téléchargé les fichiers, il tente d'écrire une autre entrée de journal pour dire qu'il est terminé. Étant donné que la connexion mysql est ouverte depuis le premier événement de journalisation et n'a pas été utilisée depuis, mysql a fermé la connexion car elle n'a reçu aucune requête pendant plus de la période d'expiration.

Peter O'Callaghan
la source
Ouais, semble être le coupable en tenant compte du fait que les tâches cron sont exécutées au-dessus de la ligne qui enregistre l'entrée. Ajout de plus de journalisation pour savoir de quel travail il s'agit
Zifius
3

Dans votre /etc/mysql/my.cnftentative, augmentez la valeur demax_allowed_packet

Par exemple.

max_allowed_packet = 256M

Redémarrez ensuite MySQL.

Ben Lessani - Sonassi
la source
En ce moment, il est à 64M, va essayer d'augmenter. Je vois aussi beaucoup de «Trop tard pour le calendrier». exceptions, doit être un travail lourd trop long
Zifius
Crawler FPC désactivé selon votre recommandation dans une autre question, voyons comment ça se passe
Zifius
Il s'agit de la cause la plus fréquente du problème lorsque nous rencontrons cette erreur.
davidalger
1

Si vous me demandez, ce n'est pas une bonne idée de garder une connexion mysql ouverte pendant des heures. Donc, l'alternative est, pour vérifier si la connexion existe toujours, sinon, ouvrez-en une nouvelle.

Fabian Blechschmidt
la source
C'est un code de base, mais oui, vous avez raison :) Il suffit de retrouver le travail qui dure depuis si longtemps
Zifius
il y a peut-être un observateur que vous pouvez utiliser pour vérifier si la connexion existe?
Fabian Blechschmidt
Je pense que je dois juste trouver et corriger ce travail :)
Zifius
Selon le nombre de vues de magasin, les catégories et les produits dont vous disposez, il peut s'agir d'un indexeur et cela peut prendre du temps. Mais oui, "il suffit de réparer le boulot" et le problème a disparu: D
Fabian Blechschmidt