MySQL排查问题row size too large (> 8126). Changing some columns to TEXT or BLOB may help.

2023-05-16

例子:给表增加一列报错:

alter table student add column `aggregate_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '聚合id'
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.

单行记录的合计最大大小超过了8126字节,那么根据文档描述的话,使用dynamic行格式的表行最大大小可以达到65536字节(因为mysql内部使用了2个字节来表示字段长度,因此可以表示最大65535的长度)

CREATE TABLE `student` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(700) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名字',
  `picture` varchar(127) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `description` varchar(1023) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `college_id` bigint(20) NOT NULL DEFAULT '0',
  `create_time` bigint(20) NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
  `data` json DEFAULT NULL COMMENT 'ext',
  `status` int(11) NOT NULL DEFAULT '0' COMMENT '状态',
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4

计算:bigint 8 byte

80*8+700+127+1023+11*4=2534

虽然没有算上json字段的长度,感觉计算结果对不上。看了一些博客修改varchar为text并不能解决,需要修改mysql的配置文件,并且重启。但实际上,很多地方修改表的字段varchar啥的都会失败,跟alter语句的执行过程有关,有兴趣可以了解下,最有效的办法就是修改key_block_size的大小。

https://blog.51cto.com/hcymysql/4369124

https://www.jianshu.com/p/2c96a7f1b8aa

经过调研,“row_size>8126”报错应该是一个固定提示,所以可以不用纠结了!

https://mariadb.com/kb/en/innodb-strict-mode/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL排查问题row size too large (> 8126). Changing some columns to TEXT or BLOB may help. 的相关文章

随机推荐