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?


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.


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;

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


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


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.


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.


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;

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.


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 .


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.


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


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.