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

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

CREATE TABLE NAMESCHEMA.NAMETABLE 
(   
      ROW_ID TEXT NOT NULL ,        //this is the primary key

324 column of these types:
      CHAR(1), 
      DATE, 
      DECIMAL(10,0), 
      DECIMAL(10,7), 
      TEXT, 
      LONG,

) ROW_FORMAT=COMPRESSED;

Я заменил все VARCHAR на TEXT, и я добавил Barracuda в файл my.ini MySQL, это добавленные атрибуты:

innodb_file_per_table=1
innodb_file_format=Barracuda
innodb_file_format_check = ON

но у меня все еще есть эта ошибка:

Error Code: 1118
 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.

EDIT: я не могу изменить структуру базы данных, потому что это устаревшее приложение/система/база данных. Создание новой таблицы - это экспорт устаревшей базы данных.

EDIT2: я написал этот вопрос, похожий на других, но внутри есть какое-то решение, которое я нашел в Интернете, например, VARCHAR и Barracuda, но у меня все еще есть эта проблема, поэтому я решил открыть новый вопрос с уже классическим ответом внутри для просмотра, если у кого-то есть другие ответы

Ответ 1

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

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

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

Ответ 2

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

innodb_strict_mode             = 0

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Хитрость в том, что этот параметр может быть изменен только во время ИНИЦИАЛИЗАЦИИ экземпляра службы mysql, поэтому это не оказывает никакого влияния, если вы измените этот параметр после того, как экземпляр уже инициализирован ( самый первый запуск экземпляра).

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

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

Если вы увеличите размер innodb_page_size, значение innodb_log_buffer_size также должно быть увеличено. Установите его как минимум на 16M. Также, если для ROW_FORMAT установлено значение COMPRESSED, нельзя увеличить innodb_page_size до 32 КБ или 64 КБ. Он должен быть ДИНАМИЧНЫМ (по умолчанию в 5.7).

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

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

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

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

Параметры, которые я изменил и работает (после создания нового экземпляра и инициализации с помощью my.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

Надеюсь, это поможет!

С уважением!

Ответ 5

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

Ответ 6

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

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

.,.

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

InnoDB разрешает использовать до 1000 столбцов.

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

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

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

Ответ 7

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

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

Если у вас есть эта проблема, решение состоит в изменении или удалении сразу нескольких столбцов. Вы можете сделать это в MySQL с помощью синтаксиса "изменить столбец падения столбца таблицы a", "удалить столбец столбца b", "удалить столбец c", и если вы снимете сразу несколько столбцов, он фактически выполнит, а не приведет к ошибке.

Ответ 8

Для 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

После создания my.cnf и т.д. время для установки переменной внутри.

cmd: sudo nano my.cnf

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

[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0

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

Ответ 9

Какая фиксированная шахта должна была добавить

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

В начале моего файла .sql, как сказано в: https://gist.github.com/tonykwon/8910261

Ответ 10

Переход на MyISAM не является решением. Для innodb следующие работали для меня.

установите следующие параметры в файле my.cnf

innodb_strict_mode = 0

Ответ 11

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

Ответ 12

Имейте подобную проблему этим утром и следующим способом спас мою жизнь:

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

SET GLOBAL innodb_strict_mode = 0;

а затем попробуйте импортировать его снова.

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

Ответ 13

Следующее работает для меня, ничего больше -:

SET GLOBAL innodb_log_buffer_size = 80 * 1024 * 1024 * 1024;

а также

SET GLOBAL innodb_strict_mode = 0;

Надеюсь, это кому-то поможет, потому что это потратило пару дней моего времени, так как я пытался сделать это в my.cnf без радости.

Ответ 14

ИСПРАВЛЕНИЕ ДЛЯ MYSQL В DOCKER

Я использую отличный ответ @fefe здесь, чтобы показать, как исправить эту проблему в течение нескольких минут при использовании docker (через docker-compose). Это довольно просто, так как вам не нужно прикасаться к файлам конфигурации MySQL, но это требует, чтобы вы экспортировали и импортировали все свои данные:

Ситуация по умолчанию вашей установки MySQL, вероятно, выглядит следующим образом. Ваши данные сохраняются внутри тома data-mysql.

mysql:
  image: mysql:5.7.25
  container_name: mysql
  restart: always
  volumes:
    - data-mysql:/var/lib/mysql
  environment:
    - "MYSQL_DATABASE=XXX"
    - "MYSQL_USER=XXX"
    - "MYSQL_PASSWORD=XXX"
    - "MYSQL_ROOT_PASSWORD=XXX"
  expose:
    - 3306
  1. Сделайте резервную копию всех ваших данных/базы данных через экспорт SQL, чтобы у вас был файл .sql.gz или что-то еще. Я использую Adminer для этого.

  2. Для того, чтобы исправить (и, как объяснено в @fefe ответа) мы должны установить экземпляр MySQL с нуля, это означает, что мы должны удалить MySQL Docker контейнер и контейнер Docker объем MySQL. Сделайте docker container ls и docker volume ls чтобы увидеть все ваши контейнеры и тома, и выберите два имени, которые являются вашим экземпляром mysql и вашим томом mysql, для меня это mysql (контейнер) и docker_data-mysql (том).

  3. Остановите ваши запущенные экземпляры с помощью docker-compose down (или как обычно вы останавливаете свои вещи в docker).

  4. Чтобы удалить их, я делаю docker container rm mysql и docker volume rm docker_data-mysql (обратите внимание, что в имени есть подчеркивание И тире).

  5. Добавьте эти настройки в свой блок mysql в настройках Docker:

mysql:
  image: mysql:5.7.25
  command: ['--innodb_page_size=64k', '--innodb_log_buffer_size=32M', '--innodb_buffer_pool_size=512M']
  container_name: mysql
  # ...
  1. Перезапустите ваши экземпляры, том mysql и mysql должен быть собран автоматически, теперь с новыми настройками.

  2. Импортируйте файл дампа базы данных, возможно с:

gzip -dc < database.sql.gz | docker exec -i mysql mysql -uroot -pYOURPASSWORD

Вуаля! Работал очень хорошо для меня!

Ответ 15

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

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

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

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

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

Ответ 16

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

Шаг 1. Нажмите на options file с левой стороны. введите описание изображения здесь

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

введите описание изображения здесь

Ответ 17

В моем случае это была оболочка из Limits on Table Column Count и Row Size и выполнение изменений, описанных в этом ответе, спасло мой день.

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

    innodb_file_per_table
     innodb_file_format = Barracuda

  • ALTER таблица, использующая ROW_FORMAT = COMPRESSED.

    ALTER TABLE имя_таблицы
      ДВИГАТЕЛЬ = InnoDB
      ROW_FORMAT = COMPRESSED
      KEY_BLOCK_SIZE = 8;

fooobar.com/questions/85263/...

Ответ 18

Если вы получаете эту ошибку в Google Cloud SQL (например, mysql 5.7), то это, вероятно, в настоящее время не будет простым исправлением, поскольку не все флаги InnoDB поддерживаются. Если вы сталкиваетесь с Mysql 5.5, поскольку я был (для старой установки Wordpress), это может означать, что вам нужно будет пресекать некоторые типы столбцов в исходной базе данных до экспорта.

Более подробную информацию можно найти здесь.

Ответ 19

  Переключите формат таблицы InnoDB на MyISAM

  для изменения формата таблицы

     выполнить этот запрос

     

ALTER TABLE table_name ENGINE = MyISAM;

(замените table_name на фактическое имя таблицы)