So ändern Sie die Größe von max_allowed_packet

317

Ich habe ein Problem mit BLOB-Feldern in meiner MySQL-Datenbank. Beim Hochladen von Dateien mit einer Größe von mehr als ca. 1 MB wird eine Fehlermeldung angezeigt Packets larger than max_allowed_packet are not allowed.

Folgendes habe ich versucht:

Im MySQL Query Browser habe ich einen ausgeführt, show variables like 'max_allowed_packet'der mir 1048576 gab.

Dann führe ich die Abfrage aus, set global max_allowed_packet=33554432gefolgt von show variables like 'max_allowed_packet'- es gibt mir 33554432 wie erwartet.

Aber wenn ich den MySQL-Server neu starte, geht er auf magische Weise auf 1048576 zurück. Was mache ich hier falsch?

Bonusfrage, ist es möglich, ein BLOB-Feld zu komprimieren?

Muleskinner
quelle
1
Ein BLOB-Feld ist ein binäres großes Objekt. Es sind nur Kleinigkeiten. Also ja, Sie können den Inhalt komprimieren und es gibt andere (und hoffentlich weniger) Bits, die Sie stattdessen im BLOB-Feld speichern. Es ändert nur, welche Daten Sie eingeben. Sie müssen den BLOB-Inhalt auch dann wieder dekomprimieren, wenn Sie ihn benötigen.
Konerak
Ok, danke, hatte gehofft, dass eine in MySQL
eingebaute

Antworten:

407

Ändern Sie die Datei my.inioder ~/.my.cnf, indem Sie die einzelne Zeile unter [mysqld]oder den [client]Abschnitt in Ihre Datei aufnehmen:

max_allowed_packet=500M

Starten Sie dann den MySQL-Dienst neu und Sie sind fertig.

Weitere Informationen finden Sie in der Dokumentation .

Manuel
quelle
1
Dank scheint zu funktionieren, obwohl ich gehofft hatte, dass dies möglich wäre, ohne die INI-Dateien manuell ändern zu müssen.
Muleskinner
62
Zu Ihrer Information, dies ist auch die Lösung für den Fehler "MySQL ist verschwunden"
DJB
1
@Konerak, wer war der Verspottete?
Pacerier
14
Es erscheint ziemlich sinnlos, jemandem eine Antwort zu geben und ihm dann zu sagen, er solle bei Google nach einer Antwort suchen. Zumal SO ausnahmslos einige der Top-Ergebnisse für jede anständige programmierbezogene Frage belegt. Sprechen Sie über das Programmieren einer Endlosschleife !!! Google> SO> Google> SO> Google> SO und so weiter.
Phill Healey
5
Stellen Sie sicher, dass es unter [mysqld]und nicht [mysql](sehr ähnlich) ist. Hat mich ein paar Minuten Kopfkratzen gekostet.
Halvor Holsten Strand
225

Die Variable max_allowed_packet kann durch Ausführen einer Abfrage global festgelegt werden.

Wenn Sie es jedoch nicht in der my.iniDatei ändern (wie von dragon112 vorgeschlagen), wird der Wert beim Neustart des Servers zurückgesetzt, selbst wenn Sie ihn global festlegen.

So ändern Sie das maximal zulässige Paket für alle Benutzer auf 1 GB, bis der Server neu gestartet wird:

SET GLOBAL max_allowed_packet=1073741824;
Der Schrei
quelle
7
Nicht hilft :(. Es zeigt "Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)"
artnikpro
15
@artnikpro Es funktioniert, "Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)" könnte sich irreführend anfühlen, aber es ist richtig.
AnnTea
10
funktioniert bei mir nicht SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'zeigt immer noch alten Wert
Poma
50
Der alte Wert wird angezeigt, da sich max_allowed_packet für vorhandene Verbindungen nicht ändert. Wenn Sie die Verbindung trennen und erneut herstellen, wird der aktualisierte Wert angezeigt.
Matt Crinklaw-Vogt
2
Matt Crinklaw-Vogt hat recht. Es muss beendet und wieder verbunden werden
Makriria
89

Einer meiner Junior-Entwickler hatte ein Problem damit, dies für mich zu ändern, sodass ich dachte, ich würde dies für Linux-Benutzer detaillierter erweitern:

1) Terminal öffnen

2) ssh root @ YOURIP

3) Geben Sie das Root-Passwort ein

4) nano /etc/mysql/my.cnf (wenn der Befehl nicht erkannt wird, tun Sie dies zuerst oder versuchen Sie es mit vi und wiederholen Sie dann: yum install nano)

5) Fügen Sie im Abschnitt [MYSQLD] die Zeile hinzu: max_allowed_packet = 256M (passen Sie die Größe offensichtlich an Ihre Bedürfnisse an). Er hat den Fehler gemacht, es zuerst am Ende der Datei abzulegen, damit es nicht funktioniert.

Geben Sie hier die Bildbeschreibung ein

6) Strg + O (Speichern), dann EINGABE (Bestätigen), dann Strg + X (Datei beenden)

7) Service mysqld Neustart

8) Sie können die Änderung im Abschnitt Variablen auf phpmyadmin überprüfen

naw103
quelle
Dies wurde tatsächlich auf CentosOS6 gemacht. Ich stimme natürlich zu, dass ich keinen Root-SSH-Zugriff verwenden soll
naw103
@tamasd Einige von mir verwendete GNU / Linux-Distributionen (wie Debian 8 und CentOS 6) produzieren sudo: command not foundoder this incident will be reportedweil beide sudonicht installiert und konfiguriert wurden. Wäre es besser, diese Antwort mit Anweisungen zum ersten Einrichten zu verunreinigen sudo?
Damian Yerrick
Nicht Root-SSH ist das Problem, aber Passwort-Login ist. Ein Benutzerkonto mit sudo-Berechtigung ist fast so unsicher wie root. Verwenden Sie einfach die SSH-Schlüssel-basierte Authentifizierung.
Martin Schneider
Die Frage, wie man sich bei der Maschine anmeldet, ist OT. Er hat in seinem Rezept zu Recht angegeben, dass man sich auf die eine oder andere Weise anmelden muss.
Devsmt
41

Ich denke, einige möchten auch wissen, wie man die my.ini-Datei auf Ihrem PC findet. Für Windows-Benutzer ist der beste Weg meiner Meinung nach der folgende:

  1. Win + R (Verknüpfung für 'Ausführen'), geben Sie services.msc ein und geben Sie ein
  2. Sie könnten einen Eintrag wie 'MySQL56' finden, mit der rechten Maustaste darauf klicken und Eigenschaften auswählen
  3. Sie könnten etw wie "D: / Programme / MySQL / MySQL Server 5.6 / bin \ mysqld" sehen --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Ich habe diese Antwort von http://bugs.mysql.com/bug.php?id=68516 erhalten

fstang
quelle
2
Dies ist unter Windows wichtig. Hatte MySQL als Dienst und bearbeitete my.ini in Workbench und diese Antwort machte mir klar, dass MySQL als Dienst eine andere my.ini verwendet als die, die ich in Workbench bearbeitet habe.
Robert Niestroj
20

Nach allen Anweisungen habe ich Folgendes getan und gearbeitet:

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              20 |
+-----------------+
1 row in set (0.00 sec)

mysql> select @max_allowed_packet //Mysql do not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet; //That is better... I have max_allowed_packet=32M inside my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> **SET GLOBAL max_allowed_packet=1073741824**; //Now I'm changing the value.
Query OK, 0 rows affected (0.00 sec)

mysql> select @max_allowed_packet; //Mysql not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value. And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Wie wir sehen können, wurde das max_allowed_packet außerhalb von my.ini geändert.

Verlassen wir die Sitzung und überprüfen Sie erneut:

mysql> exit
Bye

C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              21 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value still here and And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Now I will stop the server
2016-02-03 10:28:30 - Server is stopped

mysql> SELECT CONNECTION_ID();
ERROR 2013 (HY000): Lost connection to MySQL server during query


Now I will start the server
2016-02-03 10:31:54 - Server is running


C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|               9 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The previous new value has gone. Now I see what I have inside my.ini again.
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

Fazit: Nach SET GLOBAL max_allowed_packet = 1073741824 verfügt der Server über das neue max_allowed_packet, bis es neu gestartet wird, wie bereits erwähnt.

zwitterion
quelle
13

Wenn dieser Fehler beim Durchführen einer Sicherung auftritt, max_allowed_packetkann dies my.cnfspeziell für festgelegt werden mysqldump.

[mysqldump]
max_allowed_packet=512M

Ich habe diesen Fehler immer wieder erhalten, während ich a ausgeführt habe, mysqldumpund ich habe ihn nicht verstanden, weil ich ihn my.cnfunter dem [mysqld]Abschnitt eingestellt hatte. Sobald ich herausgefunden hatte, dass ich es einstellen konnte [mysqldump]und den Wert festlegte, wurden meine Sicherungen ohne Probleme abgeschlossen.

xpros
quelle
10

Für diejenigen, die Wamp MySQL Server ausführen

Wamp Tray Icon -> MySql -> my.ini

[wampmysqld]
port        = 3306
socket      = /tmp/mysql.sock
key_buffer_size = 16M
max_allowed_packet = 16M        // --> changing this wont solve
sort_buffer_size = 512K

Scrolle bis zum Ende, bis du findest

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Fügen Sie die Zeile packet_size dazwischen hinzu

[mysqld]
port=3306
max_allowed_packet = 16M
explicit_defaults_for_timestamp = TRUE

Überprüfen Sie, ob es mit dieser Abfrage funktioniert hat

Select @@global.max_allowed_packet;
Sayka
quelle
5

Dieser Fehler tritt auf, weil Ihre Daten einen größeren als den eingestellten Wert enthalten.

Schreiben max_allowed_packed=500M Sie einfach die auf oder Sie können diese 500 * 1024k berechnen und diese anstelle von 500M verwenden, wenn Sie möchten.

Starten Sie jetzt einfach MySQL neu.

Suresh
quelle
2
bis /etc/my.cnffür MySQL-Instanz oder /etc/my.cnf.d/server.cnffür MariaDB
Evgeny Lebedev
5

Viele der Antwortenden entdeckten das Problem und gaben bereits die Lösung.

Ich möchte nur eine andere Lösung vorschlagen, bei der der Wert der Glogal-Variablen im Tool Mysql Workbench geändert wird . Dies ist natürlich der Fall, wenn Sie Workbench verwenden, das lokal auf dem Server (oder über eine SSH-Verbindung) ausgeführt wird.

Sie stellen einfach eine Verbindung zu Ihrer Instanz her und gehen zum Menü:

Server -> Optionsdatei -> Netzwerk -> max_allowed_packed

Sie legen den gewünschten Wert fest und müssen dann den MySQL-Dienst neu starten .

cnom
quelle
4

Für alle, die MySQL auf dem Amazon RDS-Dienst ausführen, erfolgt diese Änderung über Parametergruppen . Sie müssen ein neues PG erstellen oder ein vorhandenes verwenden (außer dem Standard, der schreibgeschützt ist).

Sie sollten nach dem max_allowed_packetParameter suchen , seinen Wert ändern und dann auf Speichern klicken.

Wenn Sie in Ihrer MySQL-Instanz ein neues PG erstellt haben, sollten Sie das PG an Ihre Instanz anhängen (möglicherweise müssen Sie neu starten). Wenn Sie ein PG geändert haben, das bereits an Ihre Instanz angehängt war, werden Änderungen ohne Neustart auf alle Ihre Instanzen angewendet, an die dieses PG angehängt ist.

SebaGra
quelle
0

Wenn Sie große Bilder oder Daten in die Datenbank hochladen möchten. Ändern Sie einfach den Datentyp in 'BIG BLOB'.

Vishal J.
quelle
0

set global max_allowed_packet = 10000000000;

Vishal Sheth
quelle