undo日志

在InnoDB存储引擎中,undo日志有两个作用:

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

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

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日志时,才可以进行清理。

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 回滚表空间位置

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

时间: 2024-11-05 19:42:02

undo日志的相关文章

Undo日志文件的产生和使用

Undo 日志 比如A有200块钱, B有50 块钱,现在A要给B转100块” . (1)  开始事务 T1 (假设T1是个事务的内部编号) (2)  A余额 = A余额 -100 (3)  B余额 = B余额 + 100 (4)  提交事务 T1 会对此事务记录Undo的日志文件,记录下事务开始之前的他俩账号余额: [开始事务 T1] [事务T1, A原有余额,200] [事务T1, B原有余额,50] 如果事务执行到一半挂了,数据库重启以后我就根据undo的日志文件来恢复. 例子:如果第三步

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

理解数据库中的undo日志.redo日志.检查点 2014-6-18 原文:https://www.letiantian.me/2014-06-18-db-undo-redo-checkpoint/ 数据库存放数据的文件,本文称其为data file.数据库的内容在内存里是有缓存的,这里命名为db buffer.某次操作,我们取了数据库某表格中的数据,这个数据会在内存中缓存一些时间.对这个数据的修改在开始时候也只是修改在内存中的内容.当db buffer已满或者遇到其他的情况,这些数据会写入da

说说MySQL中的Redo log Undo log都在干啥

阅读目录(Content) 1 undo 1.1 undo是啥 1.2 undo参数 1.3 undo空间管理 2 redo 2.1 redo是啥 2.2 redo 参数 2.3 redo 空间管理 3 undo及redo如何记录事务 3.1 Undo + Redo事务的简化过程 3.2  IO影响 3.3 恢复 在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件. MySQL中的日志文件,

【msql】redo and undo log

Innodb Crash Recovery InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性.和大多数关系型数据库一样,InnoDB记录了对数据文件的物理更改,并保证总是日志先行,也就是所谓的WAL,即在持久化数据文件前,保证之前的redo日志已经写到磁盘 Crash Recovery是InnoDB引擎的一个特点,当故障发生,重新启服务后,会自动完成恢复操作,将数据库恢复到之前一个

浅析如何将undo log从tablespace分离

从MySQL5.6.3之后,MySQL支持将undo日志从tablespace(ibdataN)中独立开来放到单独的磁盘上.MySQL官方建议将undo放到ssd上,而把ibdata放在hd.(这里似乎有争论,国内某些大牛建议将顺序读写的log日志放在hdd) 比较重要的一个概念: 虽然undo log被分离出去了,但是其io处理还是在system tablespace内完成,所以定义上来讲还是算tablespace的.文档中原文如下: "Because these files handleI/

了解mysql的undo log

第一次了解mysql的时候,看到了undo log这个名词,却不知道undo log是干什么,为了能够继续看明白一些mysql的资料,不得不先弄明白undo log是什么? undo log的原理是什么?它与数据库的其它特性如何配何.这篇笔记只从原理上分析,不涉及具体的实现方法. undo log是什么? undo log是一种日志,日志中记录对于数据库的反向操作.如果把数据库的内容当做一种状态机,那么数据的写操作就是修改状态机的命令,而undo 就对应修改状态机的反向命令.所以理论上每一个对于

日志机制在编程中的作用

日志: 说白了就是为了恢复(撤销机制) 软件里面不都有撤销ctl+z吗?但是怎么实现的呢?想一下就是记下过程,逆向操作一遍即可. Log4j原理: 一个循环处理过程--日志组,循环使用. DB里面的日志: 一条SQL进行解析之后,形成redo,undo日志,然后操作存储设备(也就是物理的操作过程,直接操作数据块),而逻辑的就是通过SQL操作+数据块操作. 审计:就是为了查账(国家不由审计署吗?干什么的呀) 日志机制在编程中的作用,布布扣,bubuko.com

MySQL优化之——日志

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46790451 MYSQL里的日志主要分为4类,使用这些日志文件.能够查看MYSQL内部发生的事情. 各自是 1.错误日志:记录mysql服务的启动.执行.停止mysql服务时出现的问题 2.查询日志:记录建立的client连接和运行的语句 3.二进制日志:记录全部更改数据的语句.能够用于数据复制 4.慢查询日志:记录全部运行时间超过long_query_time的全部查询或不使用

5分钟了解MySQL5.7的undo log在线收缩新特性

Part1:写在最前 在MysQL5.6版本中,可以把undo log 回滚日志分离到一个单独的表空间里:其缺点是不能回收空间大小,until MysQL5.7,but MariadDB10.1暂不支持. 本文介绍并演示MysQL5.7是如何在线收缩undo log的. undo log日志是保存在共享表空间ibdata1文件中的,随着数据库的运行时间的不断增长,ibdata1文件会越来越大,在以往的MySQL数据库版本中,如果我们想要回收ibdata1文件所占空间,会非常的复杂和困难,必须先将