代码轮子

Mysql 出现Error 1118 Row size too large. The maximum row size is 65535 的解决办法

2018年9月27日 0

(仅作记录,下面的解决步骤我试了一下还是会报同样的错误,问题没有解决,只好把varchar类型的大小挨个的改小了一点。若是哪位大神调好了,还请指点一二。)

 

解决步骤

1.     在MySQL的配置文件中添加:

[mysqld]

max_allowed_packet=16M

2.     在MySQL的配置文件中添加:

[mysqld]

innodb_file_per_table=1

3.     修改MySQL全局变量:

SET GLOBAL innodb_file_format=’Barracuda’;

4.     删除原表,创建一个新表,并设置表的属性:

ROW_FORMAT=COMPRESSED

例:

SET GLOBAL innodb_file_format='Barracuda';
SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `cdfd`;
CREATE TABLE `cdfd` (
  `Title_ZH` varchar(255) DEFAULT NULL COMMENT '中文题名',
  `Title_EN` varchar(255) DEFAULT NULL COMMENT '英文题名',
  `FileName` char(24) DEFAULT NULL COMMENT '文件名',
   ......  ......
   ......  ......<pre name="code" class="sql">  `Author_Code` varchar(255) DEFAULT NULL,
  `Unit_Code` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

 


参考:(1)http://www.cnblogs.com/gaizai/archive/2012/09/20/2695663.html

(2)http://blog.csdn.net/arbel/article/details/8042050

(3)http://www.cnblogs.com/billyxp/p/3342969.html

一、背景

我们的MySQL数据库有一张10个Text的字段的表,还包括几个char和varchar字段,由于业务需求,我在表中加多一个Text字段的时候,插入记录的出现了下面的错误:

Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs

(图1:错误信息)

二、过程

首先我们执行下面的SQL,查看这个表的相关信息:

SHOW TABLE STATUS LIKE ‘eventanalysis%’;

(图:表信息)

从上面的这个表使用的Row_format是Compact,这个跟我们上面出现的错误有什么关系呢?

首先让我们来了解下Row_format的Compact,【MySQL技术内幕InnoDB存储引擎】书中的第4.4节(83-98页)中提到:

1.     Compact行记录是在MySQL 5.0时被引入的,其设计目标是能高效存放数据。

2.     Redundant是MySQL 5.0版本之前InnoDB的行记录存储方式。

3.     InnoDB存储引擎可以将一条记录中的某些数据存储在真正的数据页面之外,即作为行溢出数据。一般认为BLOB、LOB这类的大对象列类型的存储会把数据存放在数据页面之外,这个理解有点偏差,BLOB可以不将数据放在溢出页面,而即使是varchar列数据类型,依然有可能存放为行溢出数据。

4.     Oracle VARCHAR2最大存放4000个字节,SQL Server 最大存放8000个字节,MySQL的VARCHAR可以存放65535个字节。

5.     TXET(一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。)

6.     MEDIUMTEXT(一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。)

7.     VARCHAR(N)中,N指的是字符的长度,VARCHARL类型最大支持65535指的是65535个字节。

8.     在Compact行记录中,数据页只保存数据的钱768个字节,实际数据保存在BLOB页中。

9.     Barracuda文件格式下拥有两种新的行记录格式Compressed和Dynamic两种,新的两种格式对于存放BLOB的数据采用了完全的行溢出的方式,在数据页中只存放20个字节的指针,实际的数据都存放在BLOB Page中,而之前的Compact和Redundant两种格式会存放768个前缀字节。Compressed行记录格式的另一个功能就是存储在其中的数据会以zlib的算法进行压缩。

通过上面的一些了解,MySQL默认是使用Compact行记录的,所以我决定修改表结构,修改为Barracuda中的Compressed行记录。

在创建表的SQL语句中加入粗体内容:ENGINE=INNODB AUTO_INCREMENT=202 DEFAULT CHARSET=utf8ROW_FORMAT=COMPRESSED;

(一) 执行创建表SQL的时候出现下面的错误信息:

0 row(s) affected, 2 warning(s)

Execution Time : 0.090 sec

Transfer Time  : 1.066 sec

Total Time     : 1.056 sec

Warning Code : 1478

InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table.

Warning Code : 1478

InnoDB: assuming ROW_FORMAT=COMPACT.

(二) 根据上面的提示,设置innodb_file_per_table,重启MySQL后,再次执行创建表SQL,出现下面的错误:

135 row(s) affected, 2 warning(s)

Execution Time : 4.004 sec

Transfer Time  : 1.064 sec

Total Time     : 5.069 sec

Warning Code : 1478

InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope.

Warning Code : 1478

InnoDB: assuming ROW_FORMAT=COMPACT.

(三) 根据提示,执行下面的SQL:SET GLOBAL innodb_file_format=’Barracuda’;再次执行创建表的SQL,这次终于成功了,没有报错了。通过SQL:SHOW TABLE STATUS LIKE ‘eventanalysis%’;查看新表(eventanalysis4)信息:

(图:row_format)

三、解决步骤

1.     在MySQL的配置文件中添加:

[mysqld]

max_allowed_packet=16M

2.     在MySQL的配置文件中添加:

[mysqld]

innodb_file_per_table=1

3.     修改MySQL全局变量:

SET GLOBAL innodb_file_format=’Barracuda’;

4.     删除原表,创建一个新表,并设置表的属性:

ROW_FORMAT=COMPRESSED

四、知识点

ROW_FORMAT几个典型值:

ROW_FORMAT=COMPACT

ROW_FORMAT=REDUNDANT

ROW_FORMAT=COMPRESSED

ROW_FORMAT还有其他一些值:

DEFAULT

FIXED

DYNAMIC

COMPRESSED

REDUNDANT

COMPACT

五、参考文献

《MySQL技术内幕InnoDB存储引擎》

Exploring New Features in InnoDB Plugin-1.0

Issue with maximum row size in MySQL

max-allowed-packet

Innodb row size limitation

Mysql的row_format

mysql 5.1 innodb plugin压缩测试

MySQL字段类型详解

MySQL TEXT数据类型的最大长度

转自:Mysql 出现Error 1118 Row size too large. The maximum row size is 65535 的解决办法
本网站仅供学习交流使用,如果侵犯了您的权益,请留言我们将及时删除。

评论列表

发表评论

微信扫一扫 微信公众号