数据库innodb使用redo log数据恢复原理
涉及五个关键知识:
- dirty page
- redo log
- MTR
- LSN
- checkpoint
dirty page 脏页
脏页既是对一条记录进行更新时,innodb将该记录所在的页读取到内存,然后在内存中对该数据进行更新。此时内存页中数据有修改,且还没有写入到文件中,此时的内存页就叫做脏页。
innodb不会将内存页中修改的数据立即刷新到文件中,而是将写操作产生的变化以日志的形式记录到redo log文件中,当服务意外崩溃重启时,会读取redo log,对没有写入文件的数据进行恢复。
innodb不会将内存页中修改的数据立即刷新到文件中的原因是写redo log是顺序写入,不会产生随机io。随机io将导致磁盘频繁寻道,写入性能很低。
所有这些脏页会在内存中串成一个链表,以每个页首次被修改的时间为顺序排列,最早被修改的页位于链表尾部。
redo log
redo log也称作重做日志,redo log将所有的写操作以规定的格式顺序记录到redo日志中。例如一条insert语句的redo log将包含表空间id、插入的记录所在的页号、insert的具体数据。
redo log也不是一旦有新的日志就写入文件,innodb为redo log在内存开辟了一个redo log buffer,新的日志先写入这个内存中,在合适的时机再将新的日志刷盘到redo log文件中。这个刷盘时机有如下几种:
当redo日志量已经占满了log buffer总容量的50%左右,就需要把这些日志刷新到磁盘中
事务提交时ÿ