Mysql导入sql文件报错 Row size too large (> 8126) 的解决方案

产生这个问题的原因是InnoDB 表的最大行限制设置的大小:

引用网上的描述:

原因是因为mysql-innodb是按照page存储数据的,每个page max size是16K,然后每个page两行数据,所以每行最大8K数据。如果你的字段是blob之类的话,会存储在page之外的溢出区里。

但是innodb默认的approach(羚羊)存储格式会把每个blob字段的前864个字节存储在page里,所以你的blob超过一定数量的话,单行大小就会超过8k,所以就报错了。

也都会给出对应的解决方案:

解决方式是使用innodb的Barracuda(梭鱼)存储格式。这种格式对blob字段的处理方式是在page里面只存储一个20byte大小的指针,其他完全存在溢出区,所以轻易不会超过8K.

方案对应的操作就是加下面两个参数:

ROW_FORMAT= DYNAMIC

innodb_file_per_table=1

但是这个方案不适合sql文件批量导入,因为表是随着sql一起导入的,在不修改sql文件的情况下,无法先建表再导入数据。

冥思苦想,最后发现在刚刚的描述中,问题的根源是page max size的默认16K不够用,如果我把它加倍呢?

innodb_page_size=32K

再重新启动mysql的时候,启动失败,查看日志有报错:之前的日志文件是按照16KB分页的,但是现在是默认32KB分页,不兼容。因为我本地是测试环境,我直接把所有数据库都删掉了,重新建库建表,问题就解决了。但是如果是线上环境,那么可能得考虑其他解决方案,或者想办法把原有数据处理一下。

posted @ 2021-11-30 09:45  Mr.白板  阅读(1879)  评论(4编辑  收藏  举报