前段时间在项目压测的时候出现了mysql的大字段问题,导致数据层无法存储。各方找人求助,都无果,最后求助万能的google,找到国外高人的解决方案,一步步来,终于解决了。这后来也没写总结,只是写了一篇简单的有道云笔记,结果今天线上的版本又出了这个问题,才不免责怪自己怎么没有发一篇详细博文记录,以及及时的分享给兄弟们(没办法最近太忙了,忙出翔来了)。
【问题描述】
最早mysql端报这个错
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
今天线上版本的错误:
Caused by: 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.
【导致问题的原因】
总结了下原因是因为mysql-innodb是按照page存储数据的,每个page max size是16k,然后每个page两行数据,所以每行最大8k数据。如果你的字段是blob之类的话,会存储在page之外的溢出区里。
但是innodb默认的approach(羚羊)存储格式会把每个blob字段的前864个字节存储在page里,所以你的blob超过一定数量的话,单行大小就会超过8k,所以就报错了
【解决思路】
解决方式是使用innodb的Barracuda(梭鱼) 存储格式
这种格式对blob字段的处理方式是在page里头只存储一个20byte大小的指针,其它全存在溢出区,所以你轻易超不了8k
【详细步骤】
1. 打开mysql的配置my.ini。在innodb配置出添加:innodb_file_per_table=1
Mysql的大字段问题
大概的意思就是打开mysql每张表都是独立存储空间的开关。
2. 然后命令检查下上述开关是否打开。
show variables like '%per_table%';
Mysql的大字段问题
如上图开关就打开了。
3. 设置mysql全局变量:innodb_file_format = Barracuda(梭鱼)
命令:set GLOBAL innodb_file_format = 'Barracuda';
然后检查下是否设置好了:
命令:show GLOBAL VARIABLES LIKE '%file_format%';
Mysql的大字段问题
如上就是好了
4. 设置对应表的属性:ROW_FORMAT=COMPRESSED
然后检查下标的属性是否是你设置的:COMPRESSED
5. 如上步骤以后,就OK了
今天又让tx折腾一天,MD。长记性,再忙也要记录,要给团队分享,希望我们团队,我的兄弟们,我们公司积累越来越多的财富。
相关推荐
在MySQL数据库管理中,添加字段是一项常见的操作,用于在已有的数据表中增加新的列来扩展数据表的结构。这通常发生在数据需求发生变化或者需要记录更多相关信息时。本篇文章将详细探讨如何在MySQL中添加字段,以及...
MySQL数据库字段复制是一个常见的需求,尤其在数据迁移、备份或者多环境同步的场景下。PHP作为流行的服务器端脚本语言,常被用来处理这类任务。本文将深入探讨如何使用PHP来实现MySQL数据库字段的高效复制。 首先,...
本文将深入探讨如何解决在使用CodeSmith时遇到的无法读取MySql数据库字段说明的问题。CodeSmith是一款强大的C#代码生成工具,它允许开发者自定义模板来快速生成代码,从而减少手动编写重复性代码的工作量。然而,在...
mysql添加字段语句
在使用mysql的过程中,有个问题就是mysql的优化,mysql中longblob字段在5.5版本中默认的为1M。 想改变这个问题,需要注意几点: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (2054817 > ...
mysql获取字段中内容
MySQL 字段加密 MySQL 字段加密是将数据库字段类型设置为 varbinary 类型,并将加密盐设置为全局变量,以实现对敏感数据的保护。本文将详细介绍 MySQL 字段加密的实现步骤和相关知识点。 数据库字段类型 在 MySQL...
MySQL批量对表增加指定字段,会快速实现批量字段的添加。写了2个存储存储过程,执行即可。方便快速!
理解这些知识点对于管理和维护MySQL数据库中的自增字段至关重要,可以帮助避免潜在的问题并优化数据存储效率。根据实际需求选择合适的存储引擎,以及正确处理自增字段的删除和初始化,能有效提升数据库的性能和管理...
自己写的一个获取字符串字段中数字的函数,已测试通过可用。
其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。...
MySQL 自增长时间字段详解 MySQL 是一种广泛应用的关系型数据库管理系统,具有强大的数据存储和管理能力。在实际应用中,我们经常需要对数据进行自增长和时间戳记录,本文将详细介绍 MySQL 中的自增长和时间字段的...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,其字段类型设计得非常灵活,以适应各种数据存储需求。在MySQL中,字段类型决定了数据的存储方式、大小和格式。以下是对MySQL5中常见字段类型的详细说明: 1. **...
Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_...
在别人基础上修改了一下。 感性原作者的奉献 一起贡献都归功与原作者
"MySQL自增字段报错解决方案" MySQL自增字段报错是指在MySQL数据库中,自增字段出现重复值或无法再添加新记录的...MySQL自增字段报错需要我们具备一定的数据库知识和解决方案,以便快速解决问题和避免类似问题的出现。
本文主要针对"CodeSmith无法读取MySQL字段备注说明"的问题提供解决方案,并详细介绍相关知识点。 CodeSmith是一款强大的代码生成工具,它允许开发者通过模板语言自动生成代码,如实体类、DAL、BLL等,大大减少了...
mysql导出工具,可导出无注释插入语句,表中字段有blob类数据,插入语句前还有锁表操作语句,适合多种场景
在给定的标题"自动读取mysql数据库字段并自动生成java属性和set和get方法"中,我们可以理解这是一个自动化过程,它减少了开发者手动编写Java代码的工作量。该过程通常包括以下几个步骤: 1. **连接数据库**:首先,...