Как изменить размер max_allowed_packet

318

У меня проблема с полями BLOB в моей базе данных MySQL - при загрузке файлов размером более 1 МБ я получаю сообщение об ошибке Packets larger than max_allowed_packet are not allowed.

Вот что я пробовал:

В MySQL Query Browser я запустил, show variables like 'max_allowed_packet'который дал мне 1048576.

Затем я выполняю запрос с set global max_allowed_packet=33554432последующим show variables like 'max_allowed_packet'- он дает мне 33554432, как и ожидалось.

Но когда я перезагружаю сервер MySQL, он волшебным образом возвращается к 1048576. Что я здесь не так делаю?

Бонусный вопрос, можно ли сжать поле BLOB?

Muleskinner
источник
1
Поле BLOB - это большой двоичный объект. Это просто биты. Так что да, вы можете сжать содержимое, и оно дает другие (и, надеюсь, меньше) биты, которые вы храните в поле BLOB. Это просто меняет, какие данные вы положили в него. Вам также придется распаковывать содержимое BLOB, когда оно вам понадобится снова.
Конерак
Хорошо, спасибо, надеялся, что в MySQL существует встроенная функция сжатия
Muleskinner

Ответы:

407

Измените файл my.iniили ~/.my.cnf, включив в него одну строку в разделе [mysqld]или [client]разделе:

max_allowed_packet=500M

затем перезапустите службу MySQL, и все готово.

См. Документацию для получения дополнительной информации.

Manuel
источник
1
Спасибо, кажется, работает, хотя я надеялся, что это будет возможно без необходимости вручную изменять INI-файлы.
Muleskinner
63
К сведению читателей, это также решение проблемы «MySQL ушла»
djb
1
@ Konerak, кто был насмешником?
Pacerier
14
Кажется довольно бессмысленным давать кому-то ответ, а затем сказать им, что он должен проверить Google на предмет ответа. Тем более, что SO неизменно занимает несколько лучших результатов для любого вопроса, связанного с приличным программированием. Разговор о программировании бесконечного цикла !!! Google> SO> Google> SO> Google> SO и так далее.
Фил Хили
5
Убедитесь, что он под, [mysqld]а не [mysql](очень похож). Стоило мне несколько минут на расчесывание головы.
Halvor Holsten Strand
226

Max_allowed_packet переменная может быть установлена в глобальном масштабе в результате выполнения запроса.

Однако, если вы не измените его в my.iniфайле (как предложил dragon112), значение будет сброшено при перезапуске сервера, даже если вы установите его глобально.

Чтобы изменить максимально допустимый пакет для всех на 1 ГБ до перезагрузки сервера:

SET GLOBAL max_allowed_packet=1073741824;
TehShrike
источник
7
Не помогает :(. Он отображает «Query OK, затронуто 0 строк (0,00 с)»
artnikpro
15
@artnikpro Это работает, «запрос в порядке, 0 строк затронут (0,00 сек)» может показаться вводящим в заблуждение, но это правильно.
AnnTea
10
не работает для меня SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'все еще показывает старое значение
Пома
50
Это показывает старое значение, потому что max_allowed_packet не изменяется для существующих соединений. Если вы отключите и снова подключитесь, вы увидите обновленное значение.
Мэтт Кринкло-Фогт
2
Мэтт Кринкло-Фогт прав. Нужно выйти и снова подключиться
makriria
89

У одного из моих младших разработчиков возникла проблема с изменением этого для меня, поэтому я подумал, что я бы расширил это более подробно для пользователей Linux:

1) открыть терминал

2) ssh root @ YOURIP

3) введите пароль пользователя root

4) nano /etc/mysql/my.cnf (если команда не распознана, сначала сделайте это или попробуйте vi, а затем повторите: yum install nano)

5) добавьте строку: max_allowed_packet = 256M (очевидно, отрегулируйте размер для того, что вам нужно) в разделе [MYSQLD]. Он сделал ошибку, поместив его сначала внизу файла, чтобы он не работал.

введите описание изображения здесь

6) Control + O (сохранить), затем ENTER (подтвердить), затем Control + X (выходной файл)

7) перезапуск службы mysqld

8) Вы можете проверить изменения в разделе переменных на phpmyadmin

naw103
источник
на самом деле это было сделано на CentosOS6, я, конечно, согласен не использовать root ssh-доступ
naw103
@tamasd Несколько дистрибутивов GNU / Linux, которые я использовал (например, Debian 8 и CentOS 6), которые создаются sudo: command not foundили this incident will be reportedпотому что либо sudoне были установлены и настроены. Было бы лучше засорять этот ответ инструкциями по настройке sudoв первый раз?
Дамиан Йеррик
проблема не в root ssh, а в пароле. Учетная запись пользователя с разрешением sudo почти так же небезопасна, как и root. Просто используйте аутентификацию на основе ключа SSH.
Мартин Шнайдер
вопрос о том, как войти в машину - это OT, он справедливо сообщил в своем рецепте, что вы должны войти, так или иначе.
devsmt
41

Я думаю, что некоторые также хотели бы знать, как найти файл my.ini на вашем компьютере. Для пользователей Windows, я думаю, что лучший способ заключается в следующем:

  1. Win + R (ярлык для запуска), введите services.msc , Enter
  2. Вы можете найти запись типа «MySQL56», щелкните по ней правой кнопкой мыши и выберите свойства
  3. Вы можете увидеть что-то вроде "D: / Program Files / MySQL / MySQL Server 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Я получил этот ответ от http://bugs.mysql.com/bug.php?id=68516

fstang
источник
2
Это важно в Windows. Я имел MySQL как сервис и отредактировал my.ini в Workbench, и этот ответ заставил меня понять, что MySQL как сервис использует другой my.ini, чем тот, который я редактировал в Workbench.
Роберт Нестрой
20

Следуя всем инструкциям, вот что я сделал и работал:

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)

Итак, как мы видим, max_allowed_packet был изменен вне my.ini.

Выйдем из сеанса и снова проверим:

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)

Вывод, после SET GLOBAL max_allowed_packet = 1073741824, сервер будет иметь новый max_allowed_packet до его перезапуска, как кто-то заявил ранее.

цвиттерион
источник
13

Если эта ошибка возникает при выполнении резервного копирования, max_allowed_packetее можно настроить, в my.cnfчастности, для mysqldump.

[mysqldump]
max_allowed_packet=512M

Я постоянно получаю эту ошибку во время выполнения , mysqldumpи я не понимаю , потому что у меня был этот набор в my.cnfрамках [mysqld]секции. Как только я понял, что могу установить его, [mysqldump]и я установил значение, мои резервные копии были выполнены без проблем.

xpros
источник
10

Для тех, кто работает Wamp MySQL Server

Значок Wamp tray -> 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

Прокрутите вниз до конца, пока не найдете

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Добавьте строку package_size между

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

Проверьте, работал ли он с этим запросом

Select @@global.max_allowed_packet;
Sayka
источник
5

Эта ошибка возникает из-за того, что ваши данные содержат больше установленного значения.

Просто запишите max_allowed_packed=500M или вы можете рассчитать эти 500 * 1024k и использовать их вместо 500M, если хотите.

Теперь просто перезапустите MySQL.

Суреш
источник
2
чтобы /etc/my.cnf, например , MySQL, или /etc/my.cnf.d/server.cnfдля MariaDB
Евгений Лебедев
5

Многие из ответивших заметили проблему и уже дали решение.

Я просто хочу предложить другое решение, которое изменяет значение переменной Glogal из инструмента Mysql Workbench . Это конечно, если вы используете Workbench, работающий локально на сервере (или через SSH-соединение)

Вы просто подключаетесь к своему экземпляру и заходите в меню:

Сервер -> Файл опций -> Сеть -> max_allowed_packed

Вы устанавливаете желаемое значение, а затем вам нужно перезапустить MySql Service .

cnom
источник
4

Для тех, кто работает с MySQL на сервисе Amazon RDS, это изменение выполняется через группы параметров . Вам необходимо создать новый PG или использовать существующий (отличный от стандартного, который доступен только для чтения).

Вам нужно найти max_allowed_packetпараметр, изменить его значение и нажать «Сохранить».

Вернувшись в свой экземпляр MySQL, если вы создали новую PG, вы должны присоединить PG к своему экземпляру (вам может потребоваться перезагрузка). Если вы изменили PG, который уже был прикреплен к вашему экземпляру, изменения будут применены без перезагрузки ко всем вашим экземплярам, ​​к которым прикреплен этот PG.

SebaGra
источник
0

Если вы хотите загрузить изображение или данные большого размера в базу данных. Просто измените тип данных на 'BIG BLOB'.

Вишал Дж
источник
0

установить глобальный max_allowed_packet = 10000000000;

Вишал Шет
источник