Подтвердить что ты не робот

Как настроить 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, поэтому нет "почему вы храните большие капли в базе данных".

ТИА

4b9b3361

Ответ 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 МБ.