MySQL-redo log 和 undo log(简单易懂)

本文介绍了数据库中用于事务处理的Redolog(记录日志)和Undolog(撤销日志),讨论了如何在数据修改后存储更改并确保事务原子性,以及如何在发生故障时通过这些日志进行数据恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、redo log

假设我们在bufferpool中修改了页,然后在事务提交后,发生了故障导致内存中的修改数据全都没了,这种时候我们应该怎么处理。

①修改了一条我们就往磁盘中更新一条,但这样会对性能性能造成影响,因为I/O次数太多了。

②我们只需要在我们修改的时候,记录一下修改内容就好了,而这就是redo log

二、undo log

事务是具有原子性的,在我们提交事务的时候,事务内的操作要么全部提交,要么全部撤销。

我们在将数据恢复成原来的样子,就是回滚。而数据库为了回滚而记录的日志,就是撤销日志(undo log)。

分配事务id的时机

当事务对表中记录进行修改时,都会生成一个事务id

分配事务id的规则:

系统会在内部维护一个全局变量,当我们需要分配事务id时,都会把这个全局变量赋值给事务id,并且自增1.每当这个全局变量变成256的倍数时,我们就会赋值给一个MAX TRX ID的属性,当下一次启动的时候,系统就会把这个属性加上256赋值给上面的全局变量。

在page页中的头信息中trx_id就是事务id。

我们以delete操作为例进行讲解:

当我们在进行删除的时候,会根据记录的next_record指针生成一个全新的链表,但是这个链表所占用的空间可以被重新利用,所以被称为垃圾链表,page_free指向垃圾链表的头节点,当我们删除一条记录时,他都会插入到垃圾链表的头节点。

当我们在删除一条记录时,首先会将记录头信息中的delete_flag变为1,而next_record指针不会立即断开,此时若是回滚数据,只是将delete_flag变回0即可。当next_record断开后,这条记录会被放入垃圾链表的头节点处,并且page hander中的page_free的指针会指向此节点。

删除记录信息的roll_pointer会指向上一条的undolog,而插入会指向本身记录的undolog。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值