Общая ошибка: 2006 сервер MySQL ушел [закрыт]

8

Это ошибка, которую я внезапно получаю.

Additional uncaught exception thrown while handling exception.

Original
PDOException: SQLSTATE[70100]: Unknown error: 1317 Query execution was interrupted...my query

Additional
PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away...my query

После некоторого исследования кажется, что пользовательский модуль, который я создал, пытается выполнить слишком большой запрос. Решение, которое работает для многих людей, таково:

  1. Откройте my.ini
  2. Измените «max_allowed_packet» с «1 м» на «16 м» (или больше)
  3. Сохраните my.ini и перезапустите MySQL

Однако я нахожусь на общем сервере, поэтому я не могу редактировать my.ini, и хотя мой провайдер подтвердил мне, что значение установлено в 1M, они не будут его увеличивать.

Я также попытался добавить это: ini_set('mysqli.reconnect', 'on');к settings.php. Это не решило проблему.

Кто-нибудь знает другое решение или обойти?

Спасибо.

dbj44
источник

Ответы:

8

Компании совместного хостинга не отдают привилегию SUPER . Если у вас есть, вы можете легко установить max_allowed_packet на 512M, просто запустив это:

mysql> SET GLOBAL max_allowed_packet = 1024 * 1024 * 512;

Перезапуск не требуется. Затем все входящие соединения после этого могут иметь пакет 512M .

Ты не сможешь это сделать:

mysql> SET max_allowed_packet = 1024 * 1024 * 512;

потому что вы получаете

ERROR 1621 (HY000): SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value

Единственная альтернатива, о которой я могу подумать, - это переключиться на Amazon EC2 и установить там MySQL. Таким образом, вы можете свободно редактировать my.cnf / my.ini и иметь привилегию SUPER .

RolandoMySQLDBA
источник
0

Я попросил моего провайдера увеличить стоимость, но они не будут. Я понимаю, почему они занимаются бизнесом и хотят, чтобы я платил 29,99 в месяц за выделенный сервер, а не 4,99 за общий сервер.

Однако есть решение: определить слишком большой запрос и разбить его на две или более частей. Я разделил свой проблемный запрос пополам: проблема решена. Неэффективно - да - но это лучше, чем мой сайт, не работающий вообще или вынужденный доплачивать.

dbj44
источник
Пожалуйста, имейте в виду, что я сказал о пакетах MySQL ( superuser.com/a/273833/76764 ). Обычно подозреваемые, которые могут засорить пакет MySQL, являются большими полями TEXT / BLOB. Так что вы можете подумать о сжатии своего TEXT/BLOB fieldsкода вместо джерри фальсификации.
RolandoMySQLDBA
Да, возможно, это может быть проблемой, но хотя мой запрос SELECT был относительно сложным, возвращаемый набор результатов содержал всего несколько сотен символов текста.
dbj44
2
Вы можете начать сталкиваться с проблемами с таблицами кеша, делающими INSERT, которые являются довольно большими. Ваше решение не будет работать здесь или в любом другом месте, где Drupal выполняет запрос.
mpdonadio
Это не INSERT, просто запрос SELECT с 25 соединениями. Все сделано с помощью построителя запросов. Знаете ли вы, почему это может вызвать такую ​​ошибку? Выполнение INSERT через обработчик отправки формы не является проблемой.
dbj44
0

Проблема в том, что max_allowed_packetвы устанавливаете его с большим значением.

Как решить эту проблему (если вы находитесь в Windows и используете xamp, найдите файл my.ini)
Перейдите в xampp \ mysql \ bin
Откройте my.ini
Измените «max_allowed_packet» с «1m» на «16m».
Сохраните my.ini.
Теперь перезапустите MySql через панель управления XAMPP.

Нашел это решение здесь. http://minorpoint.blogspot.com/2007/09/mysql-server-has-gone-away.html

Yuseferi
источник