MySQL Server è andato via durante l'importazione di file sql di grandi dimensioni


259

Ho provato a importare un file sql di grandi dimensioni tramite phpMyAdmin ... Ma continuava a mostrare errori

'Il server MySql è andato via'

Cosa fare?


3
Quali sono i tuoi valori per max_allowed_packet e wait_timeout?
daemonofchaos,

1
puoi provare a raddoppiare max_allowed_packet. Un po 'rozzo, ma se funziona puoi trovare un valore sano.
Nanne,

1
Grazie per la risata Cole Johnson. È stato fantastico! LOL! :)
mbrinson,

Lo vedo spesso, per caso. Ma non riesco a riprodurre nuovamente lo stesso errore. E, quindi capito che potrebbe essere dinamico. A volte, se il client invia troppi SQL al server (ad es. Da un ciclo), ciò può accadere. Trovare il motivo effettivo di questo errore è importante. Controlla anche i log delle query per i pattern ripetitivi di SQL per scoprire gli indizi.
Bimal Poudel,

a volte si ottiene questo quando lo spazio su disco è insufficiente
pramodtech

Risposte:


376

Come indicato qui :

Due motivi più comuni (e correzioni) per il server MySQL è andato via (errore 2006) sono:

Il server è scaduto e ha chiuso la connessione. Come risolvere:

  1. controlla che la variabile wait_timeout nel file di configurazione my.cnf di mysqld sia abbastanza grande. Su Debian:, sudo nano /etc/mysql/my.cnfimposta i wait_timeout = 600secondi (puoi modificare / ridurre questo valore quando l'errore 2006 è sparito), quindi sudo /etc/init.d/mysql restart. Non ho verificato, ma il valore predefinito per wait_timeout potrebbe essere di circa 28800 secondi (8 ore).

  2. Il server ha eliminato un pacchetto errato o troppo grande. Se mysqld ottiene un pacchetto che è troppo grande o errato, presuppone che qualcosa sia andato storto con il client e chiude la connessione. È possibile aumentare il limite massimo della dimensione del pacchetto aumentando il valore di max_allowed_packet nel file my.cnf. Su Debian:, sudo nano /etc/mysql/my.cnfimpostare max_allowed_packet = 64M(è possibile modificare / ridurre questo valore quando l'errore 2006 è scomparso), quindi sudo /etc/init.d/mysql restart.

Modificare:

Nota che i file delle opzioni di MySQL non hanno i loro comandi già disponibili come commenti (come ad esempio in php.ini). Quindi, è necessario digitare alcun cambiamento / Tweak in my.cnfo my.inie metterli in mysql/datadirectory o in uno qualsiasi degli altri percorsi, sotto il corretto gruppo di opzioni come [client], [myslqd], ecc, ad esempio:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

Quindi riavviare il server. Per ottenere i loro valori, digita il client mysql:

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

72
Nel mio caso era la variabile max_allowed_packet . L'impostazione predefinita era 1 MB (lo si può vedere eseguendo la SHOW VARIABLESquery MySQL) e il file che stavo importando aveva alcuni record molto grandi. Ho aperto il file my.ini (stavo eseguendo Windows) e ho impostato il valore su questo: ho max_allowed_packet = 64Mriavviato MySQL ed eseguito nuovamente l'importazione.
Brent Matzelle,

Stavo caricando file di grandi dimensioni nel database con i webissues. Questo ha aiutato, grazie ... :-)
inf3rno,

@BrentMatzelle Che certamente si è occupato del problema "Mysql è andato via". Grazie!
aprile

2
Non riesco a trovare la wait_timeoutlinea
Oki Erie Rinaldi

5
in caso di Windows (con Xampp) era il file my.ini e innodb_lock_wait_timeout
Ananda,

98

Per me questa soluzione non ha funzionato, quindi l'ho eseguita

SET GLOBAL max_allowed_packet=1073741824;

nel mio client SQL.

Se non è possibile modificarlo con il servizio MYSql in esecuzione, è necessario arrestare il servizio e modificare la variabile nel file "my.ini".

Per esempio:

max_allowed_packet=20M

1
Questo ha funzionato per me su MAMP (OS X), mentre le altre risposte più popolari no. Ma è permanente?
atwixtor,

2
@atwixtor no, l'impostazione di variabili come questa funziona fino al riavvio del server. e quindi vengono ripristinati al valore predefinito.
d.raev,

1
Questo ha funzionato, su un computer XAMPP di prova su Windows ho dovuto modificare sia il php.inifile (come suggerito da @GBD nella risposta) sia il file di configurazione di MySQL my.iniper farlo funzionare.
Gruber,

2
Suggerirei di aggiungere che puoi controllare le dimensioni attuali conSHOW variables LIKE 'max_allowed_packet'
Arth

Questo non è permanente in quanto il valore verrà reimpostato al riavvio del server (eventualmente), ma non è anche solo per la sessione corrente. L'impostazione di max_allowed_packetin un client e l'importazione del .sqlfile di grandi dimensioni in un'altra sessione funzionerà correttamente.
VoteyDisciple

21

Se stai lavorando su XAMPP, puoi risolvere il problema relativo al problema del server MySQL con le seguenti modifiche:

apri il tuo file my.ini posizione my.ini è (D: \ xampp \ mysql \ bin \ my.ini)

cambia i seguenti valori variabili

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

samp per wamp, max_allowed_packet = 64M
Andrew

19

Se si esegue con valori predefiniti, si ha molto spazio per ottimizzare la configurazione di mysql.

Il primo passo che raccomando è di aumentare il max_allowed_packet a 128M.

Quindi scaricare lo script MySQL Tuning Primer ed eseguirlo. Fornirà consigli su diversi aspetti della configurazione per prestazioni migliori.

Cerca anche di regolare i valori di timeout sia in MySQL che in PHP.

Quanto è grande (dimensione del file) il file che stai importando e sei in grado di importare il file usando il client della riga di comando mysql invece di PHPMyAdmin?


Grazie, ho già impostato max_allowed_packet su 16M, poi ho trovato questa domanda e l'ho sollevata a 32M pensando che sarebbe sicuramente bastato ma poi ho visto la tua risposta e 128M sicuramente funzionava. Sto raccogliendo che l'intera istruzione SQL all'interno del file * .sql viene trattata come un solo pacchetto?
Elijah Lynn il

8

Se si utilizza MAMP su OS X, è necessario modificare il max_allowed_packetvalore nel modello per MySQL.

  1. Puoi trovarlo su: File> Modifica modello> MySQL my.cnf

  2. Quindi cerca max_allowed_packet, modifica il valore e salva.


6

Ho risolto il mio problema con questo breve file /etc/mysql/my.cnf:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
confermato che funziona anche per MySQL v5.6.12 su WAMP: su Windows, aggiungi le righe "wait_timeout" e "max_allowed_packet" sopra alla sezione [mysqld] di: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

Grazie @dan ho risolto il problema del mio vecchio anno ahah, non ho mai aggiunto quelle impostazioni nella sezione[mysqld]
shivgre

Funziona con MySQL v5.7. my-default.ini non è creato per impostazione predefinita, quindi è necessario crearlo.
Rodolfo Velasco,

5

L'altro motivo per cui ciò può accadere sta esaurendo la memoria. Controlla / var / log / messages e assicurati che my.cnf non sia impostato per causare a mysqld di allocare più memoria di quella della tua macchina.

Il tuo processo mysqld può essere effettivamente ucciso dal kernel e quindi riavviato dal processo "safe_mysqld" senza che te ne accorga.

Usa top e osserva l'allocazione di memoria mentre è in esecuzione per vedere qual è il tuo margine.

fare un backup di my.cnf prima di cambiarlo.


Questo è ciò che stava causando il mio problema. Ho aggiunto un file di scambio da 1 GB e l'ho risolto completamente.
Pikamander2,

5

Ho avuto questo errore e altri relativi, quando ho importato un file SQL da 16 GB. Per me, modificare my.ini e impostare quanto segue (in base a diversi post) nella sezione [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 stai utilizzando Windows, vai al pannello di controllo, ai servizi e guarda i dettagli di MySQL e vedrai dove si trova my.ini. Quindi, dopo aver modificato e salvato my.ini, riavvia il servizio mysql (o riavvia il computer).

Se stai usando HeidiSQL, puoi anche impostare alcuni o tutti questi usando quello.


2

Ho aggiornato "max_allowed_packet" a 1024M, ma non funzionava ancora. Si scopre che il mio script di distribuzione era in esecuzione:

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

Assicurati di specificare esplicitamente un numero maggiore dalla riga di comando se lo stai donando in questo modo.


2

Se i tuoi dati includono BLOBdati:

Si noti che un'importazione di dati dalla riga di comando sembra soffocare sui dati BLOB, causando l'errore "Il server MySQL è andato via".

Per evitarlo, ricrea il mysqldump ma con il --hex-blobflag:

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

che scriverà il file di dati con valori esadecimali anziché binari tra l'altro testo.

PhpMyAdmin ha anche l'opzione "Scarica colonne binarie in notazione esadecimale (ad esempio" abc "diventa 0x616263)" che funziona bene.

Si noti che esiste un bug di vecchia data (a dicembre 2015) che significa che le GEOMcolonne non vengono convertite: eseguire il backup di una tabella con una colonna GEOMETRY utilizzando mysqldump? pertanto l'utilizzo di un programma come PhpMyAdmin sembra essere l'unica soluzione (l'opzione indicata sopra converte correttamente le colonne GEOM).


1

Se l'operazione impiega molto tempo a fallire, ingrandire la wait_timeoutvariabile.

Se fallisce subito, ingrandire la max_allowed_packetvariabile; se continua a non funzionare, assicurati che il comando sia SQL valido. Il mio aveva citazioni senza caratteri di escape che hanno rovinato tutto.

Inoltre, se possibile, considera di limitare il numero di inserimenti di un singolo comando SQL a, diciamo, 1000. Puoi creare uno script che crea più istruzioni da uno solo reintroducendo la parte INSERT ... ogni n inserti.


1

ho riscontrato un errore simile .. per risolvere questo problema basta aprire il file my.ini..qui alla riga n. 36 modificare il valore della dimensione massima consentita del pacchetto, ad es. max_allowed_packet = 20M


1

Assicurarsi che il processo mysqld non si riavvii a causa di gestori di servizi come systemd.

Ho avuto questo problema in vagabondo con centos 7. Le modifiche alla configurazione non mi hanno aiutato. Si è scoperto che è stato systemd che ha ucciso il servizio mysqld ogni volta che ha richiesto troppa memoria.


0

Ho avuto un errore simile oggi durante la duplicazione del database (il server MySQL è andato via ...), ma quando ho provato a riavviare mysql.server riavvio ho ricevuto un errore

ERROR! The server quit without updating PID ...

Ecco come l'ho risolto: ho aperto Applicazioni / Utilità / ed eseguito Activity Monitor

 quit mysqld

quindi è stato in grado di risolvere il problema con l'errore

mysql.server restart

0

Sto facendo alcuni grandi calcoli che coinvolgono la connessione mysql per rimanere a lungo e con dati pesanti. stavo affrontando questo "problema di Mysql go away". Quindi ho provato a ottimizzare le query, ma ciò non mi ha aiutato, quindi ho aumentato il limite delle variabili mysql che è impostato su un valore inferiore per impostazione predefinita.

wait_timeout max_allowed_packet

Al limite, qualunque cosa ti si adatti, dovrebbe essere qualsiasi numero * 1024 (byte). puoi accedere al terminale usando il comando ' mysql -u username - p ' e puoi controllare e modificare questi limiti variabili.


0

Per l'hosting condiviso GoDaddy

Sugli account di hosting condiviso di GoDaddy, è difficile modificare i file PHP.ini ecc. Tuttavia, c'è un altro modo e ha funzionato perfettamente per me. (Ho appena caricato con successo un file di testo .sql da 3,8 Mb, contenente 3100 righe e 145 cols. Usando il comando IMPORT in phpMyAdmin, stavo ottenendo il temuto server MySQL è andato via errore e nessuna ulteriore informazione.)

Ho scoperto che Matt Butcher aveva la risposta giusta. Come Matt, avevo provato tutti i tipi di trucchi, dall'esportazione di database MySQL in blocchi di dimensioni ridotte, alla scrittura di script che dividevano le grandi importazioni in quelli più piccoli. Ma ecco cosa ha funzionato:

(1) CPANEL ---> FILES (gruppo) ---> BACKUP

(2a) Sotto l'intestazione "Backup parziali" ...
(2b) In "Scarica un backup del database MySQL"
(2c) Scegli il tuo database e scarica un backup (questo passaggio è facoltativo, ma saggio)

(3a) Direttamente a destra di 2b, sotto la voce "Ripristina un backup del database MySQL"
(3b) Scegli il file di importazione .SQL dall'unità locale
(3c) La vera felicità sarà tua (a breve ....) 5 secondi

Sono stato in grado di utilizzare questo metodo per importare una singola tabella. Nient'altro nel mio database è stato interessato, ma questo è il punto (2) di cui sopra per proteggere.

Note:
a. Se non si è sicuri su come creare un file di importazione .SQL, utilizzare phpMyAdmin per esportare una tabella e modificare quella struttura di file.

FONTE: Articolo di Matt Butcher 2010


Va bene, quindi un downvote immediato, ma nessun commento sul perché. Queste informazioni non hanno funzionato per qualcuno? In tal caso, ti preghiamo di condividere: ha funzionato per me, motivo per cui ho aggiunto questa risposta. Le altre risposte sopra non hanno funzionato per me, ma questa soluzione ha funzionato. Allora perché il downvote? Se sei su GoDaddy e questo non funziona per te, vorrei saperlo per poterti aiutare. Tuttavia, se non stai utilizzando l'hosting condiviso GoDaddy, perché dovresti sottovalutare questa risposta solo perché non si applica a te ?
cssyphus,

0

Se aumentare max_allowed_packetnon aiuta.

Stavo riscontrando lo stesso errore durante l'importazione di un .sqlfile nel mio database tramite Sequel Pro.

L'errore persisteva anche dopo aver aumentato il max_allowed_packetto, 512Mquindi ho eseguito l'importazione nella riga di comando invece con:

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

Ha dato il seguente errore:

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

Ho trovato un paio di utili domande su StackOverflow:

Nel mio caso, il mio .sqlfile era un po 'corrotto o qualcosa del genere. Il dump di MySQL che otteniamo viene fornito in due file zip che devono essere concatenati insieme e quindi decompressi. Penso che la decompressione sia stata inizialmente interrotta, lasciando il file con alcuni caratteri e codifiche dispari. Ottenere un nuovo dump MySQL e decomprimerlo ha funzionato correttamente per me.

Volevo solo aggiungere questo nel caso in cui altri scoprissero che aumentare la max_allowed_packetvariabile non era d'aiuto.



0

Ho avuto lo stesso problema con

$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);

Nel file \ xampp \ mysql \ bin \ my.ini di phpmyadmin otteniamo solo

[mysqldump]
max_allowed_packet=110M

che è solo per mysqldump -u root -p dbname. Ho risolto il mio problema sostituendo il codice sopra con

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.