MySQL数据库存储varchar时多大长度会出现行迁移?
最近客户现场有人问过mysql数据库的一些参数配置的问题, 这边数据库需要将strict 严格模式关掉, 目的是为了保证数据库在插入字段时不会出现8126的长度限制错误问题. 但是一直很困惑, mysql的默认安装的page 是 16kb 大小, 理论上一个页不可能超过 16000 个bytes 长度, 很多文档资料里面都有 说法是 text和blob的类型都会出现行迁移, 但是对varchar 都没有明确的说法, 今天趁着周六下了一个电子书, 将姜承尧老师的<MySQL技术内幕InnoDB存储引擎第2版> 翻了 100多页 也没翻到具体的资料, 没办法只能够进行尝试.
先说写一下结论.
varchar 在 8099 的长度时会出现行溢出迁移的现象 将字符存储到第六个数据页 varchar 8098 时 还是在当前数据也存储的, 而且应该是在第五个数据页存储.
姜老师的书里面 mysql5.6 初始化时 是 6个数据页,大小是96KB, 但是mysql 8.0.21 的版本初始一个ibd文件时 是初始化7个数据页. 大小是 112KB
1. 本来想使用 姜老师写的python脚本. 但是发现可能他的脚本仅支持mysql5.6 的版本. mysql8的版本是不支持. 无法直接使用.
会报错.
git clone https://github.com/happieme/py_innodb_page_info
cd py_innodb_page_info/
chmod 777 * -R
./py_innodb_page_info.py /var/lib/mysql/zhaobsh/test001.ibd
报错信息为:
[root@CentOS76 py_innodb_page_info]# ./py_innodb_page_info.py /var/lib/mysql/zhaobsh/test001.ibd
Total number of page: 7:
Insert Buffer Bitmap: 1
File Segment inode: 1
B-tree Node: 1
Traceback (most recent call last):
File "./py_innodb_page_info.py", line 12, in <module>
mylib.get_innodb_page_type(myargv)
File "/root/mysql/py_innodb_page_info/mylib.py", line 72, in get_innodb_page_type
print "%s: %s"%(innodb_page_type[type],ret[type])
KeyError: '45bd'
[root@CentOS76 py_innodb_page_info]#
没办法仅能够退而求其次.
先通过一个网页找到了一些关于mysql 数据页page含义的内容
来源:
http://www.blog.chinaunix.net/uid-29170515-id-5747112.html
#数据页具体内容分析 #一行代表16字节
[root@master ~]# head -n 3094 ilvtu_block.txt|tail -n 22
#u前38字节为文件头
#前4个节a1 a3 c2 67为checksum
#第5-8个字节00 00 00 03,指定页的偏移量,表明为第4个页
#第9-12个字节ff ff ff ff,当前页的上一个页,只有为数据页时,才有具体意义值
#第13-16个节ff ff ff ff,当前页的下一个页,同上
#第17-24个字节代表该页最近被修改的日志序列位置LSN,00 00 00 00 85 69 9e a4
#第25-26字节,表示页的类型,45 bf表示为数据页
#第27-34字节,共8字节,00 00 00 00 00 00 00 00,只有属于系统表空间时才有意义
#第35-38字节,共4字节,00 00 00 69,代表属于哪个表空间,SPACE_ID #第39-40字节,共2字节,代表存储页目录中的槽位(slot)数,00 02,代表2个slot
#第41-42字节,00 e9,代表空闲空间偏移量0000c000+00c9=0000c0e9
#第43-44字节,00 05,表示行数,因为表的格式为COMPAT,初始后为00 02,因些相减为3条记录
#第45-46字节,00 00,共2字节,存放可重用空间的首指针
#第47-48字节,00 00,共2字节,
#第49-50字节,00 cb, 0000c000+00cb=0000c0cb,代表最后一条记录插入的位置偏移量
#第51-52字共,共2字节,代表最后插入的方向00 02,代表向右增长
#第53-54字节,共2字节,代表连续插入的记录数,00 02,代表连续插入2条
#第55-56字节,共2字节,代表页中记录数,00 03代表有3条记录
#第57-64字节,共8字节,00 00 00 00 00 00 00 00
#第65-66字节,共2字节,00 00 代表叶子节点
#第67-74字节,共8字节,索引ID,00 00 00 00 00 00 00 dd
#第65-84字节,共10字节, 00 00 00 69 00 00 00 02 00 f2 代表B+树数据页非叶子节点所在段的段头
#第84-95字节,共10字节,代表B+树数据页所在段的段头,00 00 00 69 00 00 00 02 00 32 #第96-100字节,共5字节,01 00 02 00 1c,infimun记录头
#第101-108字节,共8字节,69 6e 66 69 6d 75 6d 00,infimun字节 第108-112字节,共5字节,04 00 0b 00 00,suprenum记录头
第113-120字节,共8字节,73 75 70 72 65 6d 75 6d,suprenum记录 0000c000 a1 a3 c2 67 00 00 00 03 ff ff ff ff ff ff ff ff |...g............|
0000c010 00 00 00 00 85 69 9e a4 45 bf 00 00 00 00 00 00 |.....i..E.......|
0000c020 00 00 00 00 00 69 00 02 00 e9 80 05 00 00 00 00 |.....i..........|
0000c030 00 cb 00 02 00 02 00 03 00 00 00 00 00 00 00 00 |................|
0000c040 00 00 00 00 00 00 00 00 00 dd 00 00 00 69 00 00 |.............i..|
0000c050 00 02 00 f2 00 00 00 69 00 00 00 02 00 32 01 00 |.......i.....2..|
0000c060 02 00 1c 69 6e 66 69 6d 75 6d 00 04 00 0b 00 00 |...infimum......|
0000c070 73 75 70 72 65 6d 75 6d ##往后行记录内容
#从121字节开始 #第一条记录
#第121字节,08变长字段长度为8,NAME字段值‘YANGYANG’为变长字段,8字节
#第122字节,00,NULL标记
#第123-127字节,共5字节,00 00 10 00 26,记录头
#第128-133字节,共6字节,ROWID,00 00 00 04 c2 00
#第134-139字共,共6字节,事务ID,00 00 00 00 75 0a
#第140-146字节,共7字节,8a 00 00 01 b8 01 10,回滚段ID,指向UNDO回滚段地址
#第147-150字节,共4节,ID字段所占固定长度,80 00 00 01
#第151-158字节,共8字节,变长字段NAME占用,‘59 41 4e 47 59 41 4e 47’,转换成字符串,为'YANGYANG' 0000c070 08 00 00 00 10 00 26 00 |supremum......&.|
0000c080 00 00 04 c2 00 00 00 00 00 75 0a 8a 00 00 01 b8 |.........u......|
0000c090 01 10 80 00 00 01 59 41 4e 47 59 41 4e 47 #第二条记录
0000c090 08 00 |......YANGYANG..|
0000c0a0 00 00 18 00 26 00 00 00 04 c2 01 00 00 00 00 75 |....&..........u|
0000c0b0 0b 8b 00 00 01 99 01 10 80 00 00 01 44 4f 4e 47 |............DONG|
0000c0c0 58 55 41 4e 07 00 00 00 20 ff a5 00 00 00 04 c2 |XUAN.... .......| //20字节所在位置为
0000c0d0 02 00 00 00 00 75 10 8e 00 00 01 4e 01 10 80 00 |.....u.....N....|
0000c0e0 00 01 46 45 4e 47 48 55 41 00 00 00 00 00 00 00 |..FENGHUA.......| //46 45 4e 47 48 55 41 对应‘FENGHUA
文章很长, 但是我用到了里面的一个方法.
第一步是初始化表,并且插入数据. 根据表名可以看出来我进行过了很多次尝试.
create table test014 (a varchar(16000)); insert into test014 values ((select repeat('a',8098))); create table test015 (a varchar(16000)); insert into test015 values ((select repeat('a',8099)));
然后使用hexdump的方式将ibd文件导成 文本文档
hexdump -Cv /var/lib/mysql/zhaobsh/test014.ibd > test014.txt
hexdump -Cv /var/lib/mysql/zhaobsh/test015.ibd > test015.txt
然后查看两个文件
vim test014.txt
比较简单的方式
在命令模式下输入 4096 输入大写的G 调准到 第五个数据页
可以看到 底4098 行的 45bf 指代当前page 为 数据页 然后可以看到 当插入为 8098行数据时 当前数据页有很多 实际数据在里面.

然后看一下 8099 的 test015.txt 就会发现不一样的现象

当前页内 没有任何 a 的迹象. 查看第六个数据页
会发现迁移到了下一个数据页里面进行存储.

本来还想验证 多个数据列的迁移情况. 但是有点困了
mysql的东西还是很深奥的 , 需要多学习掌握才可以. 暂时先这样吧 mark一下.
MySQL数据库存储varchar时多大长度会出现行迁移?的更多相关文章
- mysql数据库delete数据时不支持表别名
今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELETE FROM LEAD_SYSTEM_MENU_ORG_REF as t WHERE t.resourceid='4 ...
- 转】mysql数据库delete数据时不支持表别名
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4012853.html 感谢! 今天在帮同事查看一条删除的SQL语句执行出错的问题 SQL语句如下: 1 DELE ...
- 连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的,
连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的, 2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factor ...
- mysql数据库忘记密码时如何修改(一)
方法/步骤 打开mysql.exe和mysqld.exe所在的文件夹,复制路径地址 打开cmd命令提示符,进入上一步mysql.exe所在的文件夹. 输入命令 mysqld --skip-grant ...
- mysql数据库delete数据时不支持表别名!!!
mysql数据库delete数据时不支持表别名!!! mysql delete时候 提示语法错误!如下sql: 去掉 表别名的时候: 正确的写法例如: DELETE FROM COMMENTS_REP ...
- 修改mysql数据库存储路径
最近一段比较忙,所以一直没有及时的更新总结一下测试路上遇到的问题,今天先来分享一下如何修改mysql存储路径(场景:在自己电脑上搭建的服务器上安装mysql,二.在公司自己的服务器上搭建mysql数据 ...
- 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB
重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...
- (转)Mysql数据库存储引擎
什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等 ...
- MYSQL——数据库存储引擎!
本人安装mysql版本为:mysql Ver 14.14 Distrib 5.7.18, for Win64 (x86_64),查看mysql的版本号方式:cmd-->mysql --vers ...
- mysql数据库存储引擎及区别
MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERAT ...
随机推荐
- Mock服务设计与实现:MySQL驱动字节码修改增强
摘要:华为导流测试平台通过对线上流量回放到被测环境中,利用线上真实流量进行充分测试,保证业务系统稳定上线.但是业务在导流测试过程中现网数据库往往难以同步到测试环境,导致现网数据无法正常回放,测试价值降 ...
- 华为云AI论文精读会2021第一期:高效语义分割模型Fast-SCNN分享
2020年举办的华为云AI经典论文复现活动,不仅受到了参赛者们一致好评,也产出了许多优质的算法成果.这些论文复现的算法描述.源代码以及算法使用指导文档均已发布到了AI Gallery.为了让开发者更好 ...
- Mysql开发实践:error while loading shared libraries: libaio解决方案
摘要:Mysql出现问题:error while loading shared libraries: libaio解决方案. 本文分享自华为云社区<Mysql出现问题:error while l ...
- Selenium八大元素定位(元素定位,元素等待)
Selenium WebDriver查找页面元素及元素操作 元素常用方法定位方法 通过id定位元素:find_element_by_id('id_value') 通过name定位元素:find_ele ...
- 关于改造维护工单BAPI_ALM_ORDER_MAINTAIN用于生产订单组件批量修改
1.研究背景 1.1.业务背景 由于销售.研发.工艺等需要频繁变更,导致工单中组件需要频繁的进行变更,修改组件的物料,数量,库存地点,工序等内容. 1.2.技术痛点 为了满足要求,使用了函数:CO_X ...
- PS CJ20N 项目定义属性字段增强
一.CJ20N添加字段 二.用户出口 三.校验必输项 博客频遭盗窃,请移步公众号"斌将军",输入关键字"项目定义字段增强"查看 TRANSLATE with ...
- 【Vue CLI】手把手教你撸插件
本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/Rl8XLUX7isjXNUmbw0-wow作者:ZhuPing 现如今 Vue 作为主流的前端框 ...
- Spring相关原理
Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.常见的配置方式有三种:基于XML的配置.基于注解的配置.基于Java的配置. 模块分为以下:Spring Core:Spring ...
- 绿色数字园区运维:一屏群集 3D 可视化智慧楼宇
前言 在"新基建"驱动的数字经济热潮下,智慧园区建设发展成为实现园区管理绿色化.现代化.智慧化的核心抓手.通过利用云计算.物联网.大数据等新一代技术手段,充分聚合园区内各类资源,全 ...
- 《3D编程模式》写书-第5次记录
大家好,这段时间我完成了对初稿的第一轮修改,即将开始第二轮的修改 这里是所有的的写书记录: <3D编程模式>写书记录 本轮修改主要进行了下面的修改: 修改错误 修改了UML错误.文字错误. ...