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 | mysql> set GLOBAL innodb_file_per_table = ON; |
三、分析
InnoDB格式问题:
- InnoDB目前支持两种命名文件格式,Antelope 和Barracuda。
- Antelope是原始 InnoDB文件格式,以前没有名称。它支持表的COMPACT和REDUNDANT行格式InnoDB
- Barracuda是最新的文件格式。它支持所有InnoDB行格式,包括较新的COMPRESSED和 DYNAMIC行格式。与 COMPRESSED和 DYNAMIC行格式相关的特性包括压缩表、页外列的高效存储以及高达 3072 字节的索引键前缀 ( innodb_large_prefix)
1 | # 检查表的文件格式和行格式 命令 |
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格式导致的。
参考
原文链接: https://www.delta1037.cn/2023/Bugsfix/Rowsizetoolarge(-8126)/
版权声明: 转载请注明出处.