MySQL: код ошибки: 1118 размер строки слишком большой (>8126). Изменение некоторых столбцов на TEXT или BLOB

Я хочу создать таблицу 325

15 ответов


недавно я боролся с тем же кодом ошибки из-за изменения MySQL Server 5.6.20. Я смог решить проблему, изменив innodb_log_file_size в my.текстовый файл Ини.

в примечаниях к выпуску объясняется, что innodb_log_file_size, который слишком мал, вызовет "размер строки слишком большая ошибка."

http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html


Я перепробовал все решения здесь, но только этот параметр

innodb_strict_mode             = 0

решил мой день...

из руководства:

параметр innodb_strict_mode влияет на обработку синтаксических ошибок для CREATE TABLE, ALTER TABLE и CREATE INDEX операторы. innodb_strict_mode также включает проверку размера записи, чтобы вставить или обновление никогда не завершается неудачей из-за того, что запись слишком велика для выбранный размер страницы.


ERROR 1118 (42000) at line 1852:    
Row size too large (> 8126). Changing some columns to TEXT or 
     BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

[mysqld]

innodb_log_file_size = 512M

innodb_strict_mode = 0

ubuntu 16.04 путь редактирования:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

в MS Windows путь будет чем-то вроде:

C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

Не забудьте перезапустить службу (или перезагрузить компьютер)


недавно я создал таблицу с 82 столбцами и имел ту же ошибку с InnoDB. Чтобы обойти проблему, мы переключили формат таблицы на MyISAM поскольку он использовался только для базовой формы.


MySQL довольно ясно о своем максимальном размере строки:

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

. . .

отдельные механизмы хранения могут вводить дополнительные ограничения, которые ограничить количество столбцов таблицы. Примеры:

InnoDB позволяет до 1000 столбцы.

InnoDB ограничивает размер строки чем-то меньше половины страницы базы данных (приблизительно 8000 байт), не включая VARBINARY, VARCHAR, BLOB или текстовые колонки.

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

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


Я просто хочу предоставить некоторым другим людям помощь с более серьезным вариантом этой проблемы. В некоторых ситуациях ошибка ("размер строки слишком большой .. Изменение некоторых столбцов в текст или BLOB") будет происходить даже с операторами" alter table drop column "и" alter table modify column"!

следовательно, вы можете полностью застрять, не в состоянии изменить varchar на текст или удалить столбцы (попытка решить проблему по иронии судьбы приводит к тому же сообщение.)

Если у вас есть эта проблема, решение изменить или удалить несколько столбцов сразу. Вы можете сделать это в MySQL с синтаксисом "alter TABLE example drop column a, drop column b, drop column c", и если вы отбросите достаточно столбцов сразу, он фактически выполнит, а не поднимет ошибку.


для MySQL 5.7 на Mac OS X El Capitan:

OS X предоставляет пример файлов конфигурации в /usr / local/mysql/support-files / my-default.cnf

чтобы добавить переменные, сначала остановите сервер и просто скопируйте файл выше, /usr/local/mysql/etc/my.cnf

cmd : sudo cp /usr/local/mysql/support-files/my-default.cnf /usr/local/mysql/etc/my.cnf

Примечание: создайте папку " etc " под "mysql" в случае, если она не существует.

cmd : sudo mkdir /usr/local/mysql/etc

после того, как мой.cnf создается под etc. пришло время установить переменную внутри этого.

cmd: sudo nano my.cnf

установить переменные ниже [тузды]

[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0

теперь запустите сервер!


изменение в MyISAM не является решением. Для innodb following работал для меня.

установить следующие на мой.cnf

innodb_strict_mode = 0


Я также столкнулся с этим. Изменение "innodb_log_file_size", "innodb_log_buffer_size" и других настроек в " my.ini " файл не решил мою проблему. Я передаю его, изменяя типы столбцов "текст" на varchar(20) и не используя значения varchar больше 20 . Возможно, вы также можете уменьшить размер столбцов, если это возможно. текст - - - >varchar (20) varchar(256) --> varchar (20)


что исправил мой, чтобы добавить

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;

в начале моей ".sql " файл, как говорится в: https://gist.github.com/tonykwon/8910261


(РЕАЛЬНОЕ РЕШЕНИЕ MYSQL 5.7)

я столкнулся с той же ошибкой на новейшем сервере mysql (5.7.21):

размер строки слишком большой (>8126). Изменение некоторых столбцов на TEXT или BLOB может помочь. В текущем формате строки префикс BLOB 0 байт хранится в строке.

потратив несколько часов на чтение руководства MYSQL, нашел решение!

ключевой параметр: innodb_page_size

поддержка размеров страниц 32k и 64k была добавлена в MySQL 5.7. Для 32K и 64k страниц максимальная длина строки составляет приблизительно 16000 байт.

фишка в том, что этот параметр может быть изменен только во время инициализации экземпляра службы mysql, so он не влияет, если вы измените этот параметр после того, как экземпляр уже инициализирован (самый первый запуск экземпляра).

innodb_page_size может быть настроен только до инициализации экземпляра MySQL и не может быть изменен после этого. Если значение не указано, экземпляр инициализируется с использованием размера страницы по умолчанию. См. Раздел 14.6.1, "Конфигурация Запуска InnoDB".

поэтому, если вы не измените это значение в my.ini перед инициализацией значение по умолчанию будет 16K, которое будет иметь ограничение размера строки ~8K. Вот почему возникает ошибка.

Если вы увеличиваете innodb_page_size, то innodb_log_buffer_size необходимо также увеличить. установите его по крайней мере на 16M. также, если ROW_FORMAT имеет значение сжатый вы не можете увеличить innodb_page_size до 32k или 64K. Он должен быть динамическим (по умолчанию в 5.7).

ROW_FORMAT=COMPRESSED не поддерживается, если innodb_page_size имеет значение 32KB или 64KB. Для innodb_page_size=32k размер экстента составляет 2 МБ. Для innodb_page_size=64k, размер экстента 4 МБ. innodb_log_buffer_size должен быть установлен как минимум 16M (по умолчанию) при использовании 32K или 64k размеров страниц.

кроме того,значение параметра innodb_buffer_pool_size должно быть увеличено с 128 м до 512 м по крайней мере, в противном случае вы получите ошибку при инициализации экземпляра (у меня нет точной ошибки).

после этого ошибка размера строки исчезла.

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

параметры, которые я изменил и работает (после создания нового экземпляра и инициализации с моей.ini, который сначала изменяется с этими настройками):

innodb_page_size=64k
innodb_log_buffer_size=32M
innodb_buffer_pool_size=512M

все настройки и описания, в которых я нашел решение, можно найти здесь:

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

надеюсь, что это помогает!

С уважением!


есть аналогичный вопрос сегодня утром и следующим образом спас мою жизнь:

вы пытаетесь отключить innodb_strict_mode?

SET GLOBAL innodb_strict_mode = 0;

а затем повторите попытку импорта.

innodb_strict_mode включен с помощью MySQL >= 5.7.7, прежде чем был выключен.


ни один из ответов на сегодняшний день не упоминает эффект параметра innodb_page_size. Возможно, потому, что изменение этого параметра не поддерживается работа до MySQL 5.7.6. От документация:

максимальная длина строки, за исключением столбцов переменной длины (VARBINARY, VARCHAR, BLOB и TEXT), немного меньше половины страницы базы данных для размеров страниц 4KB, 8KB, 16KB и 32KB. Например, максимальная длина строки по умолчанию innodb_page_size 16KB составляет около 8000 байт. Для страницы InnoDB размером 64 КБ максимальная длина строки составляет около 16000 байт. Столбцы LONGBLOB и LONGTEXT должны быть меньше 4 ГБ, а общая длина строки, включая столбцы BLOB и TEXT, должна быть меньше 4 ГБ.

обратите внимание, что увеличение размера страницы не лишена своих недостатков. Опять же из документации:

начиная с MySQL 5.7.6, 32KB и 64KB размеры страниц поддерживаются, но ROW_FORMAT=сжатый по-прежнему не поддерживается для размеров страниц больше 16KB. Для 32KB и 64KB страниц максимальный размер записи-16KB. Для innodb_page_size=32k размер экстента составляет 2 МБ. Для innodb_page_size=64К, размер мере 4МБ.

экземпляр MySQL, использующий определенный размер страницы InnoDB, не может использовать файлы данных или файлы журнала из экземпляра, который использует другой размер страницы. Это ограничение может повлиять на операции восстановления или понижения рейтинга с использованием данных MySQL 5.6, который поддерживает размеры страниц другие, чем 16 КБ.


Если вы используете MySQLWorkbench у вас есть возможность изменить, чтобы изменить query_alloc_block_size= 16258 и сохранить его.

Шаг 1. нажмите на кнопку options file с левой стороны. enter image description here

Шаг 2: Нажмите кнопку General и выберите checkBox query_alloc_block_size и увеличить их размер. например, измените 8129 --> 16258

enter image description here


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

  1. добавьте следующее в my.файл cnf в разделе [mysqld].

    innodb_file_per_table
    innodb_file_format = Барракуда

  2. измените таблицу, чтобы использовать ROW_FORMAT=COMPRESSED.

    ALTER TABLE имя_таблицы
    Двигатель=InnoDB
    ПОМОЩЬЮ ROW_FORMAT=СЖАТОМ
    Key_block_size средства=8;

https://stackoverflow.com/a/15585700/2195130