Назад | Перейти на главную страницу

MySQL: max_allowed_packet Более 1 ГБ возможно ли?

В области цифровой криминалистики размер пакета в 1 ГБ очень распространен, и у меня возникают проблемы.

Используя собственный скрипт Python, мы извлекаем текст из архивов, некоторые файлы имеют размер до 4 ГБ, а текст внутри них может легко достигать 1 ГБ. а затем мы используем Sphinxsearch, чтобы сделать его доступным для поиска.

Итак, теперь я сталкиваюсь с ошибками слишком большого размера пакета при вставке этого текста в базу данных.

Машина 64-ядерная с 64-гигабайтной оперативной памятью, может легко обрабатывать Terrabytes.

Так что я должен делать?

Другой вопрос: увеличивает ли max_allow_packet использование памяти во время пакетов <1 ГБ?

ОС: Linux 2.6.39 Mysql: 5.1 и 5.5

Перед изменением max_allowed_packet, сначала давайте определим его.

Согласно стр. 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 для подробностей.

В свете отрывка из этой книги и документации MySQL по max_allowed_packet, вы практически ничего не можете сделать с превышением 1 Гб для max_allowed_packet. Однако есть еще один аспект, который необходимо изучить, связанный с настройкой BLOB и текстовых данных.

Еще вопрос в Server Fault сделал следующее утверждение относительно InnoDB и BLOB: innodb_log_file_size и innodb_log_buffer_size в совокупности должен быть больше, чем в десять раз ваш самый большой объект blob, если у вас много больших. Если вы этого не сделаете (и не должны [1,2]), особо возиться с этим не нужно. Посетите блог производительности MySQL, чтобы получить подробный отчет о том, как рассчитывать.

Есть еще один аспект, о котором следует подумать: вариант net_buffer_length (по умолчанию 16K) используется как размер инициализации пакета MySQL. Пакет может динамически расширяться до max_allowed_packet. Он неизбежно может вернуться к размеру, указанному в net_buffer_length. Максимальные значения net_buffer_length - 1M. Вы можете установить значение 1M. Может не сильно помочь, если вы прокручиваете через 1G, но и не повредит.

Если вам действительно нужен пакет MySQL размером более 1 ГБ, в цитированном мной отрывке из книги рассказывается, какой исходный код использовать, определяющий внутреннее устройство пакета MySQL. Вы можете попробовать поднять лимит. Тем не менее, исходный код может иметь собственные внутренние ограничения, если код предполагает 1G, помимо заданных явных чисел.

Я надеюсь эта информация поможет !!!