Как настроить MySQL 5.6 LONGBLOB для больших двоичных данных
Прежде чем задать свой вопрос немного: я делаю Data Export/Import, используя MySQL Workbench 6.1 базы данных MySQL 5.5 от одной машины до 5.6 на другой. обе машины - ubuntu один 32-разрядный другой 64-разрядный.
Я дам данные без проблем, но когда я пытаюсь загрузить его, я получаю:
ОШИБКА 1118 (42000) на линии 1807: слишком большой размер строки ( > 8126). Изменение некоторых столбцов в TEXT или BLOB или использование ROW_FORMAT = DYNAMIC или ROW_FORMAT = COMPRESSED может помочь. В формате текущей строки префикс BLOB из 768 байт хранится в строке.
Вот таблица create:
CREATE TABLE `file_content` (
`fileid` bigint(20) NOT NULL,
`content` LONGBLOB NOT NULL,
PRIMARY KEY (`fileid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
У меня есть следующие соответствующие настройки my.cnf...
max_allowed_packet = 1G
innodb_file_per_table = 1
innodb_file_format = Барракуда
Я трачу много времени на поиск в Google, пытаясь понять, в чем проблема. BTW, если я удалю первичный ключ (здесь нет проблем, но жалуется другая таблица с внешним ключом в эту таблицу.
Как повезло, у меня есть ssh-доступ к ящику, поэтому я могу увидеть фактический mysqldb.log. почему я нахожу, что действительно интересно...
2014-08-12 20:42:12 25246 [ERROR] InnoDB: общая длина данных блоба (14179167) больше 10% от размера файла журнала повтора (3072). Увеличьте innodb_log_file_size.
Таким образом, увеличение размера файла журнала повтора до размера 10x LONGBLOB исправило мою проблему. Однако это означает, что для вставки 1G LONGBLOB (то есть фактического максимума из-за размера пакета) мне понадобится 10G innodb_log_file_size.
Может кто-нибудь объяснить, как "ошибка журнала журнала повторения" превращается в "слишком большой размер строки ( > 8126)".
BTW У меня нет контроля над структурой этого db, поэтому нет "почему вы храните большие капли в базе данных".
ТИА
Ответы
Ответ 1
Причиной этой проблемы является изменение MySQL 5.6.20, которое можно было бы прочитать в журнале изменений:
В результате правила записи BLOB, введенного для MySQL 5.6, параметр innodb_log_file_size должен быть в 10 раз больше, чем самый большой Размер данных BLOB, найденный в строках ваших таблиц, плюс длина других полей переменной длины (поля VARCHAR, VARBINARY и TEXT). Никаких действий не требуется, если ваша установка innodb_log_file_size уже достаточно велика или ваши таблицы не содержат данных BLOB.
Чтобы решить проблему, вы должны увеличить значение параметра innodb_log_file_size в my.ini
ниже раздела [mysqld]
. Его значение по умолчанию - 48M
. Установив его в
[mysqld]
innodb_log_file_size=256M
помог в моем случае.
Будьте осторожны при изменении значения innodb_log_file_size
, которое вы сделайте безопасно:
- Вам необходимо закрыть сервер и выполнить его чисто и нормально.
- Уходите (не удалять) файлы журнала, которые называются ib_logfile0, ib_logfile1 и т.д.
- Проверьте журнал ошибок, чтобы убедиться в отсутствии проблема выключения.
- Затем перезапустите сервер и посмотрите журнал ошибок выход тщательно. Вы должны увидеть печатные сообщения InnoDB, в которых говорится, что файлы журнала не существуют. Он создаст новые, а затем запустится.
- При этом вы можете проверить, работает ли InnoDB, а затем вы можете удалить старые файлы журналов.
Ответ 2
Для тех, кто не может найти это для XAMPP:
Сначала я не мог найти правильный файл для редактирования innodb_log_file_size
Актуальный файл: xampp/mysql/bin/my.ini
Ответ 3
Просто перейдите по следующим адресам: xampp\mysql\bin\my.ini и попробуйте изменить размер innodb_log_file_size до 256 МБ.