MySQL, сохранение больших двоичных объектов
Я тестирую приложение, написанное на QT, которое имеет дело с PDF-файлами, сохраненными в базе данных, у меня возникли проблемы с попыткой сохранить что-нибудь больше, чем около 1 Мбайт, приложение зависло бы, чтение в Goggle в итоге изменило MAX_ALLOWED_PACKET и позволило мне сохранить капли.
Я подготовил несколько загрузок PDF разного размера и получил около 200 Кб / с файлов для сохранения. Затем пришло мое удивление, проверяя базу данных, я понял, что что-то более 5 Мб не будет хранить. Там нет ошибки, и кажется, что рукопожатие между приложением и MySQL проходит нормально, так как я не получаю никаких ошибок.
У меня есть некоторый опыт работы с MySQL и Oracle, но я никогда не имел дело с BLOB-объектами. Я где-то читал в посте, что я должен попытаться изменить значение innodb_log_file_size (я пробовал 2000000000), но MySQL говорит мне, что это переменная только для чтения. Может ли какое-то тело помочь мне решить эту проблему? Я использую MySQL в Ubuntu.
2 ответа
Неудивительно, что вы получили ошибку, поскольку размер файла журнала innodb по умолчанию составляет 48 МБ (50331648 байт).
Размер файла журнала innodb должен быть не менее чем в 10 раз больше размера самого большого большого двоичного объекта, который вы пытаетесь сохранить. Другими словами, вы можете сохранить большой двоичный объект, только если он не превышает 1/10 размера файла журнала. Это стало применяться в MySQL 5.6; до этого это было рекомендовано в руководстве, но не соблюдалось.
Вы можете изменить размер файла журнала, но это требует перезагрузки MySQL Server. Шаги описаны здесь: https://dev.mysql.com/doc/refman/5.7/en/innodb-data-log-reconfiguration.html
PS Что касается комментариев о хранении изображений в базе данных по сравнению с файлами на диске, то это долгая дискуссия. Некоторые люди будут однозначно утверждать, что хранить изображения в базе данных плохо, но с обеих сторон есть аргументы за и против. См. Мой ответ на вопрос " Должен ли я использовать тип поля блобов MySQL?"
У Билла есть немедленный ответ. Но я полагаю, что вы будете получать все больше и больше документов и будете соблюдать один предел за другим.
Между тем, если у вас нет совсем недавнего MySQL, изменение innodb_log_file_size
это боль.
Если вы когда-нибудь получите 1 ГБ, вы достигнете предела для max_allowed_packet
, Даже если вы прошли через это, вы столкнетесь с еще одним жестким ограничением - 4 ГБ, максимальный размер LONGBLOB
или же LONGTEXT
,
Я предлагаю вам либо укусить пулю
План A: Поместить документы в файловую систему или
План Б: Разделить документы на части, хранить в нескольких BLOB
строк. Это позволит избежать всех ограничений, даже 4 ГБ. Но код будет грязным на входе и выходе.