Jak zmienić maksymalny rozmiar pakietu

317

Mam problem z polami BLOB w mojej bazie danych MySQL - podczas przesyłania plików większych niż około 1 MB pojawia się błąd Packets larger than max_allowed_packet are not allowed.

Oto, co próbowałem:

W przeglądarce zapytań MySQL uruchomiłem aplikację, show variables like 'max_allowed_packet'która dała mi 1048576.

Następnie wykonuję zapytanie, set global max_allowed_packet=33554432a następnie show variables like 'max_allowed_packet'- daje mi 33554432 zgodnie z oczekiwaniami.

Ale kiedy ponownie uruchamiam serwer MySQL, magicznie wraca do 1048576. Co robię tutaj źle?

Pytanie bonusowe, czy można skompresować pole BLOB?

Muleskinner
źródło
1
Pole BLOB to duży obiekt binarny. To tylko kawałki. Więc tak, możesz kompresować zawartość, a to daje inne (i mam nadzieję, mniej) bity, które przechowujesz zamiast tego w polu BLOB. Po prostu zmienia to, jakie dane w nim umieścisz. Będziesz musiał również zdekompresować zawartość BLOB, gdy będziesz jej ponownie potrzebować.
Konerak,
Ok, dzięki, miałem nadzieję, że istnieje funkcja kompresji wbudowana w mysql
Muleskinner,

Odpowiedzi:

407

Zmień plik my.inilub, ~/.my.cnfdołączając do pliku pojedynczą linię pod [mysqld]lub [client]sekcję:

max_allowed_packet=500M

następnie uruchom ponownie usługę MySQL i gotowe.

Więcej informacji znajduje się w dokumentacji .

Manuel
źródło
1
Wydaje się, że dzięki działają, chociaż miałem nadzieję, że będzie to możliwe bez konieczności ręcznej modyfikacji plików INI.
Muleskinner,
63
Czytelnicy FYI, jest to również rozwiązanie błędu „MySQL odszedł”
djb
1
@Konerak, Kto był drwiną?
Pacerier
14
Wydaje się raczej bezcelowe udzielanie komuś odpowiedzi, a następnie mówienie, że powinna udać się do Google w celu uzyskania odpowiedzi. Zwłaszcza, że ​​SO zajmuje niezmiennie kilka najlepszych wyników dla każdego przyzwoitego pytania związanego z programowaniem. Mów o programowaniu nieskończonej pętli !!! Google> SO> Google> SO> Google> SO i tak dalej.
Phill Healey
5
Upewnij się, że jest pod [mysqld]i nie [mysql](bardzo podobny). Kosztowało mnie kilka minut drapania głowy.
Halvor Holsten Strand
225

Max_allowed_packet zmienną można ustawić globalnie uruchamiając zapytania.

Jeśli jednak nie zmienisz go w my.inipliku (jak sugeruje dragon112), wartość zostanie zresetowana po ponownym uruchomieniu serwera, nawet jeśli ustawisz go globalnie.

Aby zmienić maksymalny dozwolony pakiet dla wszystkich użytkowników na 1 GB, dopóki serwer nie uruchomi się ponownie:

SET GLOBAL max_allowed_packet=1073741824;
TehShrike
źródło
7
Nie pomaga :(. Wyświetla „Zapytanie OK, dotyczy 0 wierszy (0,00 s)”
artnikpro
15
@artnikpro To działa, „Zapytanie OK, wpływ na 0 wierszy (0,00 s)” może wydawać się mylące, ale ma rację.
AnnTea
10
nie działa dla mnie SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'wciąż pokazuje starą wartość
Poma
50
Pokazuje starą wartość, ponieważ max_allowed_packet nie zmienia się dla istniejących połączeń. Po rozłączeniu i ponownym połączeniu zobaczysz zaktualizowaną wartość.
Matt Crinklaw-Vogt
2
Matt Crinklaw-Vogt ma rację. Musi wyjść i połączyć się ponownie
makriria
89

Jeden z moich młodszych programistów miał problem ze zmodyfikowaniem tego, więc pomyślałem, że rozwinę to bardziej szczegółowo dla użytkowników Linuksa:

1) otwarty terminal

2) root ssh @ YOURIP

3) wprowadź hasło roota

4) nano /etc/mysql/my.cnf (jeśli polecenie nie zostanie rozpoznane, zrób to najpierw lub spróbuj vi, a następnie powtórz: yum install nano)

5) dodaj wiersz: max_allowed_packet = 256M (oczywiście dostosuj rozmiar do wszystkiego, czego potrzebujesz) w sekcji [MYSQLD]. Popełnił błąd, umieszczając go najpierw na dole pliku, aby nie działał.

wprowadź opis zdjęcia tutaj

6) Control + O (zapisz), następnie ENTER (potwierdź), a następnie Control + X (zamknij plik)

7) usługa mysqld restart

8) Możesz sprawdzić zmianę w sekcji zmiennych na phpmyadmin

naw103
źródło
tak naprawdę zrobiono to na CentosOS6, oczywiście zgadzam się, że nie używam dostępu root ssh
naw103
@tamasd Kilka dystrybucji GNU / Linux, z których korzystałem (takich jak Debian 8 i CentOS 6) produkuje sudo: command not foundlub this incident will be reportedponieważ albo sudonie zostało zainstalowane i skonfigurowane. Czy lepiej byłoby zaśmiecić tę odpowiedź instrukcjami dotyczącymi konfiguracji sudopo raz pierwszy?
Damian Yerrick
Problemem nie jest root ssh, ale logowanie za pomocą hasła to. Konto użytkownika z uprawnieniami sudo jest prawie tak samo niezabezpieczone jak root. Wystarczy użyć uwierzytelnienia opartego na kluczu SSH.
Martin Schneider
kwestią zalogowania się do maszyny jest OT, słusznie zgłosił w swoim przepisie, że musisz się zalogować w taki czy inny sposób.
devsmt
41

Myślę, że niektórzy chcieliby wiedzieć, jak znaleźć plik my.ini na twoim komputerze. Myślę, że dla użytkowników systemu Windows najlepszy sposób jest następujący:

  1. Win + R (skrót do „run”), wpisz services.msc , Enter
  2. Możesz znaleźć wpis, taki jak „MySQL56”, kliknij go prawym przyciskiem myszy, wybierz właściwości
  3. Możesz zobaczyć coś takiego jak „D: / Program Files / MySQL / MySQL Server 5.6 / bin \ mysqld” --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Otrzymałem tę odpowiedź z http://bugs.mysql.com/bug.php?id=68516

fstang
źródło
2
Jest to ważne w systemie Windows. Miałem MySQL jako usługę i edytowałem my.ini w Workbench, a ta odpowiedź uświadomiła mi, że MySQL jako usługa używa innego my.ini niż edytowanego w Workbench.
Robert Niestroj
20

Postępując zgodnie ze wszystkimi instrukcjami, to właśnie zrobiłem i pracowałem:

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)

Tak więc, jak widzimy, pakiet max_allowed_packet został zmieniony poza my.ini.

Opuść sesję i sprawdź ponownie:

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)

Podsumowując, po ustawieniu GLOBALNEGO pakietu max_allowed = 1073741824 serwer będzie miał nowy pakiet max_allowed_pack, dopóki nie zostanie zrestartowany, jak ktoś wcześniej stwierdził.

zwitterion
źródło
13

Jeśli otrzymujesz ten błąd podczas wykonywania kopii zapasowej, max_allowed_packetmożesz ustawić w my.cnfszczególności dla mysqldump.

[mysqldump]
max_allowed_packet=512M

Ciągle otrzymuję ten błąd podczas wykonywania mysqldumpi nie rozumiałem, bo miałem ten zestaw w my.cnframach [mysqld]sekcji. Kiedy już wymyśliłem, że mogę to ustawić [mysqldump]i ustawić wartość, moje kopie zapasowe zakończyły się bez problemu.

xpros
źródło
10

Dla osób korzystających z wamp mysql server

Ikona wampira -> 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

Przewiń w dół do końca, aż znajdziesz

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Dodaj linię między wartością packet_size

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

Sprawdź, czy zadziałało z tym zapytaniem

Select @@global.max_allowed_packet;
Sayka
źródło
5

Ten błąd pochodzi z powodu tego, że dane zawierają wartość większą niż ustawiona.

Po prostu zapisz max_allowed_packed=500M lub możesz obliczyć 500 * 1024k i użyć tego zamiast 500M, jeśli chcesz.

Teraz wystarczy zrestartować MySQL.

Suresh
źródło
2
do /etc/my.cnfinstancji MySQL lub /etc/my.cnf.d/server.cnfMariaDB
Evgeny Lebedev
5

Wielu respondentów zauważyło problem i już dało rozwiązanie.

Chcę tylko zasugerować inne rozwiązanie, które polega na zmianie wartości zmiennej Glogal z poziomu narzędzia Mysql Workbench . Jest to oczywiście JEŻELI używasz Workbench działającego lokalnie na serwerze (lub przez połączenie SSH)

Wystarczy połączyć się z instancją i przejść do menu:

Serwer -> Plik opcji -> Sieć -> max_allowed_packed

Ustaw żądaną wartość, a następnie musisz ponownie uruchomić usługę MySql .

Cnom
źródło
4

Dla każdego, kto korzysta z MySQL na usłudze Amazon RDS, ta zmiana odbywa się za pośrednictwem grup parametrów . Musisz utworzyć nową PG lub użyć istniejącej (innej niż domyślna, która jest tylko do odczytu).

Powinieneś poszukać max_allowed_packetparametru, zmienić jego wartość, a następnie nacisnąć Zapisz.

Po powrocie do instancji MySQL, jeśli utworzyłeś nową PG, powinieneś dołączyć PG do swojej instancji (może być konieczne ponowne uruchomienie). Jeśli zmieniłeś PG, który był już dołączony do twojej instancji, zmiany zostaną zastosowane bez restartu, do wszystkich twoich instancji, które mają dołączoną PG.

SebaGra
źródło
0

Jeśli chcesz przesłać duży obraz lub dane do bazy danych. Wystarczy zmienić typ danych na 'BIG BLOB'.

Vishal J
źródło
0

ustaw globalny max_allowed_packet = 10000000000;

Vishal Sheth
źródło