A.2.8 Ошибка Packet too large
Когда клиент MySQL или сервер mysqld
получают пакет с размерами,
превышающими max_allowed_packet
байтов, программа выдает ошибку Packet
too large
и закрывает соединение.
В MySQL 3.23 размер самого большого возможного пакета составляет 16 Mб
(из-за ограничений клиент-серверного протокола). В MySQL 4.0.1 и выше
размер пакета ограничивается только количеством имеющейся на сервере
памяти (вплоть до теоретического максимума в 2 Гб).
Коммуникационный пакет - это одна команда SQL, посылаемая серверу, или
одна строка, посылаемая клиенту.
Когда клиент MySQL или сервер mysqld
получают пакет, размеры которого
превышают max_allowed_packet
байтов, программа выдает ошибку Packet too
large
и закрывает соединение. Если коммуникационный пакет слишком велик,
то в некоторых клиентах может быть выдана ошибка Lost connection to
MySQL server during query
.
Отметим, что и клиент, и сервер имеют свои собственные переменные
max_allowed_packet
. Если требуется обрабатывать большие пакеты, то эту
переменную необходимо увеличить как для клиента, так и для сервера.
Увеличение переменной не опасно, поскольку память выделяется только при
необходимости; эта переменная скорее является мерой предосторожности для
"отлавливания" неправильных пакетов между клиентом и сервером, а также
для того, чтобы предупредить ситуацию нехватки памяти, вследствие
случайного использования больших пакетов.
Если используется клиент mysql
, то можно задать больший буфер, запустив
клиент посредством mysql --set-variable=max_allowed_packet=8M
. Для других
клиентов существуют собственные методы установки этой переменной.
Для установки max_allowed_packet
большего размера в mysqld
можно также
использовать файл опций. Например, если в таблице предполагается хранить
значение типа MEDIUMBLOB
максимальной длины, то нужно запускать сервер с
опцией set-variable=max_allowed_packet=16M
.
При использовании больших пакетов могут также возникать непредсказуемые
проблемы, если вы работаете с большими значениями типа BLOB
, и mysqld
не
был предоставлен доступ к достаточному объему памяти для обработки
запроса. Если есть подозрение, что дело в этом, попробуйте добавить ulimit
-d 256000
в начале скрипта safe_mysqld
и перезапустить mysqld
.