mysql Ошибка SQL Error (1030): Got error 139 from storage engine -- выход за размер записи (страницы) хранения данных

Forums:

SQL Error (1030): Got error 139 from storage engine

Получаю такую ошибку при попытке обновить поле типа TEXT.

Ещё особенности:

  • Причем в таблице полей с таким типом много (в моём случае 14 штук).
  • Другие поля той же строки почти все заполнены, если в этом поле передавать коротнкое значение, то всё сохраняется, но начиная с определённого момента падает.

Как пишут люди (см. ссылки внизу) проблема состоит в том, что в mySQL InnoDB имеется ограничение места на хранение строки. Далее будем выяснять подробности.

Возможные причины

Ещё раз про возможные причины:

  1. У вас на диске просто закончилось место
  2. У вас "слишком много" полей типа TEXT (вообще текстовых полей)

Второй вариант рассмотрим подробнее.

Слишком много полей типа TEXT

По сути причина ошибки формулируется так:

...чтобы поддерживать как минимум 256-симольный в UTF-8 prefix индекс,
InnoDB резервирует минимум 768 байт на каждую колонку внутри данной записи [кортежа, который например добавляется или обновляется]. Если у вас 11 полей типа TEXT. то вы выходите за ограничение в 8000 байт [т.е. за половину размера страницы -- при размере страницы хранения данных 16 кб = 16 000 байт]

Оригинальный текст:

to support at least 256-character UTF-8 column prefix indexes, InnoDB stores at least 768 bytes of each column 'internally' to the record. With 11 TEXT fields you will run over the 8000 byte record len limit.

Как это работает - почему мы тогда вообще можем хранить длинные поля

Хороший ответ отсюда:

...как известно, MySQL хранят текстовые данные в хранилище, отдельном от табличных строк. Оказалось, что это верно только на половину. На самом деле InnoDB хранит в отдельном хранилище только «излишки», к коим он не относит первые 768 байтов каждого текстового поля. Т.е. любой текст будет отъедать от длины строки столько байт, сколько он содержит, но не больше 768. Несложно подсчитать, что максимальное число текстовых полей длиной от 768 байт, которое можно безопасно хранить в одной таблице — 10.

Источники: