MYSQL5.7同步数据到5.6失败,单行数据超过8126字节时,行溢出导出数据同步失败

报错日志:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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.

 

问题原因:

1、在mysql innodb存储引擎中,数据是以页为单位进行存储的,每个页默认大小为16KB(由innodb_page_size配置选项定义),innodb又规定每页至少需要存储两行数据,所以innodb行最大存储略小于8KB的数据(除去页头页尾等占用的大小)。
2、如果包含可变长度列(varchar等)的行超过innodb行最大存储大小,innodb将选择可变长度列进行外部页存储,直到该行符合innodb行大小限制。
3、在mysql 5.6版本中支持的行格式有:REDUNDANT和COMPACT,在这两种行格式中,将变长列值(varchar、varbinary、blob和文本类型)的前768个字节存储在innodb页中,这样当表中的可变长列的个数超过一定数量后,单行大小就可能会超过8KB,就会发生行溢出现象。
而在mysql 5.7版本中,新增加两个行格式:DYNAMIC和COMPRESSED,在这两种行格式中,将变长列值(varchar、varbinary、blob和文本类型)完全存储在溢出页,innodb页中只包含指向溢出页的20字节指针。
所以当表中的可变长列的个数相等的情况下,由于底层行格式机制的不同,在mysql 5.7版本中就不会发生行溢出,但在mysql 5.6版本中就可能会出现行溢出。
 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值