mysql: Packet too large



2011-04-14

Erro: Packet too large

Quando um cliente MySQL ou o servidor mysqld recebe um pacote maior que max_allowed_packet bytes, ele envia o erro Packet too large e fecha a conexão.
No MySQL 3.23 o maior pacote possível é 16M (devido a limites do protocolo cliente/servidor). No MySQL 4.0.1 e acima el só é limitado pela quantidade de memória que você tem no seu servidor (até um máximo teórico de 2GB).
Um pacote de conexão é uma única instrução SQL enviada ao servidor MySQL ou um única linha enviada para o cliente.
Quando um cliente MySQL ou o servidor mysqld obtem um pacote maior que max_allowed_packet bytes, ele envia o erro Packet too large e fecha a conexão. Com alguns clientes você também pode obter o erro Lost connection to MySQL server during query se o pacote de comunicação for muito grande.
Note que tanto o cliente quanto o servidor tem a sua própria variável max_allowed_packet. Se você quiser tratar os pacotes grandes, você tem que aumentar esta variável tanto no cliente quanto no servidor.
É seguro aumentar esta variável já que a memória só é alocada quando necessário; esta variável é mais uma precaução para pegar pacotes errados entre o cliente/servidor e também para assegurar que você use pacotes grandes acidentalemente e assim fique sem memória.
Se você estiver usando o cliente mysql, você pode especificar um buffer maior iniciando o cliente com mysql --set-variable=max_allowed_packet=8M. Outros clientes tem métodos diferentes de configurar esta variável. Por favor, note que --set-variable está obsoleta desde o MySQL 4.0, em seu lugar utilize --max-allowed-packet=8M.
Você pode utilizar o arquivo de opção para definir max_allowed_packet com um tamanho maior no mysqld. Por exemplo, se você está esperando armazenar o tamanho total de um MEDIUMBLOB em uma tabela, você precisará iniciar o servidor com a opção set-variable=max_allowed_packet=16M.
Você também pode obter problemas estranhos com pacotes grandes se você estiver usando blobs grandes, mas você não deu para mysqld accesso a memória suficiente para tratar a consulta. Se você suspeita que este é o caso, tente adicionar ulimit -d 256000 no inicio do script mysqld_safe e reinicie o mysqld.
Postar um comentário