O servidor MySQL desapareceu ao importar arquivos sql grandes


259

Tentei importar um arquivo sql grande através do phpMyAdmin ... Mas ele continuava mostrando erro

'Servidor MySQL desapareceu'

O que fazer?


3
Quais são os seus valores para max_allowed_packet e wait_timeout?
Daemonofchaos 14/09/12

1
você pode tentar dobrar max_allowed_packet. Um pouco bruto, mas se isso funcionar, você pode encontrar um valor sensato.
Nanne 14/09/12

1
Obrigado pela risada Cole Johnson. Isso foi demais! RI MUITO! :)
mbrinson

Vejo isso frequentemente, por acaso. Mas não consigo reproduzir o mesmo erro novamente. E, portanto, percebi que poderia ser dinâmico. Às vezes, se o cliente envia muitos SQLs para o servidor (por exemplo, de um loop), isso pode acontecer. É importante encontrar o motivo real desse erro. Verifique também os logs de consulta para verificar padrões repetidos de SQLs para descobrir as dicas.
Bimal Poudel 02/09/14

às vezes você recebe isso quando o seu espaço em disco é baixa
pramodtech

Respostas:


376

Como indicado aqui :

Dois motivos mais comuns (e correções) para o servidor MySQL desapareceram (erro 2006):

O tempo limite do servidor expirou e fechou a conexão. Como consertar:

  1. verifique se a variável wait_timeout no arquivo de configuração my.cnf do mysqld é grande o suficiente. No Debian:, sudo nano /etc/mysql/my.cnfdefina wait_timeout = 600segundos (você pode ajustar / diminuir esse valor quando o erro 2006 acabar), então sudo /etc/init.d/mysql restart. Não verifiquei, mas o valor padrão para wait_timeout pode estar em torno de 28800 segundos (8 horas).

  2. O servidor descartou um pacote incorreto ou muito grande. Se o mysqld obtiver um pacote muito grande ou incorreto, ele assume que algo deu errado com o cliente e fecha a conexão. Você pode aumentar o limite máximo de tamanho do pacote aumentando o valor de max_allowed_packet no arquivo my.cnf. No Debian:, sudo nano /etc/mysql/my.cnfconfigure max_allowed_packet = 64M(você pode ajustar / diminuir esse valor quando o erro 2006 se for), então sudo /etc/init.d/mysql restart.

Editar:

Observe que os arquivos de opções do MySQL ainda não têm seus comandos disponíveis como comentários (como no php.ini por exemplo). Então você deve digitar qualquer alteração / emenda em my.cnfou my.inie colocá-los no mysql/datadiretório ou em qualquer um dos outros caminhos, sob o grupo adequado de opções, tais como [client], [myslqd], etc. Por exemplo:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

Em seguida, reinicie o servidor. Para obter seus valores, digite o cliente mysql:

> select @@wait_timeout;
> select @@max_allowed_packet;

72
No meu caso, era a variável max_allowed_packet . Foi definido como um padrão de 1 MB (você pode ver isso executando a SHOW VARIABLESconsulta MySQL) e o arquivo que estava importando tinha alguns registros muito grandes. Abri o arquivo my.ini (eu estava executando o Windows) e configurei o valor para isto max_allowed_packet = 64M:, reiniciei o MySQL e executei novamente a importação.
Brent Matzelle #

Eu estava carregando arquivos grandes no banco de dados com webissues. Isso ajudou, obrigado ... :-)
inf3rno

@BrentMatzelle Isso certamente resolveu o problema "Mysql foi embora". Obrigado!
Asprin

2
Não consigo encontrar a wait_timeoutlinha
Oki Erie Rinaldi

5
No caso do Windows (com Xampp) era arquivo my.ini e innodb_lock_wait_timeout
Ananda

98

Para mim, essa solução não deu certo, então eu executei

SET GLOBAL max_allowed_packet=1073741824;

no meu cliente SQL.

Se não conseguir alterar isso com o serviço MYSql em execução, você deve interromper o serviço e alterar a variável no arquivo "my.ini".

Por exemplo:

max_allowed_packet=20M

1
Isso funcionou para mim no MAMP (OS X) quando as outras respostas mais populares não. Mas é permanente?
Atwixtor

2
@atwixtor no, definir variáveis ​​como esta funciona até o servidor ser reiniciado. e então eles são redefinidos para o valor padrão.
precisa saber é

1
Isso fez o truque, em uma máquina XAMPP de teste no Windows, tive que modificar o php.iniarquivo (como sugerido por @GBD na resposta) e o arquivo de configuração do MySQL my.inipara fazê-lo funcionar.
Gruber

2
Eu sugiro acrescentando que você pode verificar o tamanho atual comSHOW variables LIKE 'max_allowed_packet'
Arth

Isso não é permanente , pois o valor será redefinido quando o servidor reiniciar (eventualmente), mas também não é apenas para a sessão atual. Definir o max_allowed_packetcliente em um e importar o .sqlarquivo grande em outra sessão funcionará bem.
usar o seguinte código

21

Se você estiver trabalhando no XAMPP, poderá corrigir o problema do MySQL Server com as seguintes alterações.

abra o arquivo my.ini A localização do my.ini é (D: \ xampp \ mysql \ bin \ my.ini)

altere os seguintes valores de variável

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

samp para wamp, max_allowed_packet = 64M
Andrew

19

Se você estiver executando com valores padrão, terá muito espaço para otimizar sua configuração do mysql.

O primeiro passo que eu recomendo é aumentar o max_allowed_packet para 128M.

Faça o download do script MySQL Tuning Primer e execute-o. Ele fornecerá recomendações para várias facetas da sua configuração para melhor desempenho.

Também procure ajustar seus valores de tempo limite no MySQL e PHP.

Qual é o tamanho do arquivo que você está importando e é possível importar o arquivo usando o cliente de linha de comando mysql em vez do PHPMyAdmin?


Obrigado, eu já tinha o max_allowed_packet definido como 16M, depois encontrei esta pergunta e a levantei para 32M pensando que certamente seria suficiente, mas então vi sua resposta e 128M definitivamente funciona. Estou percebendo que toda a instrução SQL dentro do arquivo * .sql é tratada como apenas um pacote?
Elias Lynn

8

Se você estiver usando o MAMP no OS X, precisará alterar o max_allowed_packetvalor no modelo para MySQL.

  1. Você pode encontrá-lo em: Arquivo> Editar modelo> MySQL my.cnf

  2. Em seguida, basta procurar max_allowed_packet, alterar o valor e salvar.


6

Resolvi meu problema com este pequeno arquivo /etc/mysql/my.cnf:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
confirmou que isso também funciona para o MySQL v5.6.12 no WAMP: no Windows, adicione as linhas "wait_timeout" e "max_allowed_packet" acima na seção [mysqld] de: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

Graças @ Dan resolveu o meu problema de anos haha, eu nunca adicionado essas configurações ao abrigo da secção[mysqld]
shivgre

Isso funciona para o MySQL v5.7. my-default.ini não é criado por padrão, então você precisa criá-lo.
Rodolfo Velasco

5

A outra razão pela qual isso pode acontecer está ficando sem memória. Verifique / var / log / messages e certifique-se de que o my.cnf não esteja configurado para fazer com que o mysqld aloque mais memória do que a sua máquina.

Seu processo mysqld pode realmente ser morto pelo kernel e depois reiniciado pelo processo "safe_mysqld" sem você perceber.

Use top e observe a alocação de memória enquanto ela está em execução para ver qual é o seu espaço livre.

faça um backup do my.cnf antes de alterá-lo.


Isto é o que estava causando o meu problema. Eu adicionei um arquivo de troca de 1 GB e ele foi completamente corrigido.
Pikamander2

5

Eu tive esse erro e outros relacionados, quando importei no arquivo SQL de 16 GB. Para mim, editando o my.ini e definindo o seguinte (com base em várias postagens diferentes) na seção [mysqld]:

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

Se você estiver executando no Windows, acesse o painel de controle, serviços e veja os detalhes do MySQL e verá onde está o my.ini. Depois de editar e salvar o my.ini, reinicie o serviço mysql (ou reinicie o computador).

Se você estiver usando o HeidiSQL, também poderá definir alguns ou todos eles usando isso.


2

Atualizei "max_allowed_packet" para 1024M, mas ele ainda não estava funcionando. Acontece que meu script de implantação estava em execução:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

Certifique-se de especificar explicitamente um número maior na linha de comando, se você o estiver usando dessa maneira.


2

Se seus dados incluem BLOBdados:

Observe que uma importação de dados da linha de comando parece obstruir os dados do BLOB, resultando no erro 'O servidor MySQL se foi'.

Para evitar isso, recrie o mysqldump, mas com a --hex-blobbandeira:

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

que gravará o arquivo de dados com valores hexadecimais, em vez de binários, entre outros textos.

O PhpMyAdmin também tem a opção "Despejar colunas binárias em notação hexadecimal (por exemplo," abc "torna-se 0x616263)", que funciona bem.

Observe que há um bug de longa data (em dezembro de 2015), o que significa que as GEOMcolunas não são convertidas: Faça backup de uma tabela com uma coluna GEOMETRY usando o mysqldump? portanto, usar um programa como o PhpMyAdmin parece ser a única solução alternativa (a opção mencionada acima converte corretamente as colunas GEOM).


1

Se levar muito tempo para falhar, aumente o wait_timeout variável.

Se falhar imediatamente, amplie a max_allowed_packetvariável; Se ainda não funcionar, verifique se o comando é SQL válido. A minha tinha citações em fuga que estragaram tudo.

Além disso, se possível, considere limitar o número de inserções de um único comando SQL para, digamos, 1000. Você pode criar um script que crie várias instruções a partir de uma única, reintroduzindo a parte INSERT ... a cada n inserção.


1

Eu recebi um erro semelhante. Para resolver isso, basta abrir o arquivo my.ini. Aqui na linha 36, ​​altere o valor do tamanho máximo permitido do pacote, ou seja. max_allowed_packet = 20M


1

Certifique-se de que o processo mysqld não seja reiniciado devido a gerenciadores de serviços como systemd.

Eu tive esse problema em vagrant com centos 7. Os ajustes de configuração não ajudaram. Acontece que era o systemd que matava o serviço mysqld toda vez que consumia muita memória.


0

Hoje tive um erro semelhante ao duplicar o banco de dados (o servidor MySQL desapareceu ...), mas quando tentei reiniciar o mysql.server, obtive um erro

ERROR! The server quit without updating PID ...

Foi assim que resolvi: abri Aplicativos / Utilitários / e executei o Activity Monitor

 quit mysqld

foi capaz de resolver o problema do erro com

mysql.server restart

0

Estou fazendo alguns cálculos grandes que envolvem a conexão mysql para ficar muito tempo e com dados pesados. Eu estava enfrentando este "Mysql ir embora". Então eu tentei otimizar as consultas, mas isso não me ajudou, então eu aumentei o limite de variáveis ​​mysql, que é definido como um valor mais baixo por padrão.

wait_timeout max_allowed_packet

Até o limite que mais lhe convém, deve ser o Qualquer número * 1024 (bytes). você pode fazer login no terminal usando o comando ' mysql -u nome de usuário - p ' e pode verificar e alterar esses limites de variáveis.


0

Para hospedagem compartilhada GoDaddy

Nas contas de hospedagem compartilhada do GoDaddy, é complicado ajustar os arquivos PHP.ini etc. No entanto, existe outra maneira e funcionou perfeitamente para mim. (Acabei de carregar com êxito um arquivo de texto de 3.8Mb .sql, contendo 3100 linhas e 145 cols. Usando o comando IMPORT no phpMyAdmin, estava obtendo que o temido servidor MySQL desaparecesse e não há mais informações.)

Eu descobri que Matt Butcher tinha a resposta certa. Como Matt, eu havia tentado todos os tipos de truques, desde a exportação de bancos de dados MySQL em pedaços pequenos até a criação de scripts que dividem grandes importações em menores. Mas aqui está o que funcionou:

(1) CPANEL ---> ARQUIVOS (grupo) ---> BACKUP

(2a) Sob o título "Parcial Backups" ...
(2b) Em "Download a MySQL Database Backup"
(2c) Escolha seu banco de dados e faça o download de um backup (esta etapa é opcional, mas recomendável)

(3a) Diretamente à direita de 2b, sob o título "Restaurar um backup do banco de dados MySQL"
(3b) Escolha o arquivo de importação .SQL da unidade local
(3c) A verdadeira felicidade será sua (em breve ....) A minha demora 5 segundos

Consegui usar esse método para importar uma única tabela. Nada mais no meu banco de dados foi afetado - mas é contra isso que a etapa (2) acima se destina a proteger.

Notas:
a. Se você não tiver certeza de como criar um arquivo de importação .SQL, use o phpMyAdmin para exportar uma tabela e modificar a estrutura do arquivo.

FONTE: Artigo de Matt Butcher 2010


Ok, então um voto negativo imediato, mas nenhum comentário sobre o porquê. Esta informação não funcionou para alguém? Nesse caso, compartilhe - funcionou para mim, e foi por isso que adicionei esta resposta. As outras respostas acima não funcionaram para mim, mas esta solução funcionou. Então, por que o voto negativo? Se você estiver no GoDaddy e isso não funcionar, gostaria de saber para poder ajudar. No entanto, se você não estiver usando a hospedagem compartilhada do GoDaddy, por que você recusaria esta resposta apenas porque ela não se aplica a você ?
Cssyphus

0

Se aumentar max_allowed_packetnão ajuda.

Eu estava recebendo o mesmo erro que você ao importar um .sqlarquivo para o meu banco de dados via Sequel Pro.

O erro ainda persistiu após levantar o max_allowed_packetque 512Mentão eu corri a importação na linha de comando em vez de:

mysql --verbose -u root -p DatabaseName < MySQL.sql

Ele deu o seguinte erro:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

Encontrei algumas perguntas úteis sobre o StackOverflow:

No meu caso, meu .sqlarquivo estava um pouco corrompido ou algo assim. O dump do MySQL que obtemos vem em dois arquivos zip que precisam ser concatenados juntos e depois descompactados. Acho que o descompactação foi interrompido inicialmente, deixando o arquivo com alguns caracteres e codificações estranhos. Obter um novo despejo do MySQL e descompactá-lo funcionou corretamente para mim.

Só queria adicionar isso aqui caso outras pessoas achem que aumentar a max_allowed_packetvariável não estava ajudando.



0

Eu tenho o mesmo problema com

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

No arquivo \ xampp \ mysql \ bin \ my.ini do phpmyadmin, obtemos apenas

[mysqldump]
max_allowed_packet=110M

que é apenas para o mysqldump -u root -p dbname. Resolvi meu problema substituindo o código acima por

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
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.