Mysql 回滚 insert 导致 ibd 文件增大‘一倍’

一个简单的测试:

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

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

有人在QQ群问原因。

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

其实原因很简单:

131072-98304=163840-131072=32768
所以:回滚insert = delete + re-insert ,而 delete是指设置一下flag,so ... 内容增大一倍。

insert 操作的回滚,先要delete之前插入的值,然后重新insert一次,而delete是逻辑删除,也就是设置一个flag,没有真正的删除。这就是原因。

时间: 2024-10-06 22:30:15

Mysql 回滚 insert 导致 ibd 文件增大‘一倍’的相关文章

undo回滚异常导致实例奔溃,无法正常open

接到地市反馈某一个数据库打不开了 1.登陆主机,查看数据库告警日志 最早数据库出现问题时的日志是在2014年6月7日 数据库在切换redo时异常关闭,之后数据库一直为开启使用 2.数据库在2014年6月8日 OPEN后,有recovery的进程报错 目前已经找不到这些文件,无法核实当时的异常信息源,接着往下看日志 3.数据库在2014年6月9日11:36:45时又异常关闭 4.同样的现象出现在2014年8月11日13:26:07,数据库异常关闭 5.数据库在2014年8月11日13:18:46再

MySQL回滚工具binlog2sql使用介绍

参数介绍:参考官网地址:https://github.com/danfengcao/binlog2sql 直接从官网下载软件包,照着github上给的方法,虽然可以安装成功,但是执行如下命了报错,由于此工具源代码是是别人所写,目前暂时没找到是代码的哪个地方导致的语法错误.有知道的网友朋友可以友情提醒下,谢谢. [[email protected] binlog2sql]# python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dzi

关于MySQL回滚机制

在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚.回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行update操作将之前的记录还原 因此,正确的原子操作是真正被执行过的.是物理执行. 在当前事务中确实能看到插入的记录.最后只不过删除了.但是AUTO_INCREMENT不会应删除而改变值. 1.为什么auto_increament没有回滚? 因为innodb的auto_increament的计数器记录

【MySQL】MySQL回滚工具

1.mysqlbinlog把事务从binlog中导出 2.从导出的binlog中找到要回滚的事务,去掉第一个DML语句前和最后一个DML语句后与DML无关的binlog信息 3.在目录中新建一个table.cnf,把表结构以@1=columns这样的顺序一行写一列 4.update回滚支持选择条件列和回滚的数据列,把回滚时不需要的条件(列)写到not_used.set和not_used.where中 例如: 文件 table.cnf @1=id @2=column_a @3=column_b @

【MySQL】MySQL事务回滚脚本

MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试: 想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入DB. ## INSERT 需要将新增数据删除 对应DELETE ## DELETE 需要将删除数据恢复 对应INSERT ## UPDATE 需要将修改数据恢复 对应UPDATE ## 手动读取BINLOG,并找到对应位置和对应事务 ## 手动删除除事务外的其他说明语句 INSERT回滚最简单,其

重建回滚表空间

作者:iamlaosong 因为意外原因(掉电,人为杀死进程)导致回滚段中的数据没有提交,回滚段中保留大量数据无法去除,我想到的办法就是重建表空间.当Oracle中当读写大批量数据时候,如果不及时提交任务,会导致回滚表空间的迅速增加,回滚表空间会一直增大,而不自动释放它占用的硬盘空间,(当然,几个小时后,系统会自动释放它自身的占用率,但不会释放它所占用的硬盘空间),这时,也可以通过重建表空间来解决. 1.重建回滚表空间方法, 思路:先新建回滚表空间,再重新定向到新建的回滚表空间,然后删除掉原来的

关于oracle实例恢复的前滚和回滚的理解

关于oracle实例恢复的一些理解,一直都有误区,今天通过查看相关资料和与同学探讨,发觉了自己的错误,探讨结果如下: 实例恢复:当数据库非正常关闭的时候(断电或者shu  abort等等非一致性关闭),当你从新启动数据库的时候,数据库相关进程自动进行实例恢复,无须人工干预. 什么时候需要实例恢复 在shutdown normal or shutdown immediate下,也就是所谓的clean shutdown,checkpoint也会自动触发,并且把SCN纪录写回. 当发生checkpoi

安装Microsoft Visual 2010 sp1回滚的错误,无Windows Installer目录

项目需求,安装好Microsoft Visual 2010后,在安装Microsoft Visual 2010 sp1时一直停留在KB983509处, 无法向前,之后无限回滚,导致安装失败,如下图所示,在网上看到很多人写的方法是引用 如下: 大多数的推荐设置是,拷贝VS2010安装包中的vs_setup.msi文件到C:\Windows\Installer文件夹下,并命名为43289.msi 但是想好多人一样,我的电脑里面就没有这个目录,创建也受限,这一步就行不通了. 解决方法如下: 首先进Mi

PetaPoco4.0的事务为什么不会回滚

using (var srop=DbHelper.CurrentDb.GetTransaction()) { ID = bp.AddModel(model).ToStr(); #region 参与楼盘信息 if (ID.ToInt32() > 0) { FY_ActivityProjectServer dtlServer = new FY_ActivityProjectServer(); for (int i = 0; i <= this.Projects.Items.Count; i++)