InnoDB’s Undo

前言

Undo log是InnoDB MVCC事务特性的重要组成部分。当我们对记录做了变更操作时就会产生undo记录,Undo记录默认被记录到系统表空间(ibdata)中,但从5.6开始,也可以使用独立的Undo 表空间。

Undo记录中存储的是老版本数据,当一个旧的事务需要读取数据时,为了能读取到老版本的数据,需要顺着undo链找到满足其可见性的记录。当版本链很长时,通常可以认为这是个比较耗时的操作(例如bug#69812)。

大多数对数据的变更操作包括INSERT/DELETE/UPDATE,其中INSERT操作在事务提交前只对当前事务可见,因此产生的Undo日志可以在事务提交后直接删除(谁会对刚插入的数据有可见性需求呢!!),而对于UPDATE/DELETE则需要维护多版本信息,在InnoDB里,UPDATE和DELETE操作产生的Undo日志被归成一类,即update_undo。

what?

DML操作导致的数据记录变化,均需要将记录的前镜像写入Undo日志;

逻辑日志;

when?

DML操作修改聚簇索引前,记录Undo日志(Undo日志,先于Redo日志)

二级索引记录的修改,不记录Undo日志;

注意:Undo页面的修改,同样需要记录Redo日志;

Insert/Delete/Update分别会如何记录日志?

InnoDB内存中,DML操作顺序如下:
–写Undo(获取ROLLBACK_PTR系统列)
–修改Page
–写Redo的顺序

Insert:

将插入记录的主键值,写入Undo;

Delete:

1. Delete,在InnoDB内部为Delete Mark操作,将记录上标识Delete_Bit,而不删除记录;
2. 将当前记录的系统列写入Undo (DB_TRX_ID, ROLLBACK_PTR, ...);
3. 将当前记录的主键列写入Undo;
4. 将当前记录的所有索引列写入Undo;
5. 将Undo Page的修改,写入Redo;

Update(未修改聚簇索引键值)

1. 将当前记录的系统列写入Undo (DB_TRX_ID, ROLLBACK_PTR, ...);
2. 将当前记录的主键列写入Undo;
3. 将当前Update列的前镜像写入Undo;
4. 若Update列中包含二级索引列,则将二级索引其他未修改列写入Undo;
5. 将Undo页面的修改,写入Redo;

Update(修改聚簇索引键值)

1. 不可进行In Place Update。Update = Delete Mark + Insert;
2. 对原有记录进行Delete Mark操作,写入Delete Mark操作Undo;
3. 将新纪录插入聚簇索引,写入Insert操作Undo;
4. 将Undo页面的修改,写入Redo;

undo的功能:

1. 实现事务的原子性,即当事务由于意外情况未能运行时,可以使得事务回滚,从而使得数据恢复到事务开始运行时的状态;

2. 实现一致性非锁定读。如果读取的行正在执行delete或者update操作,这时读取操作不会因此去等待行上锁的释放。相反,InnoDB存储引擎会去读取行的一个快照数据;

3. 用户的DML操作,均要记录undo;

undo页重用:

InnoDB存储引擎允许在一个页中存放多个不同事务的undo日志。若在OLTP应用环境中,事务通常都比较小,因此产生的undo日志相对较小。而由于其他事务可能正在引用当前的记录,事务在提交时并不能直接将undo日志给删除。

在InnoDB存储引擎的设计中对undo页可以进行重用,即一个undo页中允许存放多个不同事务的undo日志。具体来说,当事务提交时,首先将undo log放入到链表中,然后判断当前undo页的使用空间是否小于3/4。如果小于,表示该undo页可以被重用,之后新产生的undo记录保存在当前undo log的后面。由于存放undo log的history链表是以undo记录进行链接的,而undo页可能存放着不同事务的undo日志,因此purge操作需要涉及磁盘的离散读取操作,是一个比较缓慢的过程。

purge清理操作:

purge操作主要进行2个清理操作:

1. 清理记录。删除已经标记为delete mark的记录或者其他相关辅助索引记录;

2. 清理undo日志。若undo页中的所有undo记录都被删除,则删除对应的undo段。

在清理undo日志时,需要判断当前是否有其他事务在通过undo日志进行多版本并发控制,若有,则不能立即进行undo日志的清理,仅当没有任何一个用户事务使用该undo日志时,才可以进行清理。

为何需要按照操作类型,分为insert_undo与update_undo?

目标:为了实现Undo Page的分类回收;

insert_undo:

所有的Undo Page,在事务提交后,可直接回收释放;

update_undo:

所有的Undo Page,事务提交后,不可立即回收释放;

需要遍历其中的Undo日志,删除索引中的过期版本记录(Purge);然后才可释放;

mysql 5.1中undo的purge是和master thread 共用一个线程,则可能的purge的速度到达了瓶颈;

mysql 5.5中有独立的purge线程可以很快的回收掉undo log;

mysql 5.6中可以单独设置undo tablespace文件,避免与ibdata1混用在一起;

innodb_undo_tablespaces 回滚表空间个数

innodb_undo_directory 回滚表空间位置

从共享表空间独立出来,从而不至于单个表空间文件过大。

undo日志的更多相关文章

  1. Undo日志文件的产生和使用

    Undo 日志 比如A有200块钱, B有50 块钱,现在A要给B转100块” . (1)  开始事务 T1 (假设T1是个事务的内部编号) (2)  A余额 = A余额 -100 (3)  B余额 ...

  2. 理解数据库中的undo日志、redo日志、检查点

    数据库存放数据的文件,本文称其为data file. 数据库的内容在内存里是有缓存的,这里命名为db buffer.某次操作,我们取了数据库某表格中的数据,这个数据会在内存中缓存一些时间.对这个数据的 ...

  3. mysql事务、redo日志、undo日志、checkpoint详解

    转载: https://zhuanlan.zhihu.com/p/34650908 事务: 说起mysql innodb存储引擎的事务,首先想到就是ACID(不知道的请google),数据库是如何做到 ...

  4. MariaDB——(二) MariaDB 10.0.15 日志文件—undo 日志

          日志的记录和维护是数据库中相当重要的内容,写这篇文章和后面几篇文章作为学习官网文档的笔记.MariaDB数据库日志可分为二进制日志.查询日志.错误日志.myISAM表日志.relay日志和 ...

  5. 数据库中的undo日志、redo日志

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  6. MySQL redo与undo日志解析

    前言: 前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍.相对于其他几种日志而言, redo log 和 undo log 是更 ...

  7. 数据库事务故障恢复undo日志检查点

      checkpoint 检查点 checkpoint,即检查点.在undolog中写入检查点,表示在checkpoint前的事务都已经完成commit或者rollback 了,也就是检查点前面的事务 ...

  8. Mysql 中的MVCC原理,undo日志的依赖

    一. MVCC 原理了解   原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...

  9. MySQL数据库日志文件(redo与undo)

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库日志文件时间:2019年2月25日内容:MySQL数据库日志文件(redo日志和undo日志 ...

随机推荐

  1. oracle 行转列 分析函数

    oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...

  2. 深层次详解Exception

    所有的异常类都继承自System.Exception类,当异常产生时,CLR将创建该异常类的实例对象,将从最底层依次寻找合适的异常类型,同时若存在catch语句时将会选择最合适的语句进行处理. cat ...

  3. Android中9patch图片格式(xx.9.png)介绍与制作详解

    一:9patch图片介绍: android的.9.png是android系统中一种特殊的图片格式,专门用来用来处理图片大小变化后(如拉伸)的失真,不正常,如我们看到的qq聊天中的文字气泡,不管你输入的 ...

  4. having与where区别

    having后可以跟组函数如avg(sal)而where后不可以有, 如果条件不是必须使用组函数最好还是使用where

  5. swift基础--运算符

    (1)加减乘除 (2)三目运算,切记后面的空格如果不加会报错的.估计是苹果的bug. (3)聚合运算符,省却了一个判断,很人性化 (4)区间运算符 //加减乘除等等 let a = 2 let b = ...

  6. @Entity设置实体lazy = false

    问题描述 在通过Hibernate查询Bean信息时报以下异常信息: org.hibernate.LazyInitializationException: could not initialize p ...

  7. 如何将word中上下两行文字对齐?

    一.问题来源及描述 本科毕设的时候积累的问题,整理如下. 红头文件下面的署名,上下要对齐. 二.解决办法 经验证,第一次拉标尺要把标尺放在第一行的光标处,为了换行后,再次enter,tab后到与上一行 ...

  8. DWR

    DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...

  9. 用css制作三角形

    用css制作三角形,主要是利用css元素给“盒模型”设置边框得到的. 上图,上边框和做边框,以及上边框和右边框的交合处,浏览器会按照直角的二分之一处绘制交合线.这是“盒模型”有宽和高时候的效果.我们假 ...

  10. 关于NGUI中的自适应和对齐机制

    原地址:http://blog.sina.com.cn/s/blog_62df69790101gy7t.html 1 关于美术效果图 美术出效果图总是基于某个固定尺寸.移动设备的分辨率却有太多不同的方 ...