Como alterar o tamanho max_allowed_packet

317

Estou tendo um problema com os campos BLOB no meu banco de dados MySQL - ao enviar arquivos maiores que aproximadamente 1 MB, recebo um erro Packets larger than max_allowed_packet are not allowed.

Aqui está o que eu tentei:

No MySQL Query Browser, executei um show variables like 'max_allowed_packet'que me deu 1048576.

Em seguida, executo a consulta set global max_allowed_packet=33554432seguida por show variables like 'max_allowed_packet'- ela me fornece 33554432 conforme o esperado.

Mas quando eu reinicio o servidor MySQL, ele volta magicamente para 1048576. O que estou fazendo de errado aqui?

Pergunta de bônus, é possível compactar um campo BLOB?

Muleskinner
fonte
1
Um campo BLOB é um OBject grande binário. São apenas pedaços. Então, sim, você pode compactar o conteúdo, e ele fornece outros bits (e, esperançosamente, menos), que você armazena no campo BLOB. Apenas altera os dados que você coloca nele. Você também precisará descompactar o conteúdo do BLOB quando precisar novamente.
Konerak
Ok thanks, esperava uma compilação recurso compressa em mysql existia
Muleskinner

Respostas:

407

Altere o arquivo my.iniou ~/.my.cnfincluindo a única linha em [mysqld]ou [client]seção em seu arquivo:

max_allowed_packet=500M

depois reinicie o serviço MySQL e pronto.

Consulte a documentação para obter mais informações.

Manuel
fonte
1
Obrigado parece estar funcionando, embora eu esperasse que isso fosse possível sem ter que modificar os arquivos ini manualmente.
Muleskinner #
63
FYI leitores, esta também é a solução para "MySQL foi embora" erro
djb
1
@ Konerak, quem foi o provocador?
Pacerier
14
Parece um pouco inútil dar uma resposta a alguém e dizer a eles que devem procurar no Google uma resposta. Especialmente porque o SO invariavelmente ocupa vários dos principais resultados para qualquer questão relacionada à programação decente. Fale sobre a programação de um loop infinito !!! Google> SO> Google> SO> Google> SO e assim por diante.
Phill Healey
5
Verifique se está abaixo [mysqld]e não [mysql](muito semelhante). Me custou alguns minutos de arranhar a cabeça.
Halvor Holsten Strand
225

O max_allowed_packet variável pode ser configurada globalmente executando uma consulta.

No entanto, se você não o alterar no my.ini arquivo (como sugerido pelo dragon112), o valor será redefinido quando o servidor reiniciar, mesmo se você o definir globalmente.

Para alterar o pacote máximo permitido para todos para 1 GB até o servidor reiniciar:

SET GLOBAL max_allowed_packet=1073741824;
TehShrike
fonte
7
Não ajuda :( Ele exibe "Query OK, 0 linhas afetadas (0,00 segundos)".
artnikpro
15
@artnikpro Funciona: "Consulta OK, 0 linhas afetadas (0,00 s)" pode parecer enganosa, mas está correta.
AnnTea
10
não funciona para mim. SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'ainda mostra o valor antigo
Poma
50
Ele mostra o valor antigo porque max_allowed_packet não muda para as conexões existentes. Se você desconectar e reconectar, verá o valor atualizado.
Matt Crinklaw-Vogt
2
Matt Crinklaw-Vogt está certo. Ele precisa sair e ligar novamente
makriria
89

Um dos meus desenvolvedores juniores estava tendo um problema ao modificar isso para mim, então pensei em expandir isso com mais detalhes para os usuários do Linux:

1) terminal aberto

2) raiz ssh @ YOURIP

3) digite a senha root

4) nano /etc/mysql/my.cnf (se o comando não for reconhecido, faça isso primeiro ou tente vi e repita: yum install nano)

5) adicione a linha: max_allowed_packet = 256M (obviamente ajuste o tamanho para o que você precisar) na seção [MYSQLD]. Ele cometeu um erro ao colocá-lo na parte inferior do arquivo primeiro, para que não funcionasse.

insira a descrição da imagem aqui

6) Control + O (salvar), depois ENTER (confirmar) e Control + X (sair do arquivo)

7) serviço mysqld restart

8) Você pode verificar a alteração na seção de variáveis ​​no phpmyadmin

naw103
fonte
Este foi realmente feito em CentosOS6, eu, naturalmente, concordar sobre não usar o acesso ssh raiz embora
naw103
@tamasd Algumas distribuições GNU / Linux que eu usei (como Debian 8 e CentOS 6) produzem sudo: command not foundou this incident will be reportedporque sudoainda não foram instaladas e configuradas. Seria melhor enviar esta resposta com instruções sobre como configurar sudopela primeira vez?
Damian Yerrick 15/09/16
não root ssh é o problema, mas o login com senha é. Uma conta de usuário com permissão sudo é quase tão insegura quanto a raiz. Basta usar a autenticação baseada em chave SSH.
Martin Schneider
a questão de como fazer login na máquina é OT, ele relatou corretamente em sua receita que você precisa fazer login, de uma maneira ou de outra.
Devsmt
41

Eu acho que alguns também gostariam de saber como encontrar o arquivo my.ini no seu PC. Para usuários do Windows, acho que a melhor maneira é a seguinte:

  1. Win + R (atalho para 'executar'), digite services.msc , Enter
  2. Você pode encontrar uma entrada como 'MySQL56', clique com o botão direito do mouse e selecione propriedades
  3. Você pode ver sth como "D: / Arquivos de programas / MySQL / MySQL Server 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Eu obtive esta resposta em http://bugs.mysql.com/bug.php?id=68516

fstang
fonte
2
Isso é importante no Windows. Tinha o MySQL como serviço e editei o my.ini no Workbench e essa resposta me fez perceber que o MySQL como serviço usa outro my.ini que eu editei no Workbench.
Robert Niestroj 25/01/19
20

Seguindo todas as instruções, foi o que fiz e trabalhei:

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              20 |
+-----------------+
1 row in set (0.00 sec)

mysql> select @max_allowed_packet //Mysql do not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet; //That is better... I have max_allowed_packet=32M inside my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> **SET GLOBAL max_allowed_packet=1073741824**; //Now I'm changing the value.
Query OK, 0 rows affected (0.00 sec)

mysql> select @max_allowed_packet; //Mysql not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value. And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Portanto, como podemos ver, o max_allowed_packet foi alterado fora do my.ini.

Vamos sair da sessão e verificar novamente:

mysql> exit
Bye

C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              21 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value still here and And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Now I will stop the server
2016-02-03 10:28:30 - Server is stopped

mysql> SELECT CONNECTION_ID();
ERROR 2013 (HY000): Lost connection to MySQL server during query


Now I will start the server
2016-02-03 10:31:54 - Server is running


C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|               9 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The previous new value has gone. Now I see what I have inside my.ini again.
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

Conclusão, após SET GLOBAL max_allowed_packet = 1073741824, o servidor terá o novo max_allowed_packet até que seja reiniciado, como alguém afirmou anteriormente.

zwitterion
fonte
13

Se você receber esse erro durante a execução de um backup, max_allowed_packetpoderá ser configurado my.cnfespecialmente para mysqldump.

[mysqldump]
max_allowed_packet=512M

Eu continuei recebendo este erro durante a execução de um mysqldumpe eu não entendia porque eu tinha esse conjunto em my.cnfsob a [mysqld]seção. Depois que eu descobri que poderia defini-lo [mysqldump]e definir o valor, meus backups foram concluídos sem problemas.

xpros
fonte
10

Para aqueles que executam o servidor wamp mysql

Ícone Wamp tray -> MySql -> my.ini

[wampmysqld]
port        = 3306
socket      = /tmp/mysql.sock
key_buffer_size = 16M
max_allowed_packet = 16M        // --> changing this wont solve
sort_buffer_size = 512K

Role até o final até encontrar

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Adicione a linha de packet_size entre

[mysqld]
port=3306
max_allowed_packet = 16M
explicit_defaults_for_timestamp = TRUE

Verifique se funcionou com esta consulta

Select @@global.max_allowed_packet;
Sayka
fonte
5

Este erro ocorreu devido aos seus dados conterem um valor maior que o definido.

Basta anotar max_allowed_packed=500M ou você pode calcular esses 500 * 1024k e usá-los em vez de 500M, se desejar.

Agora basta reiniciar o MySQL.

Suresh
fonte
2
para /etc/my.cnf, por exemplo, MySQL, ou /etc/my.cnf.d/server.cnfpara MariaDB
Evgeny Lebedev
5

Muitos dos respondentes descobriram o problema e já deram a solução.

Eu só quero sugerir outra solução, que está alterando o valor da variável Glogal de dentro da ferramenta Mysql Workbench . Claro que, se você usa o Workbench em execução localmente no servidor (ou via conexão SSH)

Você acabou de se conectar à sua instância e acessar o menu:

Servidor -> Arquivo de opções -> Rede -> max_allowed_packed

Você define o valor desejado e precisa reiniciar o serviço MySql .

cnom
fonte
4

Para qualquer pessoa que esteja executando o MySQL no serviço Amazon RDS, essa alteração é feita por meio de grupos de parâmetros . Você precisa criar um novo PG ou usar um existente (que não seja o padrão, que é somente leitura).

Você deve procurar o max_allowed_packetparâmetro, alterar seu valor e pressionar Salvar.

De volta à sua instância do MySQL, se você criou um novo PG, você deve anexá-lo à sua instância (pode ser necessário reiniciar). Se você alterou um PG que já estava anexado à sua instância, as alterações serão aplicadas sem reinicialização em todas as suas instâncias que têm esse PG anexado.

SebaGra
fonte
0

Se você deseja fazer upload de imagens ou dados em tamanho grande no banco de dados. Apenas mude o tipo de dados para 'BIG BLOB'.

Vishal J
fonte
0

defina global max_allowed_packet = 10000000000;

Vishal Sheth
fonte