【MySQL异常】Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNA

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【MySQL异常】Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNA

一、背景描述

MySQL版本:5.6.28, MySQL引擎 InnoDB。本地环境、开发环境、生产环境数据库版本一模一样。

昨天晚上更新一个项目至生产环境,在本地和开发环境测试的都很正常,但是到生产环境之后,其中一张表中的数据更新有异常。而这张表,不管是MySQL引擎、还是字符集、还是表结构,三个环境一模一样。这就是奇怪的地方。

二、报错内容

关键报错内容为:

Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Row size too large (> 1982). 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.

完整的报错信息如下:

2021-07-06 21:32:20.331 ERROR [http-nio-6184-exec-6][HvacModelEmbodimentServiceImpl.java:95] - E|HvacModelEmbodimentServiceImpl|updateEmbodimentById()|更新实施方案失败,【原因 =

### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Row size too large (> 1982). 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.

### The error may involve defaultParameterMap

### The error occurred while setting parameters

### SQL: UPDATE hvac_model_embodiment  SET model_id = ?,  principle_introduce = ?,   line_reserved = ?,  realize_function = ?,    embodiment_attachment = ?,    update_user = ?,   update_time = ?,   principle_introduce_image = ?,    realize_function_image = ?, line_reserved_image = ?  WHERE id = ?

### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Row size too large (> 1982). 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.

; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Row size too large (> 1982). 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.】

具体字段类型和长度如下图所示:

三、解决方案

按照报错信息提供的修改建议(Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help)

初步判断为部分字段类型和长度不满足需求,经过测试,只有principle_introduce、line_reserved、realize_function和embodiment_attachment四个字段有问题,然后修改了principle_introduce、line_reserved、realize_function和embodiment_attachment这四个字段,类型修改为text之后,这前三个字段可以正常保存成功,但是 embodiment_attachment 这个字段仍然保存失败,报错信息同上,一模一样。

于是又接着按照报错信息提供的修改建议(using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help),把行格式由Compact改为 DYNAMIC 之后 再次测试,保存成功。很完美的把问题解决了。具体修改内容如下图:

但是具体原因还没有查到。以后再深入研究。

四、拓展

根据报错信息,在网上搜索为什么会出现这样的情况,根据网上提供的一些资料,这个问题可能与不同引擎之间使用的存储格式有关。很多都说把InnoDB引擎改为MyISAM引擎即可。

而MyISAM有3种行存储格式:fixed/dynamic/compressed。InnoDb在MyIASM基础上新引入了Barracuda。至于不同引擎的默认设置,以及各种存储格式之间的区别,我也没有深入研究,以后有时间再去深入了解一下。

完结!


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
【MySQL】mysql异常宕机无法启动处理过程
【MySQL】mysql异常宕机无法启动处理过程
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
|
1月前
|
SQL 关系型数据库 MySQL
MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
这篇文章介绍了如何解决MySQL中“不能在FROM子句中指定更新的目标表”(You can't specify target table for update in FROM clause)的错误,提供了错误描述、需求说明、错误做法和正确的SQL写法。
355 0
|
3月前
|
关系型数据库 MySQL Java
解决com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large
这篇文章提供了解决MySQL JDBC驱动中`com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large`错误的步骤,主要是通过增加配置文件中的`max_allowed_packet`参数值并重启服务来允许更大的数据包传输。
解决com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large
|
3月前
|
数据采集 关系型数据库 MySQL
大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format
大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format
41 1
|
3月前
|
关系型数据库 MySQL
解决MySQL insert出现Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘xxx‘ at row 1
解决MySQL insert出现Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘xxx‘ at row 1
248 2
|
3月前
|
存储 关系型数据库 MySQL
MySQL 中的 BLOB 数据类型深入解析
【8月更文挑战第31天】
424 0
|
3月前
|
存储 XML 关系型数据库
深入理解MySQL中的BLOB和TEXT数据类型
【8月更文挑战第31天】
555 0
|
4月前
|
关系型数据库 MySQL 数据安全/隐私保护
|
8天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
22 4