Як змінити розмір max_allowed_packet


317

У мене виникають проблеми з полями BLOB в моїй базі даних MySQL - при завантаженні файлів розміром більше 1 МБ я отримую помилку Packets larger than max_allowed_packet are not allowed.

Ось що я спробував:

У браузері MySQL Query я запустив a, show variables like 'max_allowed_packet'який дав мені 1048576.

Потім я виконую запит, set global max_allowed_packet=33554432за яким слідує show variables like 'max_allowed_packet'- він дає мені 33554432 як очікувалося.

Але коли я перезавантажую MySQL-сервер, це магічно повертається до 1048576. Що я тут роблю неправильно?

Питання про бонус, чи можна стиснути поле BLOB?


1
Поле BLOB - це двійковий великий об’єкт. Це просто шматочки. Так що так, ви можете стискати вміст, і він дає інші (і, сподіваємось, менше) біти, які ви зберігаєте натомість у полі BLOB. Він просто змінює, які дані ви в них вводите. Вам також доведеться розпакувати вміст BLOB, коли вам це буде потрібно ще раз.
Конерак

Добре спасибі, сподівався, що існує функція стиснення в mysql
Muleskinner

Відповіді:


407

Змініть файл my.iniабо ~/.my.cnfфайл, включивши у файл один рядок під розділом [mysqld]або [client]розділом:

max_allowed_packet=500M

потім перезапустіть службу MySQL, і ви закінчите.

Для отримання додаткової інформації дивіться документацію .


1
Дякую, здається, працює, хоча я сподівався, що це стане можливим без зміни файлів ini вручну.
Muleskinner

63
Читачі FYI, це також рішення помилки "MySQL пішов"
djb

1
@Konerak, Хто був посмішкою?
Pacerier

14
Давати відповідь комусь здається досить безглуздим, а потім сказати їм, що вони повинні піти перевірити Google на відповідь. Тим більше, що SO завжди незмінно займає кілька найкращих результатів для будь-якого питання, пов'язаного з гідним програмуванням. Поговоріть про програмування нескінченного циклу !!! Google> SO> Google> SO> Google> SO і так далі.
Філл Хелі

5
Переконайтеся, що він знаходиться під, [mysqld]а не [mysql](дуже подібний). Коштує мене декількох хвилин шевелюри.
Halvor Holsten Strand

225

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

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

Щоб змінити максимально дозволений пакет для кожного на 1 Гб, поки сервер не перезапуститься:

SET GLOBAL max_allowed_packet=1073741824;

7
Не допомагає :(. Він відображає "Запит в порядку, 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) введіть пароль користувача

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


це було насправді зроблено на CentosOS6, я, звичайно, погоджуюсь не використовувати root-ssh доступ, хоча
naw103

@tamasd Кілька дистрибутивів GNU / Linux, які я використовував (як Debian 8 і CentOS 6), виробляють sudo: command not foundабо this incident will be reportedтому, що або sudoне були встановлені та налаштовані. Чи було б краще засвоїти цю відповідь інструкціями щодо налаштування sudoвперше?
Damian Yerrick

не root ssh - проблема, але вхід пароля. Обліковий запис користувача з дозволом sudo майже такий же незахищений, як і root. Просто використовуйте аутентифікацію на основі ключа SSH.
Мартін Шнайдер

Справа в тому, як увійти в машину - це ОТ, він у своєму рецепті справедливо повідомив, що вам доведеться увійти, так чи інакше.
devsmt

41

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

  1. Win + R (ярлик для 'run'), введіть services.msc , Enter
  2. Ви можете знайти запис типу "MySQL56", клацніть правою кнопкою миші, виберіть властивості
  3. Ви можете побачити щось на зразок "D: / Файли програми / 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


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]і я встановив значення, моє резервне копіювання завершено без проблем.


10

Для тих, хто працює на сервері wamp mysql

Значок лотка 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

Додайте рядок розміру packet_size між ними

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

Перевірте, чи працював цей запит

Select @@global.max_allowed_packet;

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-з'єднання)

Ви просто підключитесь до свого примірника і перейдете до меню:

Сервер -> Файл параметрів -> Мережа -> Макс

Ви встановлюєте потрібне значення, після чого вам потрібно перезапустити MySql Service .


4

Для всіх, хто працює з MySQL на службі Amazon RDS, ця зміна здійснюється через групи параметрів . Потрібно створити новий PG або використовувати існуючий (крім стандартного, який використовується лише для читання).

Вам слід знайти max_allowed_packetпараметр, змінити його значення та натиснути зберегти.

Назад у вашому екземплярі MySQL, якщо ви створили новий PG, вам слід приєднати PG до свого примірника (можливо, вам знадобиться перезавантаження). Якщо ви змінили PG, який уже був приєднаний до вашого примірника, зміни будуть застосовані без перезавантаження, до всіх ваших примірників, у яких додано цю PG.


0

Якщо ви хочете завантажити зображення чи дані великих розмірів у базу даних. Просто змініть тип даних на 'BIG BLOB'.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.