что является разумным значением для max_allowed_packet для Drupal 7 с умеренным трафиком?

12

Мне нужно знать некоторый номер парка шаров для этой переменной для моего сайта drupal 7. Недавно я получил «drupal» PDOException: SQLSTATE [08S01]: ошибка канала связи: ошибка 1153 ". Я новичок в MySQL и использую виртуальный хостинг. Мне, вероятно, нужно попросить администратора сделать это для меня.

Заранее спасибо.

Патрик Чунг
источник
1
Мой ответ показывает мой опыт с этим, но вы можете получить лучшие ответы на dba.stackexchange.com от тех, кто поддерживает MySQL для жизни.
mpdonadio

Ответы:

12

Я видел интересный ответ на вопрос о самой большой BLOB, которую вы можете иметь. Вот утверждение, которое я видел в ServerFault: объединенные innodb_log_file_size и innodb_log_buffer_size должны быть в десять раз больше, чем ваш самый большой объект BLOB, если у вас много больших объектов .

Основываясь на этом сообщении ServerFault от Nils-Anders Nøttseter , вы должны запросить таблицу и выяснить, какой BLOB является самым большим, умножить это число на 11 или более и использовать этот ответ в качестве max_allowed_packet в дальнейшем.

Забавно, что я обратился к другому вопросу, где я предложил определить размер пакета max_allowed, чтобы, надеюсь, решить эту проблему .

ПРЕДОСТЕРЕЖЕНИЕ

Согласно Книге

TheBookImage

Вот что говорит о пакетах MySQL:

Код сетевого взаимодействия MySQL был написан в предположении, что запросы всегда достаточно короткие, и поэтому могут отправляться и обрабатываться сервером в одном фрагменте, который в терминологии MySQL называется пакетом . Сервер выделяет память для временного буфера для хранения пакета, и он запрашивает достаточно для его полного заполнения. Эта архитектура требует мер предосторожности, чтобы избежать исчерпания памяти на сервере - ограничение размера пакета, которое выполняет эта опция.

Интересующий код в отношении этой опции находится в sql / net_serv.cc . Посмотрите на my_net_read () , затем выполните вызов my_real_read () и обратите особое внимание на net_realloc () .

Эта переменная также ограничивает длину результата многих строковых функций. Смотрите sql / field.cc и sql / intem_strfunc.cc для подробностей.

Знание этого о пакетах MySQL позволяет администраторам баз данных изменять их размер для размещения нескольких больших двоичных объектов в одном пакете MySQL, даже если они очень большие.

Что касается вашей ситуации, вы должны выяснить, какой самый большой BLOB-объект в вашей базе данных, умножить это число на 11 и установить свой max_allowed_packet на это число. Вы должны иметь возможность установить его для сервера без перезапуска mysql (лично я бы установил его на 256M, потому что это решит другие проблемы, связанные с миграцией и репликацией, что выходит за рамки этого форума). Чтобы установить 256M для вашей базы данных для всех входящих соединений, пожалуйста, запустите это:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Затем добавьте этот параметр в my.cnf в [mysqld]разделе:

[mysqld]
max_allowed_packet = 256M
RolandoMySQLDBA
источник
Не повлияет ли максимально допустимый пакет на размер операторов вставки?
Баттл Буткус
@ButtleButkus Конечно. Вот почему большие пакеты MySQL хорошо подходят для вставок. Обратите внимание, что 1G - это максимальный размер для max_allowed_packet. Также обратите внимание, что установка max_allowed_packet в 256M не выделяет 256M заранее. Согласно dev.mysql.com/doc/refman/5.6/en/… , mysqld выделяет значение net_buffer_length в качестве начального размера пакета MySQL. Пакет постепенно увеличивается до размера, установленного max_allowed_packet. Поэтому можно установить большой max_allowed_packet. Вставки будут любить тебя за это.
RolandoMySQLDBA
Я никогда не устанавливал ничего подобного, хотя у нас есть пара машин с 32 ГБ ОЗУ. Однако приложение задохнулось, и я увеличил его до 32M по умолчанию (1M?), И это сработало. Возможно я увеличу это далее, если это не повредит. Но должны ли приложения проверять max_allowed_packet и разбивать вставки на куски, чтобы избежать превышения этого предела? В чем недостаток этого подхода? Возможно, мне следует опубликовать этот вопрос на сайте стека dba.
Баттл Буткус
Не могли бы вы подробнее рассказать, почему мы должны умножить на 11? Связанный пост о буферах innodb - как это связано с размером пакета?
SystemParadox
4

Взято со страницы требований к серверу базы данных Drupal :

Может быть необходимо установить системную переменную max_allowed_packet как минимум 16M. Некоторые недорогие хостинговые планы устанавливают это значение слишком низким (по умолчанию MySQL составляет всего 1 МБ). В этом случае вам может понадобиться выбрать лучший хостинг-план. Значение 1M может быть достаточно для Drupal 5.

Должно быть хорошо для сайта на виртуальном хостинге.

Phizes
источник
1
Вау!! Официальные требования к серверу Drupal говорят, что это 16M !! Я никогда не знал об этом. Будет иметь это в виду в следующий раз. Большое спасибо за обмен этой информацией. Я хотел бы отметить лучший ответ!
Шивамс
2

Это может быть немного сложно установить max_allowed_packet. Мне еще не приходилось сталкиваться с методом расчета этой стоимости. Как правило, я сталкиваюсь с этим при попытке восстановить снимок базы данных, который включает строки из {cache}таблиц.

Когда у меня возникнет эта проблема, я выберу значение от 4 до 8 миллионов. Я продолжаю увеличивать значение, пока оно не остановится. Однако я не знаю, изменит ли это значение общий хост.

mpdonadio
источник