Что фактически контролирует параметр «max_allowed_packet» в MySQL?

8

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

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

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

Plutor
источник

Ответы:

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 абзаца прямо из книги.

RolandoMySQLDBA
источник
Спасибо за публикацию этого. Кажется, намекнул, что «пакет» означает «IP-пакет».
Рэндольф Ричардсон
Отличный ответ. Я думаю, это так близко, как я получаю реальный ответ. (Я все еще уверен, что это не относится к IP-пакетам. Он нигде не упоминает IP, и я считаю, что 65535 байт, как правило, является реальным пределом даже для фрагментированных IP-пакетов.)
Plutor
1

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

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

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

Рэндольф Ричардсон
источник
Это на самом деле не отвечает на мой вопрос. Что такое пакет в этом контексте? Это на самом деле IP-пакет? Нет ли лучшего способа, чем простое ограничение в байтах, для отлова искаженных данных?
Plutor
Если они не определяют «пакет» как нечто иное (чего они не делают в документации), разумно ожидать, что «пакет» относится к IP-пакету.
Рэндольф Ричардсон,
Я нашел определение в моей книге. Я добавил отрывок из этой книги в качестве ответа.
RolandoMySQLDBA