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?


2
depende desse servidor bruxa dá o erro
BKSI


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.


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.


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.


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;

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.




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

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.


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.


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

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

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


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


4

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

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end

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.


4

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

Isso vai lhe dizer.


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 :)


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

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.


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.


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

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.


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;

0

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


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.


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.


-5

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


2
Esta é realmente uma resposta viável, já que o MySQL fecha a conexão ociosa após oito horas.
Bojan Hrnkas
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.