Cron приводит к сбою MySQL


После перехода на новый сервер я получаю проблему сбоя MySQL [1] раз в день, которая приходит на мою электронную почту и раздражает, не говоря уже о потенциальном воздействии. Есть какие-нибудь подсказки о том, как устранить эту проблему?

Очевидно, что сбой происходит на $schedule->save(), поэтому я попытался обернуть его с помощью try... catch, но это не помогло

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}

Настройки тайм-аута:

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)
Author: Aasim Goriya, 2013-02-11

3 answers

Как уже говорили другие, это, скорее всего, вызвано длительно работающим сценарием. Любой сценарий, выполнение которого занимает много времени без использования базы данных, потенциально может привести к тайм-ауту.

Со мной такое уже случалось раньше. У нас есть скрипт, который подключается к удаленному серверу, загружает несколько сотен xml-файлов, анализирует и преобразует их в файл .csv для импорта с помощью встроенного модуля Magento ImportExport. У нас есть пользовательский модуль ведения журнала, который позволяет нам отслеживать, что произошло с нашими процедурами. Самый первое, что делает класс, это добавляет строку в эту таблицу журнала, чтобы сказать, что процедура запущена. Затем требуется 5-10 минут, чтобы получить удаленные XML-файлы. После загрузки файлов он пытается записать еще одну запись в журнале, чтобы сообщить, что все готово. Поскольку соединение mysql было открыто с момента первого события журнала и с тех пор не использовалось, mysql закрыл соединение, так как не получал запросов дольше, чем период ожидания.

 5
Author: Peter O'Callaghan, 2013-02-13 12:50:45

В вашем /etc/mysql/my.cnf попробуйте увеличить значение для max_allowed_packet

Например.

max_allowed_packet = 256M

Затем перезапустите MySQL.

 3
Author: Ben Lessani - Sonassi, 2013-02-11 16:36:56

Если вы спросите меня, то не очень хорошая идея держать соединение с mysql открытым в течение нескольких часов. Таким образом, альтернатива состоит в том, чтобы проверить, существует ли еще соединение, если нет, откройте новое.

 1
Author: Fabian Blechschmidt, 2013-02-13 00:34:52