mysql事故复盘: 单行字节最大阈值65535字节(原创)

2024-04-24 15:20

本文主要是介绍mysql事故复盘: 单行字节最大阈值65535字节(原创),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

记得还在银行做开发,投产上线时,项目发版前,要提DDL的sql工单,mysql加1个字段,因为这张表为下游数据入湖入仓用的,长度较大。在测试库加字段没问题,但生产库字段加不上。

先说结论

投产前,开发同学测试库和生产库,没对比出字段长度不一致,在 MySQL 中,每行的最大大小限制通常是 65535 字节(即 64KB 减去一些开销),当新增字段时,超了这个阈值,导致新字段加不上。

前置知识

在 MySQL 中,每行的最大大小限制通常是 65535 字节(即 64KB 减去一些开销),这个限制适用于所有列的总和,不仅仅是 VARCHAR 列。当你说“每行 VARCHAR 阈值最小是 65535”时,这个表述可能有些误导。实际上,65535 字节是整行的最大大小限制,而不是 VARCHAR 列的最小或最大阈值。

VARCHAR 列本身有一个最大长度限制,这个限制取决于 MySQL 的版本和配置。在大多数情况下,单个 VARCHAR 列的最大长度可以达到 65535 字节,但这实际上是不现实的,因为还需要考虑行中的其他列以及存储引擎所需的元数据。实际上,单个 VARCHAR 列的长度很少会接近这个数值,因为还需要考虑其他列和行的总大小限制。

更常见的情况是,你会遇到由于整行大小超过限制而导致的错误。当定义表时,你需要确保所有列的总和(包括 VARCHAR、TEXT、BLOB 和其他类型)不会接近或超过这个限制。如果接近或超过限制,你可能需要调整列的数据类型、大小或使用其他策略来减少行的大小。

请注意,TEXT 和 BLOB 类型的列在存储时不会计入每行的 65535 字节限制,因为它们的值存储在表的外部,只在表中保留一个指针。因此,如果你需要存储大量数据,考虑使用这些类型而不是增加 VARCHAR 列的大小。

总结起来,每行的最大大小限制是 65535 字节,而不是 VARCHAR 列的最小或最大阈值。在设计表结构时,需要确保所有列的总大小不会接近或超过这个限制。

场景复现

本地环境复现
mysql版本8.0.33
数据库字符集utf8mb4
比如有张t_user表,表结构如下:

CREATE TABLE `t_user` (`name` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',`address` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '住址',`dept` varchar(10000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '部门',`position` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '职务',`work` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '工作'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

现打算加个salary字段
执行如下sql

ALTER TABLE t_user
ADD salary VARCHAR(500);

发现新字段添加失败,报错:1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
在这里插入图片描述

分析

在 utf8mb4 字符集情况下(这是为了支持所有的 Unicode 字符,包括表情符号),1个字符可能需要最多 4 个字节。因此,在 utf8mb4 字符集中,VARCHAR(10) 字段可能最多占用 40 个字节。
上述t_user表单行数字节总数=(1000+2000+10000+1000+2000+500)*4=66000 > 65535最大阈值, 所以salary字段自然加不上。

警示

当设计表和新增字段时,一定用合理的字段长度,注意单行最大字节阈值65535,生产提交DDL工单加字段前,比较好测试库和生产库是否一致。

这篇关于mysql事故复盘: 单行字节最大阈值65535字节(原创)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu