赞
踩
这个错误简单理解就是单行记录的合计最大大小超过了8126字节,那么根据文档描述的话,使用dynamic行格式的表行最大大小可以达到65536字节(因为mysql内部使用了2个字节来表示字段长度,因此可以表示最大65535的长度)。那么,从65536到8126,这其中57140字节去哪里了呢?
这其实是因为mysql默认使用16k的page size,在每个data page中,除去header、footer部分,剩下的部分需要能容纳2行的内容,那么16384/2=8192就接近8126这个值了。
另外,对于这个错误,如果仔细看错误原因的话,后面还会跟着一段描述:
1,Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline;
2,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.
上面两个错误信息,前者基本出现在ROW_FORMAT<> DYNAMIC或者较早版本的情况,在其中BLOB需要存储768字节在行内部。对整个行size贡献较大。
后者基本对于较新的版本,因为默认的ROW_FORMAT=DYNAMIC,在其中,一个TEXT或者BLOB字段对行size的贡献在9-12个字节之间。
对于第一种情况,可以设置innodb_file_per_table=1,innodb_default_row_format=dynamic,又因为dynamic要求innodb_file_format必须为Barracuda,所以一般还要加上innodb_file_format=Barracuda设置。innodb_default_row_format=dynamic可以在创建表的时候动态指定。当然也可以按照提示那样的,设置
ROW_FORMAT =COMPRESSED,这个对于只读场景用处比较大,如果用于读写负载,那比较不好。
如果上面的方法仍然解决不了问题,那还有其它办法:
1,关掉innodb_strict_mode,这个选项是在创建表的时候检查行大小,如果确定实际存储的字段没有这么多,可以关掉。但是问题是如果确实有这么多内容,插入的时候会报错。SET SESSION innodb_strict_mode = OFF
2,将innodb page size调整成64K,这样,64K的page即使需要容纳2行数据的话,每行也可以最大达到32K(实际达不到,因为header和footer需要空间)。但是这个最好把现有的mysql备份出来,然后按照新的page size重新初始化,再导入备份,保证整个库都使用统一的page size大小,以免出现稀奇古怪的问题。
3,可以看到上面的提示"In current row format, BLOB prefix of 0 bytes is stored inline",把较长的字段都转成TEXT或者BLOB存储。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。