8

Мы устраняли проблемы с базой данных в течение последних четырех часов благодаря неработающему mysqldump который не выдает достаточно ошибок. Мы получили эти ошибки:

mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014

Какого черта этот параметр делает? Очевидно, что это не размер IP-пакета, так как сейчас он установлен на 32M. Почему это существует?

2 ответа2

7

В соответствии со страницей 99 "Понимание внутренних компонентов MySQL" (ISBN 0-596-00957-7) ниже приводятся параграфы 1-3:

Код сетевой связи MySQL был написан в предположении, что запросы всегда достаточно короткие, и поэтому могут отправляться и обрабатываться сервером в одном фрагменте, который в терминологии MySQL называется пакетом . Сервер выделяет память для временного буфера для хранения пакета и запрашивает достаточно для его полного заполнения. Эта архитектура требует принятия мер предосторожности, чтобы избежать исчерпания памяти на сервере - ограничение размера пакета, которое выполняет эта опция.

Интересующий код в отношении этой опции находится в sql/net_serv.cc . Посмотрите на my_net_read(), затем выполните вызов my_real_read() и обратите особое внимание на net_realloc() .

Эта переменная также ограничивает длину результата многих строковых функций. Смотрите sql/field.cc и sql/intem_strfunc.cc для подробностей.

Это, вероятно, самое полное объяснение max_allowed_packet, которое я когда-либо видел. Я напечатал эти 3 абзаца прямо из книги.

1

Документация объясняет это в деталях здесь:

Msgstr "Максимальный размер одного пакета или любой сгенерированной / промежуточной строки. ..."

Документация также касается BLOB-объектов и того, как этот параметр связан с ними.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .