MySQL三大日志知识点总结

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线程来删除)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值