Cron stürzt MySQL ab


8

Nach dem Wechsel auf einen neuen Server erhalte ich einmal am Tag das Problem mit dem MySQL-Absturz [1], das in meine E-Mail eingeht und ärgerlich ist, ganz zu schweigen von möglichen Auswirkungen. Gibt es Hinweise zum Debuggen dieses Problems?

Offensichtlich passiert ein Absturz, $schedule->save()also habe ich versucht, ihn mit einem Versuch zu verpacken ... zu fangen, aber das hat nicht geholfen

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}

Timeout-Einstellungen:

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
Dies ist PHP, das die Verbindung zu MySQL verliert. Wenn Sie Magento kennen, liegt das wahrscheinlich daran, dass die Ausführung der Datei cron.php Stunden dauert. Versuchen Sie, Ihre MySQL-Timeout-Einstellungen zu überprüfen ...
Matt Humphrey

Könnten Sie MySQL LOG überprüfen! höchstwahrscheinlich stürzt
MySQL ab und startet

@ MattHumphrey Problem ist, dass es nur einmal am Tag passiert, während cron.php alle 15 Minuten läuft, Timeouts sind bereits ziemlich hoch
Zifius

1
Ich denke nicht, dass dies eine Magento-spezifische Frage ist. Was Sie beschreiben, ist ein Verbindungszeitlimit auf einem MySQL-Server, das normalerweise wiederhergestellt wird, indem Sie eine Option zum erneuten Verbinden der Verbindung festlegen und den Server vor der Verwendung anpingen. Ich würde mir Ihre MySQL-Konfiguration ( my.cnf) ansehen, um das Timeout zu ermitteln und zu erhöhen. Weitere Informationen finden Sie unter stackoverflow.com/questions/4284194/… .
Karlson

@ Zifius Was sind die Timeout-Einstellungen?
Karlson

Antworten:


5

Wie andere gesagt haben, wird es wahrscheinlich durch ein lang laufendes Skript ausgelöst. Jedes Skript, dessen Ausführung ohne Verwendung der Datenbank lange dauert, kann möglicherweise eine Zeitüberschreitung verursachen.

Ich habe das schon einmal erlebt. Wir haben ein Skript, das eine Verbindung zu einem Remote-Server herstellt, einige hundert XML-Dateien herunterlädt, analysiert und in eine CSV-Datei konvertiert, um sie über das integrierte Magento ImportExport-Modul zu importieren. Wir haben ein benutzerdefiniertes Protokollierungsmodul, mit dem wir verfolgen können, was mit unseren Routinen passiert ist. Das allererste, was die Klasse tut, ist, dieser Protokolltabelle eine Zeile hinzuzufügen, um zu sagen, dass die Routine gestartet wurde. Das Abrufen der Remote-XML-Dateien dauert dann 5-10 Minuten. Nach dem Herunterladen der Dateien wird versucht, einen weiteren Protokolleintrag zu schreiben, um anzuzeigen, dass der Vorgang abgeschlossen ist. Da die MySQL-Verbindung seit dem ersten Protokollereignis geöffnet war und seitdem nicht mehr verwendet wurde, hat MySQL die Verbindung geschlossen, da es länger als die Zeitüberschreitung keine Abfrage erhalten hat.


Ja, scheint der Schuldige zu sein, der berücksichtigt, dass Cron-Jobs über der Zeile ausgeführt werden, die den Eintrag speichert. Weitere Protokollierung hinzugefügt, um herauszufinden, welcher Job das ist
Zifius

3

In Ihrem /etc/mysql/my.cnfVersuch, den Wert für zu erhöhenmax_allowed_packet

Z.B.

max_allowed_packet = 256M

Starten Sie dann MySQL neu.


Im Moment ist es bei 64M, wird versuchen zu erhöhen. Ich sehe auch viel "Zu spät für den Zeitplan". Ausnahmen, muss ein schwerer Job sein, der zu lange läuft
Zifius

Deaktivierter FPC-Crawler gemäß Ihrer Empfehlung in einer anderen Frage. Mal sehen, wie es geht
Zifius

Dies ist die häufigste Ursache für das Problem, wenn dieser Fehler auftritt.
Davidalger

1

Wenn Sie mich fragen, ist es keine gute Idee, eine MySQL-Verbindung stundenlang offen zu halten. Die Alternative besteht also darin, zu überprüfen, ob die Verbindung noch besteht. Wenn nein, öffnen Sie eine neue.


Es ist ein
Kerncode

Vielleicht gibt es einen Beobachter, mit dem Sie überprüfen können, ob die Verbindung besteht?
Fabian Blechschmidt

Ich denke, ich muss nur diesen Job finden und reparieren :)
Zifius

Abhängig davon, wie viele Storeviews, Kategorien und Produkte Sie haben, kann es sich um einen Indexer handeln, und dies kann nur einige Zeit dauern. Aber ja, "nur den Job reparieren" und das Problem ist weg: D
Fabian Blechschmidt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.