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 ...
随机推荐
- 统一元数据,数据湖Catalog让大数据存算分离不再是问题
摘要:为了解决现阶段大数据存算分离痛点问题,华为云大数据推出重量级数据湖Catalog服务. 1 背景 随着5G.IoT等技术的发展,企业积累了越来越多的数据,需要激发更多的数据价值变现.传统大数据平 ...
- 聊聊Java的异常机制问题
摘要:java异常指在程序运行时可能出现的一些错误,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流. 本文分享自华为云社区<Ja ...
- 毕昇 JDK:为啥是ARM 上超好用的 JDK
摘要:毕昇 JDK 是华为基于 OpenJDK 定制的开源版本,是一款高性能.可用于生产环境的 OpenJDK 发行版. 本文分享自华为云社区<[云驻共创]毕昇 JDK:"传奇再现&q ...
- HBuilderX获取iOS证书的打包步骤
简介: 目前app开发,很多企业都用H5框架来开发,而uniapp又是这些h5框架里面最成熟的,因此hbuilderx就成为了开发者的首选.然而,打包APP是需要证书的,那么这个证书又是如何获得呢? ...
- 创元集团的数智化实践 这次选择了和火山引擎 VeDI 搭档
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,上海创元化妆品有限公司(以下简称"创元集团")与火山引擎数智平台 VeDI 达成合作,旨 ...
- PPT 小图标 设计感Max 精修
https://www.bilibili.com/video/BV1ha411g7f5?p=14 图标用处 信息可视化,快速获取信息 增加内容图示化细节,增强设计感 SVG/PNG 图标使用 SVG ...
- Linux系统用户态和内核态
Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核空间).内核从本质上看是一种软件-----控制计算机的硬件资源,并提供上层应 ...
- 【Go】go语言变量类型 常量 函数基础 函数高级 setuptools将python项目打包 前后端联调
昨日回顾 使用setuptools将python项目打包 # 详细: python---->setuptools-->whl包结构 https://zhuanlan.zhihu.com/p ...
- POJ1426: Find The Multiple
题目: 给定一个正整数n,请编写一个程序来寻找n的一个非零的倍数m,这个m应当在十进制表示时每一位上只包含0或者1.你可以假定n不大于200且m不多于100位. 提示:本题采用Special Judg ...
- vivo悟空活动中台 - 微组件多端探索
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/oGX4XSm8F4fa1ocLdpyqlA作者:悟空中台研发团队 [悟空活动中台]系列往期精 ...