A primeira que pensei foi sobre o que max_allowed_packet realmente controla. Aqui está o que eu encontrei:
De acordo com a página 99 de "Entendendo o MySQL Internals" (ISBN 0-596-00957-7) , aqui estão os parágrafos 1-3 que explicam:
O código de comunicação de rede do MySQL foi escrito sob a suposição de que as consultas são sempre razoavelmente curtas e, portanto, podem ser enviadas e processadas pelo servidor em um pedaço, chamado de pacote na terminologia do MySQL. O servidor aloca a memória para um buffer temporário para armazenar o pacote e solicita o suficiente para caber totalmente nele. Essa arquitetura requer uma precaução para evitar que o servidor fique sem memória - um limite para o tamanho do pacote, que essa opção realiza.
O código de interesse em relação a esta opção é encontrado em
sql / net_serv.cc . Dê uma olhada em my_net_read () , siga a chamada para my_real_read () e preste atenção especial a
net_realloc () .
Essa variável também limita o comprimento de um resultado de muitas funções de string. Veja sql / field.cc e
sql / intem_strfunc.cc para obter detalhes.
Dada a definição de max_allowed_packet, descobri outra coisa no ServerFault: innodb_log_file_size e innodb_log_buffer_size combinados devem ser maiores que dez vezes o seu maior objeto de blob, se você tiver muitos objetos grandes
Mantendo essas duas coisas em mente, eu aumentaria innodb_log_file_size em /etc/my.cnf para o tamanho máximo permitido, 2047M. Obviamente, isso requer o seguinte
service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start
Isso acomodará todos os grandes blobs que você possa ter em seus dados.