Как изменить размер max_allowed_packet
У меня возникла проблема с 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?
Ответы
Ответ 1
Измените файл my.ini
или ~/.my.cnf
, включив в ваш файл одну строку в разделе [mysqld]
или [client]
:
max_allowed_packet=500M
затем перезапустите службу MySQL, и все готово.
См. Документацию для получения дополнительной информации.
Ответ 2
Переменная max_allowed_packet может быть установлена глобально путем запуска запроса.
Однако, если вы не измените его в файле my.ini
(как предложил dragon112), значение будет сброшено при перезапуске сервера, даже если вы установили его глобально.
Чтобы изменить максимально допустимый пакет для всех на 1 ГБ до перезапуска сервера:
SET GLOBAL max_allowed_packet=1073741824;
Ответ 3
У одного из моих младших разработчиков возникла проблема с изменением этого для меня, поэтому я подумал, что я буду расширять его более подробно для пользователей Linux:
1) открыть терминал
2) ssh root @YOURIP
3) введите пароль root
4) nano/etc/mysql/my.cnf(если команда не распознана, сделайте это сначала или попробуйте vi, затем повторите: yum install nano)
5) добавьте строку: max_allowed_packet = 256M (очевидно, отрегулируйте размер для всего, что вам нужно) в разделе [MYSQLD]. Он ошибся, поставив его внизу файла, чтобы он не работал.
![enter image description here]()
6) Control + O (сохранить), затем ENTER (подтвердить), затем Control + X (файл выхода)
7) перезагрузка службы mysqld
8) Вы можете проверить изменение в разделе переменных на phpmyadmin
Ответ 4
Я думаю, что некоторые из них также захотят узнать, как найти файл my.ini на вашем ПК. Для пользователей Windows я считаю, что лучший способ заключается в следующем:
- Win + R (ярлык для 'run'), введите services.msc, введите
- Вы можете найти запись типа "MySQL56", щелкнуть правой кнопкой мыши по ней, выбрать свойства
- Вы можете видеть, что "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
Ответ 5
Следуя всем инструкциям, это то, что я сделал и работал:
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 до тех пор, пока он не будет перезапущен, как указано ранее.
Ответ 6
При получении этой ошибки при выполнении резервного копирования max_allowed_packet
можно установить в my.cnf
, особенно для mysqldump
.
[mysqldump]
max_allowed_packet=512M
Я продолжал получать эту ошибку при выполнении mysqldump
, и я не понял, потому что у меня был этот набор в my.cnf
в разделе [mysqld]
. Как только я понял, я могу установить его для [mysqldump]
, и я установил значение, мои резервные копии были завершены без проблем.
Ответ 7
Для тех, кто работает с сервером mysql wamp
Значок поддонов для Wamp → 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;
Ответ 8
Многие из ответчиков заметили проблему и уже дали решение.
Я просто хочу предложить другое решение, которое изменяет значение переменной Glogal из инструмента Mysql Workbench. Это, конечно, если вы используете Workbench, работающую локально на сервере (или через SSH-соединение)
Вы просто подключаетесь к своему экземпляру и выбираете меню:
Сервер → Файл параметров → Сеть → max_allowed_packed
Вы установите нужное значение, а затем вам нужно перезапустить службу MySql.
Ответ 9
Эта ошибка возникает из-за того, что ваши данные содержат больше заданного значения.
Просто запишите max_allowed_packed=500M
или вы можете вычислить это 500 * 1024k и использовать это вместо 500M, если хотите.
Теперь просто перезапустите MySQL.
Ответ 10
Для тех, кто работает с MySQL в сервисе Amazon RDS, это изменение выполняется через группы параметров. Вам нужно создать новый PG или использовать существующий (отличный от стандартного, который доступен только для чтения).
Вам нужно найти параметр max_allowed_packet
, изменить его значение и нажать "Сохранить".
Вернувшись в свой экземпляр MySQL, если вы создали новую PG, вы должны присоединить PG к своему экземпляру (вам может потребоваться перезагрузка). Если вы изменили PG, который уже был прикреплен к вашему экземпляру, изменения будут применены без перезагрузки ко всем вашим экземплярам, к которым прикреплен этот PG.
Ответ 11
Если вы хотите загрузить изображение большого размера или данные в базу данных. Просто измените тип данных на 'BIG BLOB'
.