Row size too large (> 8126)

MySQL表新增字段时,出现报错:Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help

一、信息

1.1 环境

给数据表添加一个新的字段。该数据表已经有很多字段了,并且一行的字节长度远大于8126。

在本地搭建的MySQL5.7环境上新增字段并没有出错,所以是远程MySQL版本出现的问题。猜测是innodb_file_format并没有设置成正确格式。

1.2 报错

Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help

二、解决

免重启服务式解决:

1
2
mysql> set GLOBAL innodb_file_per_table = ON;
mysql> set GLOBAL innodb_file_format = barracuda;

三、分析

InnoDB格式问题:

  • InnoDB目前支持两种命名文件格式,Antelope 和Barracuda。
    • Antelope是原始 InnoDB文件格式,以前没有名称。它支持表的COMPACT和REDUNDANT行格式InnoDB
    • Barracuda是最新的文件格式。它支持所有InnoDB行格式,包括较新的COMPRESSED和 DYNAMIC行格式。与 COMPRESSED和 DYNAMIC行格式相关的特性包括压缩表、页外列的高效存储以及高达 3072 字节的索引键前缀 ( innodb_large_prefix)
1
2
# 检查表的文件格式和行格式 命令
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;

MySQL硬性条件:

65535 bytes is the max row size for mysql.

问题分析:

根据问题的提示,原因肯定是表中的字段长度和超了,所以按照修改提示,将ROW_FORMAT修改为COMPRESSED或者DYNAMIC,但又只有Barracuda文件格式支持,所以先通过set GLOBAL innodb_file_format = barracuda;将InnoDB格式修改,再修改表的ROW_FORMAT格式即可。

总结:

本地使用的版本是MySQL5.7,部署服务器版本是MySQL5.6,通过上面的检查表的文件格式和行格式命令,可以看到本地的InnoDB默认格式就是Barracuda,而远程除一个被修改的表之外,其它的全是Antelope格式,所以出现报错就是InnoDB格式和ROW_FORMAT格式导致的

参考

BOOKMARK

BOOKMARK

BOOKMARK