Как решить MySQL Общая ошибка: 1030 Получена ошибка 139 из механизма хранения

Вы столкнетесь с такого рода ошибками случайное время, когда оператор вставки завершится неудачно, что приведет к фатальной ошибке 139. Это обычно происходит в производственной среде, когда пользователь вставляет много текста в какое-то поле таблицы (хотя поле может иметь типа LONGTEXT). Innodb вызывает эту ошибку, когда не может сохранить все столбцы переменной длины для данной строки на одной странице базы данных.

В этой статье мы покажем вам, как обойти это ограничение и объясним, почему это происходит.

Почему это происходит?

Innodb имеет известный предел для максимального размера строки, который немного меньше половины страницы базы данных (фактическая математика составляет 16 КБ — (заголовок страницы + трейлер страницы) / 2. Для размера страницы по умолчанию 16 КБ. Размер строки ~ 8000 байт. Это ограничение является следствием того, что InnoDB хранит две строки на странице. Однако, если вы используете сжатие, вы можете сохранить одну строку на странице. Если в вашей строке есть столбцы переменной длины и полный размер строки превышает этот предел, InnoDB выбирает столбцы переменной длины для хранения вне страницы.

Стоит отметить, что это ограничение применяется к значениям в байтах, а не к размеру символов. Это означает, что если вы вставите строку из 500 символов со всеми многобайтовыми символами в столбец VARCHAR (500), это значение также будет выбрано для хранения вне страницы. Это означает, что вы можете столкнуться с этой ошибкой после преобразования набора символов на родном языке в utf8, поскольку это может значительно увеличить размер. Например, если у вас есть таблица, содержащая не менее 8 столбцов с текстом (TEXT, LONGTEXT) и каждый из которых превышает 768 байт, то для локального хранения у вас будет не менее 8448 байт. Это превышает предел, и поэтому вы столкнетесь с исключением.

Одним словом, большое количество данных, которые InnoDB не может сохранить в текущей конфигурации. Лучшее решение этой проблемы — изменение формата установки MySQL по умолчанию с компактного или избыточного на динамический или сжатый.

Заметка

Обычно вы столкнетесь с этим исключением на версиях MySQL, равных или ниже 5.5 (MySQL 5.7 вводит опцию innodb_default_row_format, который по умолчанию равен DYNAMIC, поэтому в новых версиях вы никогда не увидите это исключение).

1. Проверьте, доступен ли формат Barracuda

Решение этой проблемы состоит в том, чтобы установить для формата строки таблицы, в которой возникла проблема, значение ДИНАМИЧНЫЙ, однако этот параметр недоступен, если для формата таблицы установлено значение Антилопа. Чтобы убедиться, что на вашем сервере MySQL включен формат Barracuda, вы можете проверить, например, с помощью такого инструмента, как PHPMyAdmin, параметры формата строки любой таблицы:

Форматы Барракуда (Динамические и Сжатые)

Если вы не видите опцию DYNAMIC или COMPRESSED, вам нужно изменить innodb_file_format на барракуду, следуя шагу № 2, который обычно устанавливается Антилопой. Если у вас нет такого инструмента, как PHPMyAdmin, вы можете открыть терминал mysql и получить информацию с помощью следующей команды:

show variables like "%innodb_file%";

Версия mysql с этой проблемой должна вывести что-то вроде:

innodb_file mysql

Как видите, формат файла установлен на Antelope, который не поддерживает динамический формат строки.

2. Измените формат файла на Барракуда

Первое, что вам нужно сделать, это найти файл конфигурации Mysql (my.cnf в Unix или my.ini в окнах) и добавьте новые 2 опции со следующими значениями в блоке mysqld:

# The MySQL server
[mysqld]
innodb_file_per_table = 1
innodb_file_format = barracuda

Заметка

Если после добавления этих опций сервер mysql не может запуститься, то формат не поддерживается, что означает, что решение проблемы не является ни тем, ни другим. Вы будете вынуждены обновить версию сервера MySQL, чтобы были доступны форматы строк DYNAMIC и COMPACT.

Перезапустите сервер mysql и повторите первый шаг, чтобы увидеть, доступны ли форматы строк DYNAMIC и COMPACT или снова выполнить следующую инструкцию в терминале mysql:

show variables like "%innodb_file%";

Который должен вывести сейчас:

InnoDB формат файла барракуда

Используя innodb_file_format с Barracuda в качестве значения, вы сможете использовать необходимый динамический формат строки в таблице, где у вас есть проблема с этим механизмом хранения.

3. Измените формат строки таблицы на ДИНАМИЧЕСКИЙ

Теперь, когда вы настроили формат файла barracuda, просто измените формат строки таблицы с помощью инструмента в PHPMyAdmin (перейдите к таблице, затем выполните операции, найдите параметры таблицы и измените row_format опция):

Форматы Барракуда (Динамические и Сжатые)

Или, если вы не можете использовать инструмент, с инструкцией в командной строке mysql:

ALTER TABLE `mytable` ROW_FORMAT=DYNAMIC;

После изменения формата строки таблицы сохранение строки в базе данных с большим количеством данных больше не должно быть проблемой, и вы не увидите этого исключения.

Ссылка на основную публикацию
Adblock
detector