一个简单的测试:

start transaction;
insert into tb1 values(3, repeat('a', 65000),'x',1);
--commit;
rollback;

下图分别是 tb1.ibd 在插入前,回滚前,回滚后的文件大小:

有人在QQ群问:为什么回滚会导致tb1.idb的磁盘空间增大?

---------------------------------------

首先:131072-98304=163840-131072=32768

这里要存储 65000 个字符'a' ,那么字段类型应该是 text. 而 text 字段的处理是很特别的:

Each BLOB or TEXT value is represented internally by a separately allocated object. This is in contrast
to all other data types, for which storage is allocated once per column when the table is opened.

也就是说对于 text/blob 字段来说,它们是另外分配了一个专门的对象来存储,对它们的处理不会在内存中进行缓存,而是直接写入磁盘中。所以未提交时,就可以看到 tb1.idb 发生了增长。

而对于 insert 操作的 rollback,那么必须将之前插入的数据进行 delete 操作,而 delete 操作是逻辑操作,也就是设置一个标志位就行了,于是又分配了一个专门的对象来存储这个设置了删除标志的对象。于是磁盘空间增长了两次(暂时只能这么解释了...),每次都是 32768字节(2的15次方)。一旦提交或者rollback,磁盘空间就可以被回收。

为什么是 32768呢?

text的最大存储空间是 65656 个字节,每次分配的最小单位是 32768字节。

也就是 insert 和 rollback 都导致了一次 text 字段磁盘空间的增长分配,而分配的最小单位是32768.

如何你将  repeat('a',65000) 换成:  repeat('a',65535) 在进行测试,你会发现,insert 时,tb1.idb会增长65536,在执行rollback时也会导致 tb1.idb 再次增长32768。

所以应该是 rollback 会导致 text 字段另外分配一次空间,而分配的最小单位是32768。可能和 text 字段的存储结构有关系。这个需要看源码了。

----------------

测试表明,其它非 text 字段的 rollback 操作,不会导致 ibd 文件增大。

测试建表语句如下:

mysql> show create table tb1\G
*************************** 1. row ***************************Table: tb1
Create Table: CREATE TABLE `tb1` (`id` int(11) NOT NULL AUTO_INCREMENT,`webtext` text COLLATE utf8mb4_bin,`tp` varchar(2) COLLATE utf8mb4_bin DEFAULT NULL,`se` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)

  

为什么 MySQL 回滚事务也会导致 ibd 文件增大?相关推荐

  1. mysql java事物回滚吗_为什么 MySQL 回滚事务也会导致 ibd 文件增大?

    一个简单的测试: start transaction; insert into tb1 values(3, repeat('a', 65000),'x',1); --commit; rollback; ...

  2. mysql ibd文件一直增加_为什么 MySQL 回滚事务也会导致 ibd 文件增大?

    一个简单的测试: start transaction; insert into tb1 values(3, repeat('a', 65000),'x',1); --commit; rollback; ...

  3. mysql怎么通过frm和ibd文件还原数据

    1.找回表结构,如果表结构没有丢失直接到下一步 a.先创建一个数据库,这个数据库必须是没有表和任何操作的. b.创建一个表结构,和要恢复的表名是一样的.表里的字段无所谓.一定要是innodb引擎的.C ...

  4. mysql清理 frm_通过.frm .ibd文件恢复MySQL数据

    重新安装完mysql,当我初始化MySQL的时候,报错提示以前的数据目录还存在着,于是把之前的数据拷贝到其他目录,然后初始化成功.由于以前的数据还存在,我便想将以前的数据迁移的刚安装的MySQL中. ...

  5. frm ibd文件导入mysql_Mariadb,Mysql如何根据.frm和.ibd文件来恢复数据和表结构

    废话不多说直接进入正题,Mariadb,Mysql根据.frm和.ibd文件来恢复数据和表结构,大体分为三个步骤: 1.创建表结构 2.导入表结构 3.恢复表数据 接下来,我们按照这三个步骤一步一步恢 ...

  6. mysql ibd frm文件_Mariadb,Mysql如何根据.frm和.ibd文件来恢复数据和表结构

    废话不多说直接进入正题,Mariadb,Mysql根据.frm和.ibd文件来恢复数据和表结构,大体分为三个步骤: 1.创建表结构 2.导入表结构 3.恢复表数据 接下来,我们按照这三个步骤一步一步恢 ...

  7. 解决MySQL数据库意外崩溃导致数据库文件损坏或意外删除数据库文件导致无法启动问题

    MySQL版本:5.7 查看mysql启动日志: 2021-09-26T09:00:39.404326Z 1 [ERROR] [MY-012179] [InnoDB] Could not find a ...

  8. mysql innodb 从 ibd 文件恢复表数据

    最近内部的 mysql 数据库发生了一件奇怪的事,其中有一个表 users625 突然出现问题, 所有对它的操作都报错误 数据表不存在. mysql> select count(*) from ...

  9. mysql异常恢复工具_[MySQL异常恢复]mysql ibd文件恢复

    在mysql中由于某种原因保存有ibd文件,但是表已经被删除或者frm文件损坏亦或者ibdata文件损坏/丢失等.本文模拟在这种情况下,通过mysql自身技术即可完成ibd文件恢复. 测试环境mysq ...

最新文章

  1. 编程疑难杂症の怪诞的【黄色警告】
  2. 轻松理解https,So easy!
  3. 复制不用说yes的方法
  4. 数据结构(三)--链表
  5. JAVA进阶教学之(String类的构造方法)
  6. 前脚投简历,后脚就被精准裁员。这套监控系统让打工人颤抖:离职倾向、摸鱼通通都能被监测,争议出现后产品页面已404...
  7. 计算机中那些事儿(八):再历装系统之终身学习
  8. Python 按行读取文本文件 缓存 和 非缓存实现
  9. jquery根据滚动像素显示隐藏顶部导航条
  10. 前端命名规范_值得收藏的前端命名规范
  11. .net c#购物车模块分析
  12. 工具配置-如何在NextCloud私有云盘安装的olnyOffice插件中添加中文字体支持实践操作...
  13. 蓝牙耳机哪个音质好?推荐几款音质好的蓝牙耳机
  14. 微信小程序怎么字体鼠标放上去变颜色?_【干货】CDR快捷键常识小技巧大全,记得收藏!...
  15. 计算机运算器由什么组成部分,运算器由哪些部分组成
  16. android bugly qq,Android如何快速集成腾讯Bugly
  17. HTML创建表格模板
  18. HSV(HSB)和HSL颜色空间
  19. ffmpeg批量m4a转mp3
  20. eclipse 使用 firebase analysis sdk

热门文章

  1. 桌面虚拟化在学生教室及机房的应用案例
  2. 高端ERP软件市场漫谈:崇洋无罪 自重有理
  3. const 在C++中的区别
  4. struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)
  5. mybatils多次查询问题
  6. 一些javascript免费中文书籍
  7. ios 图片截取功能 图片拼接功能
  8. “stdafx.h”: No such file or directory
  9. Windows 10 解决 0x80070021 错误
  10. ffmpeg源码分析四:transcode_step函数 (转4)