366 Stimmen

FEHLER 2006 (HY000): MySQL-Server hat sich verabschiedet

Ich erhalte diesen Fehler, wenn ich versuche, eine große SQL-Datei (eine große INSERT Abfrage).

mysql>  source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: *** NONE ***

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

In der Tabelle wird nichts aktualisiert. Ich habe versucht, die Tabelle/Datenbank zu löschen und rückgängig zu machen sowie MySQL neu zu starten. Keine dieser Maßnahmen löst das Problem.

Hier ist meine maximale Paketgröße:

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+

Hier ist die Dateigröße:

$ ls -s file.sql 
79512 file.sql

Wenn ich die andere Methode ausprobiere...

$ ./mysql -u root -p my_db < file.sql
Enter password: 
ERROR 2006 (HY000) at line 1: MySQL server has gone away

22voto

lesolorzanov Punkte 3335

Nur für den Fall, dass Sie Variablen überprüfen möchten, können Sie

$> mysqladmin variables -u user -p 

Dies zeigt die aktuellen Variablen an, in diesem Fall max_allowed_packet, und wie jemand in einer anderen Antwort sagte, können Sie sie vorübergehend mit

mysql> SET GLOBAL max_allowed_packet=1072731894

In meinem Fall wurde die cnf-Datei nicht berücksichtigt, und ich weiß nicht, warum, also hat der SET GLOBAL-Code wirklich geholfen.

14voto

razzed Punkte 2635

Sie können sich auch als Root (oder mit SUPER-Rechten) bei der Datenbank anmelden und Folgendes tun

set global max_allowed_packet=64*1024*1024;

erfordert auch keinen Neustart von MySQL. Beachten Sie, dass Sie Ihre my.cnf Datei, wie in anderen Lösungen beschrieben:

[mysqld]
max_allowed_packet=64M

Bestätigen Sie die Änderung, nachdem Sie MySQL neu gestartet haben:

show variables like 'max_allowed_packet';

Sie können auch die Befehlszeile verwenden, aber dazu müssen Sie möglicherweise die Start-/Stopp-Skripte aktualisieren, die möglicherweise keine Systemaktualisierungen und Patches überleben.

Wie gewünscht, füge ich hier meine eigene Antwort hinzu. Schön, dass es funktioniert!

13voto

RGA Punkte 137

Die Lösung ist die Erhöhung der Werte, die in der wait_timeout y el connect_timeout Parameter in Ihrer Optionsdatei, unter dem [mysqld] Tag.

Ich musste ein 400 MB großes Mysql-Backup wiederherstellen, und das hat bei mir funktioniert (die Werte, die ich unten verwendet habe, sind ein bisschen übertrieben, aber Sie verstehen schon):

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
set GLOBAL delayed_insert_timeout=100000

Blockquote

11voto

Sathish D Punkte 4700

Ich hatte das gleiche Problem, aber das Ändern von max_allowed_packet in der Datei my.ini/my.cnf unter [mysqld] brachte die Wende.

eine Zeile hinzufügen

max_allowed_packet=500M

Starten Sie nun den MySQL-Dienst neu, sobald Sie fertig sind.

6voto

Chris Henry Punkte 11720

Hier könnten mehrere Dinge geschehen;

  • Ihr INSERT dauert zu lange, und der Client bricht die Verbindung ab. Wenn die Verbindung wiederhergestellt wird, wird keine Datenbank ausgewählt, daher der Fehler. Eine Möglichkeit besteht darin, die Batch-Datei über die Befehlszeile auszuführen und die Datenbank in den Argumenten auszuwählen, etwa so;

$ mysql db_name < source.sql

  • Eine andere Möglichkeit ist die Ausführung des Befehls über php oder eine andere Sprache. Nach jeder lang laufenden Anweisung können Sie die Verbindung schließen und wieder öffnen, um sicherzustellen, dass Sie zu Beginn jeder Abfrage verbunden sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X