Erro no MySQL 2006: servidor mysql foi embora

238

Estou executando um servidor no meu escritório para processar alguns arquivos e relatar os resultados para um servidor MySQL remoto.

O processamento dos arquivos leva algum tempo e o processo termina na metade com o seguinte erro:

2006, MySQL server has gone away

Ouvi falar da configuração do MySQL, wait_timeout , mas preciso alterar isso no servidor do meu escritório ou no servidor MySQL remoto?

floatleft
fonte
2
depende desse servidor bruxa dá o erro
BKSI
2
possível duplicata do ERRO 2006 (HY000): O servidor MySQL foi embora
Simon East
11
Para as pessoas que chegam do Google: se a alteração do max_allowed_packettamanho ou da wait_timeoutquantidade não for corrigida, verifique o uso de memória. Eu estava recebendo o mesmo erro e estava sendo causado pelo meu servidor ficar sem memória. Adicionei um arquivo de troca de 1 GB e o consertei.
Pikamander2
2
@ Pikamander2 obrigado pela dica!
ihsan
4
Oh! Então é tudo mentira? Servidor Mysql realmente não foi a lugar nenhum? Ainda está lá no meu servidor? Whao! :))
Damilola Olowookere

Respostas:

32

Pode ser mais fácil verificar se a conexão e restabelecê-la, se necessário.

Veja PHP: mysqli_ping para informações sobre isso.

Niet, o Escuro Absol
fonte
Bom ponto, se você tiver um processo intermitente, é melhor liberar sua conexão para não esgotar todas as conexões. Reconstruir a conexão geralmente é barato. 1
Yzmir Ramirez
1
em 2018: mysqli_ping está obsoleto
fb
@fb o que é usado para fazer isso com o DOP?
precisa saber é o seguinte
359

Eu encontrei isso várias vezes e normalmente considero a resposta uma configuração padrão muito baixa de max_allowed_packet.

Elevá-lo em /etc/my.cnf(abaixo [mysqld]) para 8 ou 16M geralmente o corrige. (O padrão no MySql 5.7 4194304é de 4 MB.)

[mysqld]
max_allowed_packet=16M

Nota: Basta criar a linha se ela não existir

Nota: Isso pode ser definido no seu servidor enquanto ele está sendo executado.

Use set global max_allowed_packet=104857600. Isso define para 100 MB.

George
fonte
28
Observe que isso pode ser definido no seu servidor enquanto ele está sendo executado. Use: "defina global max_allowed_packet = 104857600". NOTA: Meu valor o define para 100 MB.
Rickumali
26
Para usuários xampp, o my.cnf pode ser encontrada em: C: \ xampp \ mysql \ bin \
Valentin Despa
3
no WAMP: C: \ wamp \ bin \ mysql \ mysql5.6.12 \ my.ini, defina max_allowed_packet = 500M sob [wampmysqld]
Elia Weiss
2
Corrigido o meu problema tooo :)
Altaf Hussain
2
Nota importante: Eu tive que reiniciar meu servidor mysql para que esse efeito entre em vigor. ou seja mysql.server stop, mysql.server start(out de 2018, MySQL v5.7, MacOS)
Nitin Nain 9/18
41

Eu tive o mesmo problema, mas a alteração max_allowed_packetno my.ini/my.cnfarquivo abaixo [mysqld]fez o truque.

adicione uma linha

max_allowed_packet = 500M

agora restart the MySQL servicequando você terminar.

Sathish D
fonte
5
O outro cara escreveu 16M, você escreveu 500M, qual o significado dessa configuração?
pal4life
1
@ pal4life É o tamanho máximo permitido das instruções de inserção. E se a sua instrução de inserção tiver mais de 16M (se a instrução consistir em colunas de blobes longos) Para ficar em um lado mais seguro, torne-o enorme como 500M se você estiver inserindo uma quantidade enorme de dados.
Sathish D
Isso funcionou para mim, mas não sei por que. O valor padrão era 1M, mas quando mudei para 100M, o erro desapareceu. O problema começou quando defini wait_timeout = 30 na tentativa de reduzir o número de threads ociosos no meu servidor.
Vincent Vincent
36

Eu usei o seguinte comando na linha de comando do MySQL para restaurar um banco de dados MySQL com tamanho superior a 7 GB e funciona.

set global max_allowed_packet=268435456;
Geshan Ravindu
fonte
pergunto por que isso foi prejudicado? faz sentido para o erro estar relacionada com o tamanho do pacote ...
FlorinelChis
Isso resolveu meu problema, não está relacionado à questão de maneira direta, mas deve ajudar as pessoas com esse outro problema.
Migerusantte 15/08/16
Para verificar se alterado ou visualizar o valor atual pode usarshow variables like 'max_allowed_packet';
Marcin
16

Erro: 2006 ( CR_SERVER_GONE_ERROR )

Mensagem: servidor MySQL foi embora

Geralmente, você pode tentar conectar novamente e, em seguida, fazer a consulta novamente para resolver esse problema - tente três a quatro vezes antes de desistir completamente.

Vou assumir que você está usando DOP. Nesse caso, você capturaria a exceção PDO, aumente um contador e tente novamente se o contador estiver abaixo de um limite.

Se você tiver uma consulta que está causando um tempo limite, poderá definir esta variável executando:

SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300;  -- OR current session only

Onde 300 é o número de segundos que você considera o tempo máximo que a consulta pode levar.

Mais informações sobre como lidar com problemas de conexão Mysql.

EDIT: Duas outras configurações que você também pode querer usar são net_write_timeoute net_read_timeout.

Yzmir Ramirez
fonte
16

No MAMP (versão não profissional), adicionei

--max_allowed_packet=268435456

para ...\MAMP\bin\startMysql.sh

Créditos e mais detalhes aqui

uwe
fonte
Muito obrigado por isso!
precisa saber é o seguinte
Trabalho! Obrigado!
Simon Franzen
11

Este erro ocorre devido ao vencimento de wait_timeout.

Basta ir ao servidor mysql e verificar o seu wait_timeout:

mysql> MOSTRA VARIÁVEIS COMO 'wait_timeout'

mysql> defina global wait_timeout = 600 # 10 minutos ou tempo máximo de espera que você precisa

http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html

Saurabh Goyal
fonte
Eu não entendo por que alguém votaria contra essa resposta ?! Foi útil para mim.
Basil Musa
11

Existem várias causas para esse erro.

Relacionado ao MySQL / MariaDB:

  • wait_timeout - Tempo em segundos que o servidor aguarda a conexão se tornar ativa antes de fechá-la.
  • interactive_timeout - Tempo em segundos que o servidor aguarda uma conexão interativa.
  • max_allowed_packet- Tamanho máximo em bytes de um pacote ou uma sequência gerada / intermediária. Defina o tamanho do maior BLOB, em múltiplos de 1024.

Exemplo de my.cnf :

[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M

Relacionado ao servidor:

  • Seu servidor tem memória cheia - verifique as informações sobre RAM com free -h

Estrutura relacionada:

  • Verifique as configurações da sua estrutura. Django por exemplo use CONN_MAX_AGE(veja docs )

Como depurar:

  • Verifique os valores das variáveis ​​do MySQL / MariaDB.
    • com sql: SHOW VARIABLES LIKE '%time%';
    • linha de comando: mysqladmin variables
  • Ative a verbosidade para erros:
    • MariaDB: log_warnings = 4
    • MySQL: log_error_verbosity = 3
  • Verifique os documentos para obter mais informações sobre o erro
jozo
fonte
9

Nas janelas, aqueles que usam o xampp devem usar este caminho xampp / mysql / bin / my.ini e alterar max_allowed_packet (na seção [mysqld]) para o tamanho de sua escolha. por exemplo

max_allowed_packet=8M

Novamente no php.ini (xampp / php / php.ini) altere upload_max_filesize o tamanho da escolha. por exemplo

upload_max_filesize=8M

Me deu dor de cabeça por algum tempo até eu descobrir isso. Espero que ajude.

Kenneth mwangi
fonte
esta deve ser a resposta escolhida
bysanchy
Não consigo encontrar upload_max_filesizevariável. Ele sempre se não reconhecido no meu mysql
Aminah Nuraini
9

Eu estava recebendo esse mesmo erro no meu servidor DigitalOcean Ubuntu.

Tentei alterar as configurações max_allowed_packet e wait_timeout, mas nenhum deles o corrigiu.

Acontece que meu servidor estava sem memória RAM. Eu adicionei um arquivo de troca de 1 GB e isso corrigiu meu problema.

Verifique sua memória free -hpara ver se é isso que está causando isso.

Pikamander2
fonte
1
Muito obrigado! Eu tive o mesmo problema no meu DigitalOcean e esta solução funcionou! Eu executei muitas instâncias do meu script, mas depois de alguns threads, ele parou de repente e matou todas as conexões existentes. Agora está tudo bem.
Stalinko 5/09
7

Foi um problema de RAM para mim.

Eu estava tendo o mesmo problema, mesmo em um servidor com 12 núcleos de CPU e 32 GB de RAM. Eu pesquisei mais e tentei liberar RAM. Aqui está o comando que usei no Ubuntu 14.04 para liberar RAM:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

E, consertou tudo. Eu o configurei no cron para executar a cada hora.

crontab -e

0 * * * * bash /root/ram.sh;

E você pode usar este comando para verificar a quantidade de RAM disponível disponível:

free -h

E você terá algo parecido com isto:

             total       used       free     shared    buffers     cached
Mem:           31G        12G        18G        59M       1.9G       973M
-/+ buffers/cache:       9.9G        21G
Swap:         8.0G       368M       7.6G
Rehmat
fonte
5

No meu caso, foi o baixo valor da open_files_limitvariável, que bloqueou o acesso do mysqld aos arquivos de dados.

Eu verifiquei com:

mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)

Depois que alterei a variável para grande valor, nosso servidor voltou a funcionar:

[mysqld]
open_files_limit = 100000
Fedir RYKHTIK
fonte
5

Se você estiver usando o WAMPSERVER de 64 bits, procure várias ocorrências de max_allowed_packet porque o WAMP usa o valor definido em [wampmysqld64] e não o valor definido em [mysqldump], que para mim era o problema, eu estava atualizando o incorreto. Defina isso como algo como max_allowed_packet = 64M.

Espero que isso ajude outros usuários do Wampserver por aí.

Enomatix24
fonte
5

Isso geralmente indica problemas ou tempos limite de conectividade do servidor MySQL . Geralmente, pode ser resolvido alterando wait_timeout e max_allowed_packet em my.cnf ou similar.

Eu sugeriria estes valores:

wait_timeout = 28800

max_allowed_packet = 8M

Memorando
fonte
4

Para o Vagrant Box, aloque memória suficiente para a caixa

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end
Shadoweb
fonte
1
Obrigado por isso :)
SynackSA 2/16
4

O cenário improvável é que você tenha um firewall entre o cliente e o servidor que força a redefinição do TCP na conexão.

Eu tive esse problema e achei que o firewall corporativo F5 estava configurado para encerrar sessões inativas que ficam ociosas por mais de 5 minutos.

Mais uma vez, este é o cenário improvável.

Ahmed
fonte
4

É sempre uma boa idéia verificar os logs do servidor Mysql, pelo motivo pelo qual ele foi embora.

Isso vai lhe dizer.

Alex
fonte
4

Se você estiver usando o servidor xampp:

Vá para xampp -> mysql -> bin -> my.ini

Mude abaixo do parâmetro:

max_allowed_packet = 500M

innodb_log_file_size = 128M

Isso me ajudou muito :)

Archana Kamath
fonte
3

descomente a linha abaixo no seu my.ini/my.cnf, isso dividirá seu arquivo grande em uma porção menor

# binary logging format - mixed recommended
# binlog_format=mixed

PARA

# binary logging format - mixed recommended
binlog_format=mixed
Nico
fonte
3

Eu encontrei a solução para "# 2006 - O servidor MySQL foi embora" neste erro. A solução é apenas você ter que verificar dois arquivos

  1. config.inc.php
  2. config.sample.inc.php

O caminho desses arquivos no Windows é

C:\wamp64\apps\phpmyadmin4.6.4

Nesses dois arquivos, o valor disso:

$cfg['Servers'][$i]['host']must be 'localhost' .

No meu caso, foi:

$cfg['Servers'][$i]['host'] = '127.0.0.1';

altere para:

"$cfg['Servers'][$i]['host']" = 'localhost';

Certifique-se de ambos:

  1. config.inc.php
  2. arquivos config.sample.inc.php, ele deve ser 'localhost'.

E último conjunto:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

Em seguida, reinicie o Wampserver.


Para alterar o nome de usuário e a senha do phpmyadmin

Você pode alterar diretamente o nome de usuário e a senha do phpmyadmin através do arquivo config.inc.php

Essas duas linhas

$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';

Aqui você pode dar um novo nome de usuário e senha. Após as alterações, salve o arquivo e reinicie o servidor WAMP.

hum vida
fonte
2

Recebi a mensagem de erro 2006 em diferentes softwares clientes MySQL no meu desktop Ubuntu. Aconteceu que minha versão do driver JDBC era muito antiga.

Bo Guo
fonte
2

Isso pode ser um problema do tamanho do seu arquivo .sql.

Se você estiver usando o xampp. Vá para o painel de controle do xampp -> Clique em MySql config -> Open my.ini.

Aumente o tamanho do pacote.

max_allowed_packet = 2M -> 10M
Nikunj Dhimar
fonte
2

Existe uma maneira mais fácil se você estiver usando o XAMPP. Abra o painel de controle do XAMPP e clique no botão de configuração na seção mysql.
insira a descrição da imagem aqui

Agora clique no my.ini e ele será aberto no editor. Atualize o max_allowed_packet para o tamanho necessário.

insira a descrição da imagem aqui

Então reinicie o serviço mysql. Clique em parar no serviço Mysql, clique em Iniciar novamente. Aguarde alguns minutos. insira a descrição da imagem aqui insira a descrição da imagem aqui

Em seguida, tente executar sua consulta Mysql novamente. Espero que funcione.

Hriju
fonte
2

MAMP 5.3, você não encontrará my.cnf e adicioná-los não funciona, pois max_allowed_packet é armazenado em variáveis.

Uma solução pode ser:

  1. Vá para http: // localhost / phpmyadmin
  2. Vá para a guia SQL
  3. Execute SHOW VARIABLES e verifique os valores, se for pequeno, execute com grandes valores
  4. Execute a seguinte consulta, ela configurou max_allowed_packet como 7gb:

    definir global max_allowed_packet = 268435456;

Para alguns, também pode ser necessário aumentar os seguintes valores:

set global wait_timeout = 600;
set innodb_log_file_size =268435456;
Rupak Nepali
fonte
0

Para usuários que usam XAMPP, existem 2 parâmetros max_allowed_packet em C: \ xampp \ mysql \ bin \ my.ini.

Subhash
fonte
0

Este erro ocorre basicamente por dois motivos.

  1. Você tem uma RAM muito baixa.
  2. A conexão com o banco de dados é fechada quando você tenta se conectar.

Você pode tentar este código abaixo.

# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
    try:            
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()
    except (AttributeError, MySQLdb.OperationalError):
        self.__init__()
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()

Ele atenua o erro, seja qual for o motivo, especialmente pelo segundo motivo.

Se for causado por pouca RAM, você precisará aumentar a eficiência da conexão com o banco de dados a partir do código, da configuração do banco de dados ou simplesmente aumentar a RAM.

Aminah Nuraini
fonte
0

Caso isso ajude alguém:

Eu recebi esse erro quando abri e fechei conexões em uma função que seria chamada de várias partes do aplicativo. Como possuímos muitas conexões, achamos que seria uma boa ideia reutilizar a conexão existente ou descartá-la e criar uma nova assim:

  public static function getConnection($database, $host, $user, $password)
 {
 if (!self::$instance) {
  return self::newConnection($database, $host, $user, $password);
 } elseif ($database . $host . $user != self::$connectionDetails) {

self :: $ instance-> query ('KILL CONNECTION_ID ()'); self :: $ instance = null; return self :: newConnection ($ banco de dados, $ host, $ usuário, $ senha); } retorna self :: $ instance; } Bem, fomos muito cuidadosos com a matança e, portanto, os processos que fazem coisas importantes na conexão antiga nunca terminam seus negócios. Então deixamos cair essas linhas

  self::$instance->query('KILL CONNECTION_ID()');
  self::$instance = null;

e como o hardware e a configuração da máquina permitem, aumentamos o número de conexões permitidas no servidor adicionando

max_connections = 500

para o nosso arquivo de configuração. Isso corrigiu nosso problema por enquanto e aprendemos algo sobre como matar conexões mysql.

Máx.
fonte
-5

Se você sabe que está offline por um tempo, pode fechar sua conexão, processar, reconectar e escrever seus relatórios.

Joshua Martell
fonte
2
Esta é realmente uma resposta viável, já que o MySQL fecha a conexão ociosa após oito horas.
Bojan Hrnkas