O que a configuração “max_allowed_packet” do MySQL realmente controla?


8

Estamos limpando os problemas do banco de dados nas últimas quatro horas, graças a uma mysqldumpfalha que não foi suficientemente errada. Estávamos recebendo estes erros:

mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014

O que diabos essa configuração faz? Obviamente, não é o tamanho do pacote IP, já que o tenho definido para 32 milhões agora. Por que isso existe?

Respostas:


7

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 premissa de que as consultas sempre são 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 ajustá-lo totalmente. 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.

Esta é provavelmente a explicação mais completa de max_allowed_packet que eu já vi. Eu digitei esses 3 parágrafos diretamente do livro.


Obrigado por postar isso. Parece sugerir que "pacote" significa "pacote IP".
Randolf Richardson

Ótima resposta. Acho que isso é o mais próximo que eu estou de uma resposta real. (Eu ainda tenho certeza que isso não está se referindo a pacotes IP Não menciona IP em qualquer lugar, e eu acredito que 65535 bytes é tipicamente o limite do mundo real para pacotes IP, mesmo fragmentados..)
Plutor

1

A documentação explica detalhadamente aqui:

"O tamanho máximo de um pacote ou qualquer sequência gerada / intermediária. ..."

A documentação também aborda os BLOBs e como essa configuração se vincula a eles.


Isso realmente não responde à minha pergunta. O que é um pacote neste contexto? Na verdade, é um pacote IP? Não existe uma maneira melhor do que um simples limite de bytes para capturar dados malformados?
Plutor

A menos que eles definam "pacote" como algo mais (o que eles não parecem fazer na documentação), é razoável esperar que "pacote" se refira a um pacote IP.
Randolf Richardson

Encontrei a definição em um livro que tenho. Adicionei um trecho desse livro como resposta.
RolandoMySQLDBA
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.