阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

192次阅读
没有评论

共计 1881 个字符,预计需要花费 5 分钟才能阅读完成。

数据库存放数据的文件,本文称其为 data file。

数据库的内容在内存里是有缓存的,这里命名为 db buffer。某次操作,我们取了数据库某表格中的数据,这个数据会在内存中缓存一些时间。对这个数据的修改在开始时候也只是修改在内存中的内容。当 db buffer 已满或者遇到其他的情况,这些数据会写入 data file。

undo,redo

日志在内存里也是有缓存的,这里将其叫做 log buffer。磁盘上的日志文件称为 log file。log file 一般是追加内容,可以认为是顺序写,顺序写的磁盘 IO 开销要小于随机写。

Undo 日志记录某数据被修改前的值,可以用来在事务失败时进行 rollback;Redo 日志记录某数据块被修改后的值,可以用来恢复未写入 data file 的已成功事务更新的数据。下面的示例来自于杨传辉《大数据分布式存储系统 原理解析与架构实践》,略作改动。

例如某一事务的事务序号为 T1,其对数据 X 进行修改,设 X 的原值是 5,修改后的值为 15,那么 Undo 日志为 <T1, X, 5>,Redo 日志为 <T1, X, 15>。

也有把 undo 和 redo 结合起来的做法,叫做 Undo/Redo 日志,在这个例子中 Undo/Redo 日志为 <T1, X, 5, 15>。

当用户生成一个数据库事务时,undo log buffer 会记录被修改的数据的原始值,redo 会记录被修改的数据的更新后的值。

redo 日志应首先持久化在磁盘上,然后事务的操作结果才写入 db buffer,(此时,内存中的数据和 data file 对应的数据不同,我们认为内存中的数据是脏数据),db buffer 再选择合适的时机将数据持久化到 data file 中。这种顺序可以保证在需要故障恢复时恢复最后的修改操作。先持久化日志的策略叫做 Write Ahead Log,即预写日志。

在很多系统中,undo 日志并非存到日志文件中,而是存放在数据库内部的一个特殊段中。本文中就把这些存储行为都泛化为 undo 日志存储到 undo log file 中。

对于某事务 T,在 log file 的记录中必须开始于事务开始标记(比如“start T”),结束于事务结束标记(比如“end T”、”commit T”)。在系统恢复时,如果在 log file 中某个事务没有事务结束标记,那么需要对这个事务进行 undo 操作,如果有事务结束标记,则 redo。

在 db buffer 中的内容写入磁盘数据库文件之前,应当把 log buffer 的内容写入磁盘日志文件。

有一个问题,redo log buffer 和 undo log buffer 存储的事务数量是多少,是按照什么规则将日志写入 log file?如果存储的事务数量都是 1 个,也就意味着是将日志立即刷入磁盘,那么数据的一致性很好保证。在执行事 T 时,突然断电,如果未对磁盘上的 redo log file 发生追加操作,可以把这个事务 T 看做未成功。如果 redo log file 被修改,则认为事务是成功了,重启数据库使用 redo log 恢复数据到 db buffer 和 data file 即可。

如果存储多个的话,其实也挺好解释的。就是 db buffer 写入 data file 之前,先把日志写入 log file。这种方式可以减少磁盘 IO,增加吞吐量。不过,这种方式适用于一致性要求不高的场合。因为如果出现断电等系统故障,log buffer、db buffer 中的完成的事务会丢失。以转账为例,如果用户的转账事务在这种情况下丢失了,这意味着在系统恢复后用户需要重新转账。

检查点 checkpoint

checkpoint 是为了定期将 db buffer 的内容刷新到 data file。当遇到内存不足、db buffer 已满等情况时,需要将 db buffer 中的内容 / 部分内容(特别是脏数据)转储到 data file 中。在转储时,会记录 checkpoint 发生的”时刻“。在故障回复时候,只需要 redo/undo 最近的一次 checkpoint 之后的操作。

幂等性问题

在日志文件中的操作记录应该具有幂等性。幂等性,就是说同一个操作执行多次和执行一次,结果是一样的。例如,5*1 = 5*1*1*1,所以对 5 的乘 1 操作具有幂等性。日志文件在故障恢复中,可能会回放多次(比如第一次回放到一半时系统断电了,不得不再重新回放),如果操作记录不满足幂等性,会造成数据错误。

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2018-01/150488.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1881字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中