Сначала я подумал о том, что фактически контролирует max_allowed_packet . Вот что я нашел:
В соответствии со страницей 99 «Понимание внутренних компонентов MySQL» (ISBN 0-596-00957-7) , здесь приводятся параграфы 1-3, поясняющие это:
Код сетевого взаимодействия MySQL был написан в предположении, что запросы всегда достаточно короткие, и поэтому могут отправляться и обрабатываться сервером в одном фрагменте, который в терминологии MySQL называется пакетом . Сервер выделяет память для временного буфера для хранения пакета и запрашивает достаточно для его полного заполнения. Эта архитектура требует мер предосторожности, чтобы избежать исчерпания памяти на сервере - ограничение размера пакета, которое выполняет эта опция.
Интересующий код в отношении этой опции находится в
sql / net_serv.cc . Посмотрите на my_net_read () , затем выполните вызов my_real_read () и обратите особое внимание на
net_realloc () .
Эта переменная также ограничивает длину результата многих строковых функций. Смотрите sql / field.cc и
sql / intem_strfunc.cc для подробностей.
Учитывая это определение max_allowed_packet, я обнаружил кое-что еще из ServerFault: объединенные innodb_log_file_size и innodb_log_buffer_size должны быть в десять раз больше, чем ваш самый большой объект BLOB, если у вас много больших объектов.
Имея в виду эти две вещи, я бы увеличил innodb_log_file_size в /etc/my.cnf до максимально допустимого размера, 2047M. Это, конечно, требует следующего
service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start
Это позволит вместить любые большие капли, которые вы можете иметь в своих данных.