Errore MySQL 2006: il server mysql è andato via


238

Sto eseguendo un server nel mio ufficio per elaborare alcuni file e segnalare i risultati a un server MySQL remoto.

L'elaborazione dei file richiede del tempo e il processo si interrompe a metà con il seguente errore:

2006, MySQL server has gone away

Ho sentito parlare dell'impostazione di MySQL, wait_timeout , ma devo cambiarlo sul server nel mio ufficio o sul server MySQL remoto?


2
dipende da quel server delle streghe che dà l'errore
bksi,


11
Per le persone che arrivano qui da Google: se la modifica delle max_allowed_packetdimensioni o della wait_timeoutquantità non lo risolve, controlla l'utilizzo della memoria. Stavo ottenendo lo stesso errore ed era causato dal fatto che il mio server stava esaurendo la memoria. Ho aggiunto un file di scambio da 1 GB e risolto il problema.
Pikamander2,

2
@ Pikamander2 grazie per il suggerimento!
Ihsan,

4
Oh! Quindi sono tutte bugie? Il server Mysql in realtà non è andato da nessuna parte? È ancora lì nel mio server? Whao! :))
Damilola Olowookere il

Risposte:


32

Potrebbe essere più facile controllare se la connessione e ristabilirla se necessario.

Vedi PHP: mysqli_ping per informazioni al riguardo.


Buon punto, se hai un processo intermittente, allora è meglio rilasciare la connessione in modo da non esaurire tutte le connessioni. Ricostruire la connessione è generalmente economico. +1
Yzmir Ramirez,

1
nel 2018: mysqli_ping è deprecato
fb

@fb cosa serve per farlo con il DOP?
beppe9000,

359

L'ho riscontrato diverse volte e di solito ho trovato la risposta come impostazione predefinita molto bassa max_allowed_packet .

Sollevandolo in /etc/my.cnf(sotto [mysqld]) a 8 o 16 M di solito lo risolve. (L'impostazione predefinita in MySql 5.7 è 4194304, che è 4 MB.)

[mysqld]
max_allowed_packet=16M

Nota: basta creare la linea se non esiste

Nota: questo può essere impostato sul server mentre è in esecuzione.

Usa set global max_allowed_packet=104857600. Questo lo imposta su 100 MB.


28
Nota che questo può essere impostato sul tuo server mentre è in esecuzione. Utilizzare: "set global max_allowed_packet = 104857600". NOTA: il mio valore lo imposta su 100 MB.
rickumali,

26
Per gli utenti di xampp, my.cnf è disponibile all'indirizzo: C: \ xampp \ mysql \ bin \
Valentin Despa

3
su WAMP: C: \ wamp \ bin \ mysql \ mysql5.6.12 \ my.ini, imposta max_allowed_packet = 500M in [wampmysqld]
Elia Weiss

2
Risolto anche il mio problema :)
Altaf Hussain il

2
Nota importante: ho dovuto riavviare il mio server mysql per rendere effettivo questo effetto. cioè mysql.server stop, mysql.server start(ottobre 2018, MySQL v5.7, MacOS)
Nitin Nain,

41

Ho avuto lo stesso problema ma ho cambiato max_allowed_packetil my.ini/my.cnffile sotto[mysqld] reso il trucco.

aggiungi una linea

max_allowed_packet = 500M

ora restart the MySQL serviceuna volta che hai finito.


5
L'altro ragazzo ha scritto 16M, tu scrivi 500M, qual è il significato di questa impostazione?
pal4life

1
@ pal4life È la dimensione massima consentita per le istruzioni di inserimento. Che cosa succede se la tua istruzione insert è superiore a 16 M (se l'istruzione è composta da colonne longblob o giù di lì) Per essere su un lato più sicuro, rendila enorme come 500 M se stai inserendo un'enorme quantità di dati.
Sathish D,

Questo ha funzionato per me, ma non so perché. Il valore predefinito era 1M ma quando l'ho cambiato in 100M l'errore è andato via. Il problema è iniziato quando ho impostato wait_timeout = 30 nel tentativo di ridurre il numero di thread inattivi sul mio server.
Vincent,

36

Ho usato il seguente comando nella riga di comando di MySQL per ripristinare un database MySQL che misura più di 7 GB e funziona.

set global max_allowed_packet=268435456;

chiedo perché questo è stato downvoted? ha senso che l'errore sia correlato alla dimensione del pacchetto ...
FlorinelChis

Ciò ha risolto il mio problema, non è collegato alla domanda in modo diretto ma dovrebbe aiutare le persone ad avere questo altro problema.
Migerusantte,

Per verificare se modificato o visualizzare il valore corrente si può usareshow variables like 'max_allowed_packet';
Marcin

16

Errore: 2006 ( CR_SERVER_GONE_ERROR )

Messaggio: il server MySQL è andato via

In genere puoi riprovare a connetterti e quindi a ripetere la query per risolvere questo problema: prova 3-4 volte prima di rinunciare completamente.

Presumo che tu stia usando DOP. In tal caso, dovresti rilevare l'eccezione DOP, incrementare un contatore e quindi riprovare se il contatore è al di sotto di una soglia.

Se si dispone di una query che causa un timeout, è possibile impostare questa variabile eseguendo:

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

Dove 300 è il numero di secondi che ritieni sia il tempo massimo che la query potrebbe richiedere.

Ulteriori informazioni su come gestire i problemi di connessione Mysql.

EDIT: altre due impostazioni che potresti voler usare sono net_write_timeoute net_read_timeout.


16

In MAMP (versione non pro) ho aggiunto

--max_allowed_packet=268435456

per ...\MAMP\bin\startMysql.sh

Crediti e maggiori dettagli qui


Grazie mille per questo!
TechyDude,

Lavori! Grazie!
Simon Franzen,


11

Esistono diverse cause per questo errore.

Relativo a MySQL / MariaDB:

  • wait_timeout - Tempo in secondi che il server attende che una connessione diventi attiva prima di chiuderla.
  • interactive_timeout - Tempo in secondi che il server attende una connessione interattiva.
  • max_allowed_packet- Dimensione massima in byte di un pacchetto o di una stringa generata / intermedia. Imposta come il BLOB più grande, in multipli di 1024.

Esempio di my.cnf :

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

Relativo al server:

  • Il tuo server ha memoria piena: controlla le informazioni sulla RAM con free -h

Relativo al quadro:

  • Controlla le impostazioni del tuo framework. Django ad esempio usa CONN_MAX_AGE(vedi documenti )

Come eseguire il debug:

  • Controlla i valori delle variabili MySQL / MariaDB.
    • con sql: SHOW VARIABLES LIKE '%time%';
    • riga di comando: mysqladmin variables
  • Attiva verbosità per errori:
    • MariaDB: log_warnings = 4
    • MySQL: log_error_verbosity = 3
  • Consulta i documenti per ulteriori informazioni sull'errore

9

Su Windows quei ragazzi che usano xampp dovrebbero usare questo percorso xampp / mysql / bin / my.ini e cambiare max_allowed_packet (sotto la sezione [mysqld]) in base alle dimensioni scelte. per esempio

max_allowed_packet=8M

Ancora su php.ini (xampp / php / php.ini) cambia upload_max_filesize la dimensione scelta. per esempio

upload_max_filesize=8M

Mi ha fatto venire il mal di testa per un po 'finché non l'ho scoperto. Spero che sia d'aiuto.


questa dovrebbe essere la risposta scelta
bysanchy il

Non riesco a trovare la upload_max_filesizevariabile. Viene sempre non riconosciuto nel mio mysql
Aminah Nuraini il

9

Stavo ottenendo lo stesso errore sul mio server Ubuntu DigitalOcean.

Ho provato a modificare max_allowed_packet e wait_timeout, ma nessuno dei due ha risolto il problema.

Si scopre che il mio server era senza RAM. Ho aggiunto un file di scambio da 1 GB e questo ha risolto il mio problema.

Controlla la tua memoria con free -hper vedere se questo è ciò che lo sta causando.


1
Grazie mille! Ho avuto lo stesso problema sul mio DigitalOcean e questa soluzione ha funzionato! Ho eseguito molte istanze del mio script, ma dopo alcuni thread si è interrotto improvvisamente e ha ucciso tutte le connessioni esistenti. Adesso va tutto bene.
Stalinko,

7

È stato un problema di RAM per me.

Stavo riscontrando lo stesso problema anche su un server con 12 core della CPU e 32 GB di RAM. Ho fatto ulteriori ricerche e ho provato a liberare la RAM. Ecco il comando che ho usato su Ubuntu 14.04 per liberare la RAM:

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

E ha risolto tutto. L'ho impostato su cron per l'esecuzione ogni ora.

crontab -e

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

E puoi usare questo comando per verificare quanta RAM libera disponibile:

free -h

E otterrai qualcosa del genere:

             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

Nel mio caso era un valore basso di open_files_limit variabile, che bloccava l'accesso di mysqld ai file di dati.

L'ho controllato con:

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

Dopo aver modificato la variabile in grande valore, il nostro server era di nuovo attivo:

[mysqld]
open_files_limit = 100000

5

Se stai utilizzando 64 bit WAMPSERVER, cerca più occorrenze di max_allowed_packet perché WAMP utilizza il valore impostato in [wampmysqld64] e non il valore impostato in [mysqldump], che per me era il problema, stavo aggiornando quello sbagliato. Impostalo su qualcosa come max_allowed_packet = 64M.

Speriamo che questo aiuti altri utenti Wampserver là fuori.


5

Questo generalmente indica problemi di connettività del server MySQL o timeout. In genere può essere risolto modificando wait_timeout e max_allowed_packet in my.cnf o simili.

Vorrei suggerire questi valori:

wait_timeout = 28800

max_allowed_packet = 8M


4

Per Vagrant Box, assicurati di allocare memoria sufficiente per il box

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

1
Grazie per questo :)
SynackSA

4

Lo scenario improbabile è che tu abbia un firewall tra il client e il server che impone il reset TCP nella connessione.

Ho avuto questo problema e ho scoperto che il nostro firewall F5 aziendale era configurato per terminare sessioni inattive che sono inattive per più di 5 minuti.

Ancora una volta, questo è lo scenario improbabile.


4

È sempre una buona idea controllare i log del server Mysql, per il motivo per cui è andato via.

Te lo dirà.


4

Se si utilizza il server xampp:

Vai su xampp -> mysql -> bin -> my.ini

Modifica sotto il parametro:

max_allowed_packet = 500M

innodb_log_file_size = 128M

Questo mi ha aiutato molto :)


3

decommenta le linee sottostanti nella tua my.ini/my.cnf, questo dividerà il tuo file di grandi dimensioni in una porzione più piccola

# binary logging format - mixed recommended
# binlog_format=mixed

PER

# binary logging format - mixed recommended
binlog_format=mixed

3

Ho trovato la soluzione a "# 2006 - Il server MySQL è andato via" questo errore. La soluzione è solo che devi controllare due file

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

Il percorso di questi file in Windows è

C:\wamp64\apps\phpmyadmin4.6.4

In questi due file il valore di questo:

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

Nel mio caso era:

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

cambiarlo in:

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

Assicurati in entrambi:

  1. config.inc.php
  2. file config.sample.inc.php deve essere 'localhost'.

E l'ultimo set:

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

Quindi riavviare Wampserver.


Per modificare il nome utente e la password di phpmyadmin

È possibile modificare direttamente il nome utente e la password di phpmyadmin tramite il file config.inc.php

Queste due linee

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

Qui puoi dare un nuovo nome utente e password. Dopo le modifiche, salvare il file e riavviare il server WAMP.


2

Ho ricevuto il messaggio Errore 2006 in diversi software client MySQL sul mio desktop Ubuntu. Si è scoperto che la versione del mio driver JDBC era troppo vecchia.


2

Questo potrebbe essere un problema delle dimensioni del tuo file .sql.

Se stai usando xampp. Vai al pannello di controllo xampp -> Fai clic su MySql config -> Apri my.ini.

Aumenta la dimensione del pacchetto.

max_allowed_packet = 2M -> 10M

2

C'è un modo più semplice se stai usando XAMPP. Apri il pannello di controllo XAMPP e fai clic sul pulsante di configurazione nella sezione mysql.
inserisci qui la descrizione dell'immagine

Ora fai clic su my.ini e si aprirà nell'editor. Aggiorna il max_allowed_packet alla dimensione richiesta.

inserisci qui la descrizione dell'immagine

Quindi riavviare il servizio mysql. Fare clic su stop nel servizio Mysql fare clic su Avvia di nuovo. Aspetta qualche minuto. inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Quindi provare a eseguire nuovamente la query Mysql. Spero che funzioni.


2

MAMP 5.3, non troverai my.cnf e aggiungerli non funziona in quanto max_allowed_packet è memorizzato in variabili.

Una soluzione può essere:

  1. Vai a http: // localhost / phpmyadmin
  2. Vai alla scheda SQL
  3. Eseguire SHOW VARIABLES e verificare i valori, se è piccolo, quindi eseguire con valori grandi
  4. Esegui la seguente query, imposta max_allowed_packet su 7 GB:

    set global max_allowed_packet = 268435456;

Per alcuni, potrebbe essere necessario aumentare anche i seguenti valori:

set global wait_timeout = 600;
set innodb_log_file_size =268435456;

0

Per gli utenti che utilizzano XAMPP, ci sono 2 parametri max_allowed_packet in C: \ xampp \ mysql \ bin \ my.ini.


0

Questo errore si verifica sostanzialmente per due motivi.

  1. Hai una RAM troppo bassa.
  2. La connessione al database viene chiusa quando si tenta di connettersi.

Puoi provare questo codice qui sotto.

# 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()

Riduce l'errore qualunque sia la ragione che sta dietro, specialmente per la seconda ragione.

Se è causato da poca RAM, è necessario aumentare l'efficienza della connessione al database dal codice, dalla configurazione del database o semplicemente aumentare la RAM.


0

Nel caso in cui ciò aiuti chiunque:

Ho avuto questo errore quando ho aperto e chiuso le connessioni in una funzione che sarebbe stata chiamata da diverse parti dell'applicazione. Abbiamo troppe connessioni, quindi abbiamo pensato che fosse una buona idea riutilizzare la connessione esistente o buttarla via e crearne una nuova in questo modo:

  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 ($ database, $ host, $ user, $ password); } return self :: $ instance; } Bene, risulta che siamo stati un po 'troppo scrupolosi con l'uccisione e quindi i processi che fanno cose importanti sulla vecchia connessione non potrebbero mai finire i loro affari. Quindi abbiamo lasciato cadere queste righe

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

e poiché l'hardware e l'installazione della macchina lo consentono, abbiamo aggiunto il numero di connessioni consentite sul server

max_connections = 500

al nostro file di configurazione. Questo ha risolto il nostro problema per ora e abbiamo imparato qualcosa sull'uccisione delle connessioni mysql.


-5

Se sai che stai andando offline per un po ', puoi chiudere la connessione, eseguire l'elaborazione, riconnetterti e scrivere i tuoi rapporti.


2
Questa è in realtà una risposta praticabile, poiché MySQL chiude la connessione inattiva dopo otto ore.
Bojan Hrnkas,
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.