MySQL三大日志知识点总结
- binlog 二进制日志
- redolog 重做日志
- undolog 回滚日志
binlog
什么是binlog?
binlog是MySQL Server层的二进制日志,用于记录MySQL执行的所有写入性操作。无论MySQL使用什么存储引擎,写入性操作都会记录到binlog。
binlog是逻辑日志,新来的写入性操作通过追加的方式进行写入。如果当前binlog文件过大,MySQL会创建一个新的binlog文件来记录MySQL操作。可以将binlog理解为一个记录所有写入性sql语句的日志。
- 逻辑日志:可以简单理解为记录的就是sql语句。
- 物理日志:因为mysql数据最终是保存在数据页中的,物理日志记录的就是数据页变更。
binlog的刷盘策略
对于InnoDB存储引擎而言,只有在事务提交时才会将数据记录到biglog文件。在事务执行且还未提交的过程中,数据仍保留在内存中。
binlog的三种刷盘策略:
- (1)由系统自行判断何时写入磁盘。
- (2)每次commit的时候都将内存中的数据写入binlog文件。
- (3)每提交N个事务后,才会将内存中的数据写入binlog文件。
binlog的使用场景
- 数据恢复
- 主从复制
redolog
什么是redolog?
redolog是Innodb存储引擎自带的日志,负责保证事务的持久性。
redolog的组成
redolog由两部分构成
- 日志缓冲(redo log buffer)
- 日志文件(redo log file)
日志缓冲在内存上,日志文件在磁盘上。
MySQL在一段时间内执行多条语句的时候,会先将这些语句记录到redolog的日志缓冲区中,在后续的某个时间点将日志缓冲区中积累的数据写入到日志文件中(刷盘)。
redolog的刷盘策略
-
redolog的刷盘流程:
在操作系统中,用户空间(user space)下的缓冲区数据一般情况下是无法直接写入磁盘的。所以redo log buffer里的数据要先写入os buffer(操作系统的缓冲区),再通过操作系统调用fsync()将数据刷到redo log file中。 -
redolog的三种刷盘策略
-
延时写:
事务提交时不会立刻将redo log buffer提交到os buffer。而是每隔一秒将redo log buffer里的数据写入os buffer并调用fsync()将数据刷到redo log file中。这种刷盘策略有可能会在宕机时丢失近一秒的数据。 -
实时写,延时刷:
每次事务提交都仅将数据写入到os buffer中,每隔一秒调用fsync()将数据刷到redo log file中。 -
实时写,实时刷:
每次事务提交都会将redo log buffer中的数据写入os buffer,再调用fsync()将数据刷到redo log file中。这种刷盘策略不会丢失任何数据。
-
redolog的记录形式
redolog是物理日志,用于记录数据页的变更。
redolog不会像binlog那样保存所有数据,它采用了固定大小,循环写入的方式来记录日志。新的记录会覆盖之前的旧记录。
redolog类似于一个环形链表,在redolog中有两个指针:write pos、check point。write pos负责记录当前redolog的写入位置,如果有新来的数据,这个数据将被插入到write pos所在的位置。check point代表着刷盘位置,在check point之前的数据都是已经刷盘持久化了的数据。check point到write pos之间是redo log待落盘的数据页更改记录。write pos到check point之间的部分是redolog的空闲部分,可以在此记录新的记录。
undolog
什么是undolog?
undolog也是Innodb存储引擎自带的日志,负责保证事务的原子性及MVCC多版本并发控制。
undolog的存储形式
undolog是逻辑日志,记录了数据的逻辑变化,可以将undolog简单理解为一个负责记录相反sql语句的日志。
例:
一条INSERT语句,对应一条DELETE语句的undolog。
一条UPDATE语句(xxx + 1),对应一条相反的UPDATE语句(xxx - 1)的undolog。
这样在发生错误时,就能通过执行undolog中的相反语句来回滚到事务之前的数据状态。
undolog在事务开启之前就产生,事务提交后undolog并不会删除(Innodb会将该事务对应的undolog放入到删除列表中,后面会通过后台线程purge thread进行回收处理),因为用户可能需要rollback回滚操作,要执行回滚操作时,从undolog buffer中读取数据。
undolog实现多版本并发控制(MVCC)
undolog保存了未提交之前的版本数据,undolog中的数据可作为数据旧版本快照供其他并发事务进行快照读。
undolog的分类
-
insert undolog:
insert undolog不会被用于MVCC,所以在事务提交后这个undolog会被直接释放。(对于 INSERT 操作的 undolog,在事务提交后就可以删除了,因为这是第一个版本所以并不需要存储旧数据。) -
update undolog:
update undolog被用于MVCC。由于UPDATE和DELETE操作涉及版本控制,所以对于UPDATE或DELETE操作在事务提交后不能直接删除undolog。因为其他事务的一致性读还在用这个undolog。update undolog需要一直存储,直到没有与之关联的快照事务时才能删除。(DELETE操作会先打上删除标记,然后由purge线程来删除)