Как я могу изменить лимит
Размер строки слишком велик (> 8126). Изменение некоторых столбцов на TEXT или BLOB или использование ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
может помочь. В текущем формате строки BLOB
префикс в 768 байт хранится в строке .
Стол:
id int(11) No
name text No
date date No
time time No
schedule int(11) No
category int(11) No
top_a varchar(255) No
top_b varchar(255) No
top_c varchar(255) No
top_d varchar(255) No
top_e varchar(255) No
top_f varchar(255) No
top_g varchar(255) No
top_h varchar(255) No
top_i varchar(255) No
top_j varchar(255) No
top_title_a varchar(255) No
top_title_b varchar(255) No
top_title_c varchar(255) No
top_title_d varchar(255) No
top_title_e varchar(255) No
top_title_f varchar(255) No
top_title_g varchar(255) No
top_title_h varchar(255) No
top_title_i varchar(255) No
top_title_j varchar(255) No
top_desc_a text No
top_desc_b text No
top_desc_c text No
top_desc_d text No
top_desc_e text No
top_desc_f text No
top_desc_g text No
top_desc_h text No
top_desc_i text No
top_desc_j text No
status int(11) No
admin_id int(11) No
No
отображается?Ответы:
Вопрос задан и по serverfault .
Метод, который работал для OP, был:
Добавьте следующее в
my.cnf
файл в[mysqld]
разделе.ALTER
таблица для использованияROW_FORMAT=COMPRESSED
.Есть вероятность, что вышеуказанное все еще не решит ваши проблемы. Это известная (и проверенная) ошибка в движке InnoDB , и временное исправление на данный момент - возврат к движку MyISAM в качестве временного хранилища. Итак, в вашем
my.cnf
файле:источник
innodb_file_per_table=1
чтобы активировать эту опцию.Я недавно столкнулся с этой проблемой и решил ее другим способом. Если вы используете MySQL версии 5.6.20, в системе обнаружена известная ошибка. См. Документацию по MySQL
В моей ситуации таблица с ошибочными BLOB-объектами была около 16 МБ. Таким образом, я решил эту проблему, добавив строку в my.cnf, которая гарантировала, что у меня было как минимум 10-кратное количество, а затем еще несколько:
innodb_log_file_size = 256M
источник
longblob
поле исчезла, как только я увеличилinnodb_log_file_size
параметр. Также была запущена 5.6.20.Установите следующие параметры в файле my.cnf и перезапустите сервер mysql.
источник
innodb_strict_mode=0
-> без пробелов. В противном случае перезапуск mariaDB 10.2 приведет к ошибке :-PЕсли вы можете переключить ДВИГАТЕЛЬ и использовать MyISAM вместо InnoDB, это должно помочь:
ENGINE=MyISAM
Есть два предостережения относительно MyISAM (возможно, больше):
источник
Хочу поделиться классным ответом, может быть, полезно. Кредиты Билла Карвина смотрите здесь /dba/6598/innodb-create-table-error-row-size-too-large
Они различаются в зависимости от формата файла InnoDB. В настоящее время существует 2 формата, которые называются Antelope и Barracuda.
Файл центрального табличного пространства (ibdata1) всегда находится в формате Antelope. Если вы используете файл для таблицы, вы можете заставить отдельные файлы использовать формат Barracuda, установив innodb_file_format = Barracuda в my.cnf.
Основные моменты:
Одна страница данных InnoDB размером 16 КБ должна содержать не менее двух строк данных. Кроме того, каждая страница имеет верхний и нижний колонтитулы, содержащие контрольные суммы страниц, порядковый номер журнала и так далее. Вот где вы получаете свой лимит чуть меньше 8 КБ на строку.
Типы данных фиксированного размера, такие как INTEGER, DATE, FLOAT, CHAR, хранятся на этой первичной странице данных и учитываются в предельном размере строки.
Типы данных переменного размера, такие как VARCHAR, TEXT, BLOB, хранятся на страницах переполнения, поэтому они не учитываются полностью в пределе размера строки. В Antelope до 768 байт таких столбцов хранятся на первичной странице данных в дополнение к хранению на странице переполнения. Barracuda поддерживает динамический формат строк, поэтому на первичной странице данных может храниться только 20-байтовый указатель.
Типы данных переменного размера также имеют префикс в 1 или более байтов для кодирования длины. И формат строки InnoDB также имеет массив смещений полей. Итак, в их вики есть внутренняя структура, более или менее задокументированная.
Barracuda также поддерживает ROW_FORMAT = COMPRESSED для повышения эффективности хранения данных при переполнении.
Я также должен отметить, что я никогда не видел, чтобы хорошо спроектированная таблица превышала ограничение на размер строки. То, что вы нарушаете условие повторяющихся групп Первой Нормальной Формы, является сильным «запахом кода».
источник
У меня была такая же проблема, это решило ее для меня:
Из документации MYSQL :
источник
Warnings from last query: InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope
Row size too large (>8126)
my_table
ROW_FORMAT = DYNAMIC; сноваПроведя несколько часов, я нашел решение: просто запустите следующий SQL в своем администраторе MySQL, чтобы преобразовать таблицу в MyISAM:
источник
create table
есть такой же вариант:CREATE TABLE ... ENGINE=MyISAM ...
Я столкнулся с этой проблемой, когда пытался восстановить резервную копию базы данных mysql с другого сервера. Что решило эту проблему для меня, так это добавление определенных настроек в my.conf (как в вопросах выше) и дополнительное изменение файла резервной копии sql:
Шаг 1: добавьте или отредактируйте следующие строки в my.conf:
Шаг 2 добавьте ROW_FORMAT = DYNAMIC в оператор создания таблицы в файле резервной копии sql для таблицы, которая вызывает эту ошибку:
важное изменение выше ROW_FORMAT = DYNAMIC; (это не было включено в исходный файл резервной копии sql)
источник, который помог мне решить эту проблему: MariaDB и InnoDB MySQL Row size слишком большой
источник
innodb_page_size=32K
не сработала, так как в моем случае это вызвало ошибку при перезапуске MariaDB 10.2. Вместо этого я добавилinnodb_strict_mode=0
строку, как описано здесьinnodb_page_size
требуетibdata*
воссоздания, что является разрушительной операцией. Смотрите системный журнал для получения дополнительной информацииДругие ответы касаются заданного вопроса. Я устраню основную причину: плохой дизайн схемы.
Не размещайте массив по столбцам. Здесь у вас есть 3 * 10 столбцов, которые нужно превратить в 10 строк по 3 столбца в новой таблице (плюс
id
и т. Д.)В вашем
Main
столе будет толькоВаша дополнительная таблица (
Top
) будет иметьДля
Top
каждого должно быть 10 (или меньше? Или больше?) Строкid
.Это устраняет вашу исходную проблему и очищает схему. (Это не «нормализация», как обсуждается в некоторых комментариях.)
Есть не переключиться на MyISAM; это уходит.
Не беспокойтесь об этом
ROW_FORMAT
.Вам нужно будет изменить свой код, чтобы
JOIN
и обрабатывать несколько строк вместо нескольких столбцов.источник
Я использую MySQL 5.6 на AWS RDS. Я обновил следующее в группе параметров.
Мне пришлось перезагрузить экземпляр БД, чтобы изменения группы параметров вступили в силу.
Кроме того, ROW_FORMAT = COMPRESSED не поддерживался. Я использовал DYNAMIC, как показано ниже, и он работал нормально.
источник
Максимальный размер строки для таблицы InnoDB, которая применяется к данным, хранящимся локально на странице базы данных, составляет чуть меньше половины страницы для 4 КБ, 8 КБ, 16 КБ и 32 КБ.
Для страниц размером 16 КБ (по умолчанию) мы можем рассчитать:
В принципе, вы можете максимально увеличить строку с помощью:
Помните, что переполнение произойдет только в том случае, если размер поля> 767 байт. Если имеется слишком много полей размером 767 байт, оно будет отключено (превышение максимального размера строки). Не обычно с latin1, но вполне возможно с utf-8, если разработчики не будут осторожны.
В этом случае, я думаю, вы могли бы увеличить innodb_page_size до 32 КБ.
в my.cnf:
Ссылки:
источник
Я тоже столкнулся с той же проблемой. Решаю проблему, выполнив следующий sql:
Но я думаю, вам следует знать о хранилище строк .
Существует два типа столбцов: столбец переменной длины (например, типы VARCHAR, VARBINARY, BLOB и TEXT) и столбец фиксированной длины . Они хранятся на разных типах страниц.
и когда целью установки ROW_FORMAT является
Хотите узнать больше о ДИНАМИЧЕСКИХ и СЖАТЫХ форматах строк
источник
Если это происходит в SELECT с большим количеством столбцов, причина может заключаться в том, что mysql создает временную таблицу. Если эта таблица слишком велика для размещения в памяти, она будет использовать свой формат временной таблицы по умолчанию, которым является InnoDB, для хранения ее на диске. В этом случае применяются ограничения размера InnoDB.
Затем у вас есть 4 варианта:
измените формат временной таблицы по умолчанию на MYISAM, вот что я сделал. Изменения в my.cnf:
Перезагрузите mysql, запрос работает.
источник
Вот простой совет для всех, кто интересуется:
После обновления с Debian 9 до Debian 10 с помощью 10.3.17-MariaDB у меня есть некоторые ошибки в базах данных Joomla:
[Предупреждение] InnoDB: невозможно добавить поле
field
в таблицуdatabase
.table
потому что после его добавления размер строки составляет 8742, что превышает максимально допустимый размер (8126) для записи на конечной странице индекса.На всякий случай я установил innodb_default_row_format = DYNAMIC в /etc/mysql/mariadb.conf.d/50-server.cnf (все равно было по умолчанию)
Затем я использовал phpmyadmin для запуска «Оптимизации таблицы» для всех таблиц в базе данных Joomla. Я думаю, что воссоздание таблицы, выполненное phpmyadmin, помогло. Если у вас установлен phpmyadmin, достаточно сделать несколько кликов.
источник