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)

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.


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.