Redo log
介绍Redo log之前我们需要了解一下,mysql数据操作的流程:
![](https://i-blog.csdnimg.cn/direct/c8df6b4d200444e49e82dc7f8d921264.png)
上述就是数据操作的流程图,可以发现sql语句并不是直接操作的磁盘而是通过操作内存,然后进行内存到磁盘的一个同步。这里我们必须要了解一些区域:
- 缓冲池(buffer pool):主内存中的一个区域,里面可以缓存磁盘经常操作偶的真实数据,在执行增删查改的时候,先操作缓冲池中的数据(如果缓冲池中没有数据,则从磁盘中加载并且缓存),以一定的频率刷新到磁盘当中,从而减少磁盘io,加快处理速度
- 数据页(page):是InnoDB存储引擎磁盘管理的最单元,每页默认的大小是16kb。页中存储的是表中一行又行数据
当执行sql语句的时候,首先会操作内存中的缓冲池 (首先会判断是否有操作的数据,如果没有从磁盘中加载),因为直接操作内存的性能会比操作磁盘的性能更加高,然后将操作缓冲池中的数据 ,同步到磁盘 中,这样的目的就是可以减少磁盘的io ,加快处理的速度 ,这样就完成了事务的持久化
但是我们需要想到一个问题,如果我们在将脏页 (缓冲池的数据)的数据同步到磁盘 中的时候,数据库宕机了,这个时候就会发生数据的丢失,就不能满足事务的持久化 了,所以我们就需要Redo log日志来解决这样的问题
Redo Log :重做日志,纪律的是事务提交的时候的数据页的物理修改,是用来实现事务的持久性
操作的流程图如下:
![](https://i-blog.csdnimg.cn/direct/63675eb7a0004092b3b1714cbae24744.png)
redo log日志主要是分为两个部分:重做日志缓冲 以及重做日志文件 ,前者是在内存中的,后者是在磁盘中的。当事务提交之后会把所有修改信息都存储在日志文件中,用于刷新脏页到磁盘发生错误的时候,进行数据的恢复使用
具体流程就是,当发生增删改的时候,首先会修改buffer pool中的数据,而redo log buffer会记录里面的数据页的变化,一旦日志出现了变化,就会同步到磁盘中的重做日志文件,当发现buffer pool同步数据失败的时候,可以通过日志来同步数据
但是就会有一个疑问:这样是否会拖慢操作的速度呢,不用redo log可以么,当数据页发生变化的时候直接进行内存到磁盘的同步不可以么
是可以的,但是会出现性能的问题,当大量的增删改的sql发过来的时候,内存到磁盘的同步是随机的磁盘的io,这样的性能是很低的。而redo log是顺序的磁盘io,日志文件是追加的,这样性能会提升;这种机制就叫做WAL
- 顺序 I/O(Sequential I/O):是指读写操作的访问地址连续。在顺序 I/O 访问中,存储设备(如 HDD 硬盘)所需的磁道搜索时间显著减少,因为读/写磁头可以以最小的移动访问下一个块。数据备份和日志记录等业务通常是顺序 I/O 业务。
- 随机 I/O(Random I/O):则是指读写操作时间连续,但访问地址不连续,随机分布在磁盘的地址空间中。产生随机 I/O 的业务有 OLTP 服务、SQL 操作、即时消息服务等
Undo log
Undo log是一个回滚日志,作用主要是包含两个:提交回滚 和MVCC (多版本并发控制)。undo log和redo log记录物理日志不一样,他记录的是逻辑日志, undo log可以实现事务的一致性 和原子性
- 可以认为当delete一条数据的时候,undo log会记录一条对应的insert记录,反之亦然
- 当update一条记录的时候,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚
Redo log和undo log区别
- lredo log: 记录的是数据页的物理变化,服务宕机可用来同步数据
- lundo log :记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据
- lredo log保证了事务的持久性,undo log保证了事务的原子性和一致性