MySQL:错误代码:1118行大小太大(> 8126)。将某些列更改为TEXT或BLOB

时间:2014-03-25 14:35:31

标签: mysql sql create-table

我想创建一个 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;

我用TEXT替换了所有VARCHAR,并在MySQL的my.ini文件中添加了 Barracuda ,这是添加的属性:

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.

编辑:我无法更改数据库的结构,因为它是遗留的应用程序/系统/数据库。创建一个新表,它是遗留数据库的导出。

EDIT2:我写的这个问题与其他人类似,但内部有一些我在互联网上找到的解决方案,如VARCHAR和Barracuda,但我仍然有这个问题所以我决定打开一个新的问题已经内部的经典答案看是否有人有其他答案

29 个答案:

答案 0 :(得分:49)

由于MySQL Server 5.6.20的更改,我最近遇到了相同的错误代码。 我能够通过更改my.ini文本文件中的innodb_log_file_size来解决问题。

在发行说明中,解释了innodb_log_file_size太小会触发“行大小太大的错误”。

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

答案 1 :(得分:41)

我在这里尝试了所有解决方案,但只有这个参数

innodb_strict_mode             = 0

解决了我的一天......

从手册:

  

innodb_strict_mode设置会影响语法错误的处理   用于CREATE TABLE,ALTER TABLE和CREATE INDEX语句。   innodb_strict_mode还启用记录大小检查,以便INSERT   或者UPDATE永远不会失败,因为记录太大了   选择的页面大小。

答案 2 :(得分:21)

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

不要忘记重新启动服务(或重新启动计算机)

答案 3 :(得分:10)

对于MariaDB用户(版本> = 10.2.2)和MySQL(版本> = 5.7),简单的解决方案是:

ALTER TABLE `table` ROW_FORMAT=DYNAMIC;

答案 4 :(得分:7)

我最近创建了一个包含82列的表,并且与InnoDB有相同的错误。 为了绕过这个问题,我们将表格格式转换为MyISAM,因为它只用于基本表格。

答案 5 :(得分:6)

(REAL SOLUTION MYSQL 5.7)

我在当前最新的mysql服务器(5.7.21)上遇到了同样的错误:

行大小太大(> 8126)。将某些列更改为TEXT或BLOB可能会有所帮助。在当前行格式中,0字节的BLOB前缀以内联方式存储。

在花了几个小时阅读MYSQL手册后,找到了解决方案!

关键参数是: innodb_page_size

  

MySQL 5.7中添加了对32k和64k页面大小的支持。对于32k和64k页面大小,最大行长度约为16000字节。

诀窍是这个参数 只能在mysql服务实例的INITIALIZATION 期间更改,所以如果你改变它就没有任何影响实例初始化后的参数(实例的第一次运行)。

  

innodb_page_size只能在初始化MySQL实例之前配置,之后不能更改。如果未指定任何值,则使用默认页面大小初始化实例。请参见第14.6.1节“InnoDB启动配置”。

因此,如果在初始化之前未在my.ini中更改此值,则默认值为16K,其行大小限制为~8K。这就是错误出现的原因。

如果增加innodb_page_size,则还必须增加 innodb_log_buffer_size 将其设置为至少16M。此外,如果ROW_FORMAT设置为 COMPRESSED ,则无法将innodb_page_size增加到32k或64K。它应该是DYNAMIC(默认为5.7)。

  当innodb_page_size设置为32KB或64KB时,

不支持ROW_FORMAT = COMPRESSED。对于innodb_page_size = 32k,范围大小为2MB。对于innodb_page_size = 64k,范围大小为4MB。使用32k或64k页面大小时,innodb_log_buffer_size应设置为至少16M(默认值)。

此外 innodb_buffer_pool_size 至少应从 128M增加到512M 否则您将在实例的初始化上遇到错误(I没有确切的错误。)

此后,行大小错误消失了。

这个问题是您必须创建一个新的MySql实例,并将数据从旧的DataBase实例迁移到新的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

希望这有帮助!

问候!

答案 6 :(得分:4)

MySQL非常清楚它的最大行大小:

  

每个表(无论存储引擎如何)的最大行大小为   65,535字节。存储引擎可能会对此施加其他限制   限制,减少有效最大行大小。

。 。

  

单个存储引擎可能会施加额外的限制   限制表列数。例子:

     

InnoDB最多允许1000列。

     

InnoDB将行大小限制为小于数据库页面的一半   (大约8000字节),不包括VARBINARY,VARCHAR,BLOB或   TEXT专栏。

     

不同的InnoDB存储格式(COMPRESSED,REDUNDANT)使用不同   页眉和预告片数据的数量,这会影响数量   存储可用于行。

如果您有325个重复的列集,则超出了几个限制。这也是一种可疑的数据格式。对于所需的表,每行应该有325行,每列一列。

答案 7 :(得分:4)

在MacOS(使用Brew)上将SQL转储(从MySQL 8)导入MariaDB时,我遇到了问题。

首先编辑您的my.cnf
如果您使用Brew,则通常将其存储在/usr/local/etc/

pico /usr/local/etc/my.cnf

将此添加到配置中:

[mysqld]
innodb_log_file_size = 1024M
innodb_strict_mode = 0

然后重新启动MariaDB:

brew services restart mariadb

请注意,这是一种解决方法,而不是解决方法,因为在未解决问题的情况下转为严格模式,但这是我的本地环境,而不是生产环境,所以我可以接受。

答案 8 :(得分:4)

我只是想为其他人提供一个更严重的问题变体帮助。在某些情况下,即使使用“alter table drop column”和“alter table modify column”语句,也会出现错误(“行大小太大......将某些列更改为TEXT或BLOB”)!

因此,您可能会完全陷入困境,无法将varchar更改为文本或删除列(尝试解决问题会产生相同的消息)。

如果您遇到此问题,解决方案是一次更改或删除多个列。您可以在MySQL中使用“alter table example drop column a,drop column b,drop column c”的语法执行此操作,如果您一次删除足够的列,它将实际执行而不是引发错误。

答案 9 :(得分:3)

对于Mac OS X上的MySQL 5.7 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

注意:创建'等'文件夹下的' 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

现在启动服务器!

答案 10 :(得分:3)

更改为MyISAM不是解决方案。对于为我工作的innodb来说。

在my.cnf上设置以下内容

innodb_strict_mode = 0

答案 11 :(得分:3)

我在Windows 10上使用XAMPP,并且在使用PHPMyAdmin时遇到此问题。

enter image description here

当我将innodb_log_file_size = 500Minnodb_log_buffer_size = 800M添加到我的my.ini文件中时,MySQL无法启动。

所以我尝试删除(ib_logfile0)中的ib_logfile1C:\xampp\mysql\data,但这根本没有帮助。

幸运的是我可以重新安装(无论如何我都需要升级XAMPP)

在我看来,最简单的解决方案是在innodb_strict_mode=0文件中设置my.ini

此后,我就可以创建表了。

STEPS:

  1. 完全关闭XAMPP。
  2. 编辑my.ini文件(位于C:\xampp\mysql\data中),在InnoDB部分中添加innodb_strict_mode=0
  3. 启动XAMPP并再次导入表。

N.B以ADMIN的身份完成这些步骤

答案 12 :(得分:3)

innodb_log_file_size=512M

innodb_strict_mode=0

在MySQL配置中,这两行对我有用!

答案 13 :(得分:2)

我也遇到过。改变" innodb_log_file_size"," innodb_log_buffer_size"以及" my.ini"中的其他设置文件没有解决我的问题。我通过改变我的列类型来传递它" text"到varchar(20)并且不使用大于20的varchar值。如果可能的话,也许你可以减小列的大小。 文本-​​--> VARCHAR(20) varchar(256) - > varchar(20)

答案 14 :(得分:2)

添加了什么固定的矿井

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

在我的" .sql"的开头文件,如: https://gist.github.com/tonykwon/8910261

答案 15 :(得分:2)

我将值的长度从 varchar(255)更改为 varchar(25),更改为所有varchar列,然后得到了解决方案。

答案 16 :(得分:1)

尝试了很多事情,但是找到了解决方案,方法是在my.ini的下面添加并重新启动mysql服务。

innodb_strict_mode = 0

答案 17 :(得分:1)

我遇到了同样的问题。我在my.ini中搜索了“ innodb_strict_mode”,但找不到。

然后我添加了同样的内容,它仍然会向您显示警告,但是您可以继续。只需添加

innodb_strict_mode = 0;

答案 18 :(得分:1)

如果启用了 InnoDB 严格模式,则会显示此错误。

检查是否启用

SHOW  variables LIKE '%strict%';

如果启用则您可以禁用。

SET GLOBAL innodb_strict_mode=OFF;

有关更多详细信息,请阅读here>>

答案 19 :(得分:1)

以下内容对我有用,没什么--

  

设置全局innodb_log_buffer_size = 80 * 1024 * 1024 * 1024;

  

SET GLOBAL innodb_strict_mode = 0;

希望这对某人有帮助,因为这浪费了我几天的时间,因为我试图在my.cnf中这样做很无聊。

答案 20 :(得分:1)

在DOCKER中修复MYSQL

我在这里使用@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 container lsdocker volume ls来查看所有的容器和卷,并选择两个名称,分别是您的mysql实例和mysql卷,对我来说是mysql(容器)和{ {1}}(卷)。

  3. 通过docker_data-mysql停止正在运行的实例(或者您通常会停止docker的东西)。

  4. 要删除它们,请执行docker-compose downdocker container rm mysql(请注意,名称中带有下划线和破折号)。

  5. 将这些设置添加到docker设置中的mysql块中:

docker volume rm docker_data-mysql
  1. 重新启动实例,现在应该使用新设置自动构建mysql和mysql卷。

  2. 导入数据库转储文件,也许用:

mysql:
  image: mysql:5.7.25
  command: ['--innodb_page_size=64k', '--innodb_log_buffer_size=32M', '--innodb_buffer_pool_size=512M']
  container_name: mysql
  # ...

Voila!对我来说很好!

答案 21 :(得分:1)

今天早上有类似的问题,以下方式挽救了我的生命:

您是否尝试关闭innodb_strict_mode

SET GLOBAL innodb_strict_mode = 0;

然后再次尝试导入。

innodb_strict_mode使用MySQL> = 5.7.7开启,之前是OFF。

答案 22 :(得分:0)

  • sql_mode =“”
  • innodb_strict_mode = 0
  • 酿酒服务停止了mariadb
  • 酿酒服务启动mariadb

答案 23 :(得分:0)

  

将表格式InnoDB切换为MyISAM

     
    

更改表格式

         

运行此查询

         

ALTER TABLE table_name ENGINE = MyISAM;

  

(用实际的表名替换table_name)

答案 24 :(得分:0)

如果您在Google Cloud SQL(例如mysql 5.7)上遇到此错误,那么由于可能不支持所有InnoDB标志,因此此时可能不是一个简单的解决方法。如果您像以前一样(对于旧的Wordpress设置)遇到的是Mysql 5.5,则可能意味着您需要在导出之前纠缠源数据库中的某些列类型。

可以找到其他更多信息here

答案 25 :(得分:0)

在我的情况下,它是来自表格列数和行大小的限制的套管 并且在这个答案中描述的更改节省了我的一天。

  1. 将以下内容添加到[mysqld]部分下的my.cnf文件中。

    innodb_file_per_table
     innodb_file_format = Barracuda

  2. ALTER表使用ROW_FORMAT = COMPRESSED。

    ALTER TABLE table_name
        ENGINE = InnoDB的
        ROW_FORMAT = COMPRESSED
        KEY_BLOCK_SIZE = 8;

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

答案 26 :(得分:0)

我在导入数据转储时遇到了相同的问题。暂时禁用innodb严格模式可以解决我的问题。

-- shows the acutal value of the variable
SHOW VARIABLES WHERE variable_name = 'innodb_strict_mode';

-- change the value (ON/OFF)
SET GLOBAL innodb_strict_mode=ON;

答案 27 :(得分:0)

如果您使用MySQLWorkbench,您可以选择更改以更改query_alloc_block_size = 16258并保存它。

步骤1.单击左侧的options fileenter image description here

第2步:点击General,然后选择query_alloc_block_size的checkBox并增加其大小。例如,更改8129 - > 16258

enter image description here

答案 28 :(得分:0)

迄今为止的答案都没有提到innodb_page_size参数的效果。可能是因为在MySQL 5.7.6之前更改此参数不是受支持的操作。来自code credit

  

除了可变长度列(VARBINARY,VARCHAR,BLOB和TEXT)之外,最大行长度略小于4KB,8KB,16KB和32KB页面大小的数据库页面的一半。例如,16KB的默认innodb_page_size的最大行长度约为8000字节。对于InnoDB页面大小为64KB,最大行长度约为16000字节。 LONGBLOB和LONGTEXT列必须小于4GB,并且总行长度(包括BLOB和TEXT列)必须小于4GB。

请注意,增加页面大小并非没有缺点。再次来自文档:

  

从MySQL 5.7.6开始,支持32KB和64KB页面大小,但对于大于16KB的页面大小,仍不支持ROW_FORMAT = COMPRESSED。对于32KB和64KB页面大小,最大记录大小为16KB。对于innodb_page_size = 32k,范围大小为2MB。对于innodb_page_size = 64k,范围大小为4MB。

使用特定InnoDB页面大小的MySQL实例无法使用来自使用不同页面大小的实例的数据文件或日志文件。此限制可能会影响使用MySQL 5.6中的数据进行恢复或降级操作,MySQL 5.6支持16KB以外的页面大小。