Я видел интересный ответ на вопрос о самой большой BLOB, которую вы можете иметь. Вот утверждение, которое я видел в ServerFault: объединенные innodb_log_file_size и innodb_log_buffer_size должны быть в десять раз больше, чем ваш самый большой объект BLOB, если у вас много больших объектов .
Основываясь на этом сообщении ServerFault от Nils-Anders Nøttseter , вы должны запросить таблицу и выяснить, какой BLOB является самым большим, умножить это число на 11 или более и использовать этот ответ в качестве max_allowed_packet в дальнейшем.
Забавно, что я обратился к другому вопросу, где я предложил определить размер пакета max_allowed, чтобы, надеюсь, решить эту проблему .
ПРЕДОСТЕРЕЖЕНИЕ
Согласно Книге
Вот что говорит о пакетах 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