qual é um valor razoável para max_allowed_packet para o Drupal 7 com tráfego moderado?

12

Eu preciso saber algum número de ball ball para essa variável no meu site drupal 7. Recentemente, recebi um erro "drupal" PDOException: SQLSTATE [08S01]: Falha no link de comunicação: 1153 ". Sou iniciante no mysql e estou usando hospedagem compartilhada. Provavelmente, preciso pedir ao administrador para fazer isso por mim.

Desde já, obrigado.

Patrick Cheung
fonte
1
Minha resposta mostra minha experiência com isso, mas você pode obter melhores respostas em dba.stackexchange.com daqueles que mantêm o MySQL como meio de vida.
mpdonadio

Respostas:

12

Vi uma resposta interessante a uma pergunta sobre o maior BLOB que você possa ter. Aqui está a declaração que vi 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 grandes .

Com base na publicação ServerFault da Nils-Anders Nøttseter , você deve consultar a tabela e descobrir qual BLOB é o maior, multiplicar esse número por 11 ou mais e usar essa resposta como o max_allowed_packet daqui para frente.

É engraçado que eu tenha abordado outra questão em que sugeri dimensionar o pacote max_allowed para resolver o problema .

EMBARGO

De acordo com o livro

TheBookImage

Aqui está o que os parágrafos 1-3 dizem sobre os pacotes MySQL:

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 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.

Saber isso sobre os pacotes MySQL permite que um DBA os dimensione para acomodar vários BLOBs dentro de um pacote MySQL, mesmo que sejam desagradáveis.

Em relação à sua situação, você deve descobrir qual é o maior BLOB do seu banco de dados, multiplicar esse número por 11 e definir seu max_allowed_packet para esse número. Você deve configurá-lo para o servidor sem reiniciar o mysql (Pessoalmente, eu o configuraria 256M, pois ele resolveria outros problemas relacionados à migração e replicação, que estão além do escopo deste fórum). Para configurá-lo para 256M no seu banco de dados para todas as conexões de entrada, execute o seguinte:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Depois, adicione essa configuração ao my.cnf na [mysqld]seção:

[mysqld]
max_allowed_packet = 256M
RolandoMySQLDBA
fonte
O pacote máximo permitido também não afetaria o tamanho das instruções de inserção?
precisa
@ButtleButkus Claro. É por isso que pacotes MySQL maiores se dão bem com INSERTs. Observe que 1G é o tamanho máximo para max_allowed_packet. Observe também que a configuração de max_allowed_packet como 256M não aloca 256M antecipadamente. De acordo com dev.mysql.com/doc/refman/5.6/en/… , o mysqld aloca qualquer tamanho de net_buffer_length como o tamanho inicial do pacote MySQL. O pacote aumenta gradualmente para o tamanho definido por max_allowed_packet. Portanto, não há problema em definir um max_allowed_packet grande. INSERTs vão amar você por isso.
RolandoMySQLDBA 15/03
Nunca defini nada próximo desse tamanho, apesar de termos algumas máquinas com 32G de RAM. Um aplicativo engasgou com ele, porém, e eu aumentei para 32M do padrão (1M?) E funcionou. Talvez eu aumente ainda mais, se não doer. Mas, os aplicativos devem verificar o max_allowed_packet e dividir as inserções em pedaços para evitar atingir esse limite? Qual é a desvantagem dessa abordagem? Talvez eu deva postar essa pergunta no site da pilha do dba.
Buttle Butkus
Você poderia explicar um pouco mais por que devemos multiplicar por 11? O post vinculado é sobre buffers innodb - como isso está relacionado ao tamanho do pacote?
SystemParadox
4

Retirado da página Requisitos do servidor de banco de dados do Drupal :

Pode ser necessário definir a variável de sistema max_allowed_packet para pelo menos 16M. Alguns planos de hospedagem baratos definem esse valor muito baixo (o padrão do MySQL é de apenas 1 milhão). Nesse caso, pode ser necessário escolher um plano de hospedagem melhor. Um valor de 1M pode ser suficiente para o Drupal 5.

Deve ser bom para um site em hospedagem compartilhada.

Phizes
fonte
1
Uau!! Os requisitos do servidor Drupal dizem oficialmente que são 16 milhões! Eu nunca tive consciência disso. Manterá isso em mente na próxima vez. Muito obrigado por compartilhar essas informações. Eu gostaria de poder marcar a melhor resposta !!
shivams
2

Pode ser um pouco complicado de definir max_allowed_packet. Ainda não encontrei um método para calcular esse valor. Normalmente, eu o encontro ao tentar restaurar um instantâneo de banco de dados que inclui linhas das {cache}tabelas.

Quando tiver esse problema, selecionarei um valor entre 4M e 8M. Eu continuo aumentando o valor até que ele pare. No entanto, não sei se um host compartilhado alterará esse valor para você.

mpdonadio
fonte