MySQL日志

Posted by Liao on 2022-07-04

一、Redo Log

1.1 定义

Redo log是物理日志,记录事务提交时,数据页的物理修改(具体存放了什么数据),用于实现事务的持久性。

1.2 作用

保证事务的持久性。保证内存中和磁盘中数据的一致性,当刷新脏页到磁盘,发生错误时,进行数据恢复。

1.3 操作原理

Redo Log由 重做日志缓冲 (Redo Log buffer) 和 重做日志文件 (Redo Log file) 组成。前者在内存中,后者在磁盘中。

  1. 当进行数据操作(增、删、改)时,首先在Buffer Pool中查找有没有需要更新的数据,若没有找到则通过后台线程将数据从磁盘中读取,保存在Buffer Pool中

  2. 对Buffer Pool增删改的数据,记录在Redo Log buffer中

    • 对Buffer Pool的数据进行操作,这时候Buffer Pool的数据有所变更,但磁盘的内容还没变,此时Buffer Pool的数据页就是脏页。需要通过一定时间,通过后台线程将脏页数据刷新到磁盘,以保证磁盘和内存数据的一致性。
  3. 事务提交时,会将Redo Log buffer的数据异步刷新到磁盘中。当脏页刷新数据到磁盘中时,Redo Log进行数据恢复

    直接将Buffer Pool中的脏页刷新到磁盘?此时有个2问题:

    • 但若此时脏页异步刷新到磁盘的操作失败,此时事务已经提交了,客户端也收到更新成功,但脏页刷新失败,那么此时就不能保证「持久性」了。
    • 一次事务中,可能要操作很多条记录(增、删、改),而这些记录都是随机操作到数据页的,这时会涉及大量的随机磁盘IO,性能低。因此要考虑先将修改的数据放到redo log buffer,commit之后异步追加到磁盘中的redo log file中,是顺序磁盘IO,性能高
  4. 每隔一段时间,会清理redo log

    如果顺利将Buffer Pool中的脏页数据刷到磁盘,则不需要redo log

Innodb采用WAL技术(write-ahead logging),思想是先写日志再写磁盘,只有日志写成功,才算事务提交成功。

1.4 优点

  • redo log降低了刷盘频率。由于修改某个表的某个字段时,数据从磁盘读加载内存是以页为单位的,若每时每刻从内存刷磁盘的话,性能大大降低
  • redo log占用空间非常小

1.5 特点

  • redo log 日志是顺序写入磁盘,比随机磁盘IO要快
  • 事务执行过程中,redo log不断记录

二、Undo Log

2.1 定义

undo log属于逻辑日志,即记录每一步执行什么样的操作(sql语句),在发生错误时回滚之前的操作。

undo log会记录每一条数据变更的逆向过程,如增加insert语句,undo log则会记录delete语句;update一个语句,undo log则会记录update前的值

2.2 作用

  • 事务的回滚(保证原子性)
  • MVCC(一致性)

三、binlog

binlog是逻辑日志,记录语句的原始逻辑