关于Mysql 中 Row size too large (> 8126) 错误的解决和理解

2024-06-14 21:28

本文主要是介绍关于Mysql 中 Row size too large (> 8126) 错误的解决和理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:啰嗦一嘴 ,数据库的任何操作和验证前,一定要记得先备份!!!不会有错;

文章目录

  • 问题发现
  • 一、问题导致的可能原因
    • 1、页大小
    • 2、行格式
      • 2.1 compact格式
      • 2.2 Redundant格式
      • 2.3 Dynamic格式
      • 2.4 Compressed格式
    • 3、BLOB和TEXT列
  • 二、解决办法
    • 1、修改页大小(不推荐)
    • 2、修改行格式
    • 3、修改数据类型为BLOB和TEXT列
    • 4、其他优化方式(可以参考使用)
      • 4.1 合理设置数据类型大小
      • 4.2 合理进行表结构设计
      • 4.3 更换存储引擎


问题发现

今天在导入他人项目中的sql数据库文件时,出现一个mysql的错误提示,大致描述是:
Row size too large (> 8126),英文不算好的我看字面意思,估摸着大概就是说我们插入的行数据可能太大了,超过了设定的阙值;

一、问题导致的可能原因

这个限制主要是因为MySQL内部存储机制的约束,MySQL的InnoDB存储引擎有一个最大行大小限制关于mysql引擎内容比较多,以后再专门写一篇内容好好说说;这里我们只需要知道他是目前mysql 默认的存储引擎就好啦;

而这个最大行大小限制主要由于几个因素影响:

1、页大小

页是InnoDB管理数据的最小单位,InnoDB使用16KB的页来存储数据,行数据在进行保存插入的时候,要求我们的单行数据不能跨越多于半个页(8KB)。否则数据库会自动按照是否进行溢出页的机制来处理数据;
简单说的话,其实就是数据库中的每行数据我们可以看作是一所个人专属的小房子,里面预留了一个固定的空间给他们放东西,如果放入的东西太多了,超过这个空间大小,屋主就会考虑是否可以把东西放在屋外,来保障空间不至于太过拥挤,这里的房间内的空间就是页内空间大小,房外就是多出的

2、行格式

InnoDB支持几种行格式,如compact、redundant、dynamic和compressed。其中,dynamic和compressed格式是为了解决行大小限制而引入的,允许行中的某些列(如BLOB和TEXT类型)存储在页外。
这点简单的来说,四种行格式可以看作是房屋管理办法四个准则,每个准则都有各自适用的场景和优点

关于行格式,我们这里只需要知道有哪几种,以及他们数据存储方式,各自应用场景即可;

2.1 compact格式

InnoDB的默认行格式,也是最常用常见的格式;采取的是位图压缩的存储方式;适用于大多数OLTP(在线事务处理应用场景。OLTP其实就是指那种较高并发,并且要求低延迟,专注业务操作的应用,类似银行交易、订单处理、库存更新那些情况比较常用;

2.2 Redundant格式

MySQL 5.0以前的默认行格式;适用具有大量NULL值的表;

2.3 Dynamic格式

从 MySQL 5.6.3 开始,默认的行格式是 DYNAMIC,Dynamic行格式具有高度的灵活性,可以动态地调整行的大小和存储方式。基于实际数据长度大小来进行调整存储空间,以节省存储空间;适用于包含大量长度可变列的表,例如包含TEXT、BLOB等大型字段的表。

2.4 Compressed格式

Compressed行格式采用压缩存储方式,它适用于存储大量重复数据或较大的表。Compressed行格式使用多种压缩算法,如Zlib和LZO等,能够显著减少磁盘I/O操作,提高存储和读取性能

3、BLOB和TEXT列

这点因素与上面那点有关,Blob 和 Text 是mysql中的大数据存储类型,但是在我们不设置行模式为ynamic和compressed的时候,这些列通常存储在页外,但它们的元数据(如长度)仍然存储在行内,而这个存储的大小行格式的设置会有所不同。也就是说明他会计入行大小限制的计算

二、解决办法

好了,既然知道问题原因的可能了,现在就是开始如何解决了;

1、修改页大小(不推荐)

虽然mysql InnoDB的引擎默认的页大小是16KB,但是这个值并不是不能修改,修改配置文件;
添加或修改innodb_page_size参数来设置新的页大小。例如,innodb_page_size = 16384(以字节为单位,对应16KB),或者设置的更大;
不过需要注意的是:页大小的调整最好是在数据库初始化的初期去设置,一旦数据库初始化完成后,就不建议更改了,这种情况下意味着你原来已经存在的所有ibdata和ib_logfile文件都需要重建,那就不是很合适了,而且这样做也可能会带来一定的性能影响;

2、修改行格式

既然dynamic和compressed行格式就是为了解决行大小限制而引入的,我们可以修改该格式即可;当然了,我们也不是都要去修改这个,这个也是和我们的mysql版本有关的;

从 MySQL 5.6.3 开始,默认的行格式是 DYNAMIC,也就是说,其实在这个版本之后的我们其实就不需要修改行格式了;
不过如果你和博主一样是通过导入sql文件的方式创建的表的话,需要确认你的sql文件中是否有另外定义行格式;例如:
在这里插入图片描述
博主虽然数据库是8.0+,默认行模式已经是DYNAMIC,但是对方给的sql文件创建表的语句中指定了Compact行格式,这个原因大概率是因为它在导出时候环境是基于mysql5.x,而博主是8.0+的,所以这里导出的时候会有所出入;这里我讲所有的行模式设置都去掉了,默认就会按照DYNAMIC设置,就不会报错了;因此我们在做不同版本mysql的数据导入与导出时,需要特别小心版本不同带来的影响

3、修改数据类型为BLOB和TEXT列

如果你本来该字段就会需要存储较大的数据,就应该用blob和text来替换原来的数据类型VARCHAR或CHAR,这样能让数据大部分存储在溢出页中,而不去纳入大小限制的值计算;而如果我们之前设置了行模式的话,这个纳入计算的值占用会更小;

4、其他优化方式(可以参考使用)

4.1 合理设置数据类型大小

在进行表设计时候,一些列字段我们根据实际需要设计,例如varchar数据类型,如果实际存储值不大,长度就定义足够空间大小即可(即能用varchar64就不用varchar128,能用128就不要用256,尽可能合理分配空间);

4.2 合理进行表结构设计

如果设计表的时候,单表列尽量不要太多,适当的进行拆表将列分出去,也能在一定横渡上避免问题;

4.3 更换存储引擎

换另一种存储引擎,这个方法的话见仁见智,要根据自己的业务场景来抉择了,比如MyISAM引擎最大的缺点就是它不支持事务和高并发,所以才使得大多数情况下我们仍然在用InnoDB引擎的原因,虽然它读写性能上并没有前者优秀;

这篇关于关于Mysql 中 Row size too large (> 8126) 错误的解决和理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061552

相关文章

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直