关于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

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key: