redo log 和 undo log
redo log 和 undo log
redo log
重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。
Redo Log文件不会被直接删除,而是通过一种称为“循环写入”的机制来管理。这意味着Redo Log文件会在达到其大小限制后从头开始覆盖旧的日志记录。
工作流程:
当一个事务进行增删改操作时,会在Buffer pool缓冲池中操作,如果缓存池中数据不存在,则读取磁盘中的数据(进行增删改操作则会出现脏页,要确保脏页成功刷新到磁盘中),将增删改的数据记录到redo log buffer中,redo log buffer记录数据页的物理变化,事务提交以后,会把redo log buffer刷新到到磁盘的redo log file(持久到磁盘)中。一段时间以后,在进行脏页刷新时,发生错误,则使用redo log file 进行数据恢复
undo log
回滚日志,在insert、update、delete的时候产生,用于记录数据被修改前的信息(保证事务的原子性),作用包含两个:提供回滚 和 MVCC(多版本并发控制)。undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。当执行rolback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。
undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。
- 在当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。
- 而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时(MVCC)也需要,不会立即被删除。
undo log存储:undo log采用段的方式进行管理和记录, rolback seament 回滚段中,内部包含1024个undo log segment
redo log 和 undo log的区别
-
redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据,
-
undo log 不同,它主要记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据,比如我们删除一条数据的时候,就会在undo log日志文件中新增一条delete语句,如果发生回滚就执行逆操作;
-
redo log保证了事务的持久性,undo log保证了事务的原子性