MySQL事务日志

112 阅读4分钟

MySQL事务日志

Mysql事务日志有三大类:binlog、redo log和undo log

  1. Redo log重做日志的意思,作用是用于恢复数据,
  2. undo log的主要作用也就是回滚数据,
  3. binlog记录的是修改之后的数据,用于归档,

 

redo log

redo log记录的是修改之后的数据,提供了崩溃恢复的能力。

undo log如何回滚数据

 

redo log 的作用是用于恢复数据,写 redo log 的过程是磁盘顺序写,有三种刷盘策略,有 innodb_flush_log_at_trx_commit 参数控制,推荐设置成 2

顾名思义,redo是重做的意思,redo log就是重做日志的意思。

redo log是如何保证数据不会丢失的呢?

就是在修改之后,先将修改后的值记录到磁盘上的redo log中,就算突然断电了,Buffer Pool中的数据全部丢失了在来电的时候,可以将redo log里面的数据读出来恢复数据,用这样的方式保证了数据不会丢失。

 

为什么不直接将修改的数据写到数据文件里面去呢,要先写到redo log中

因为redo log是磁盘顺序写,数据刷盘是磁盘随机写,磁盘的顺序写比随机写高效的多

 

redo log buffer的作用

redo log虽然磁盘顺序写已经很高效了,但是和内存操作还是有一定的差距。因此引入了redo log buffer

作用主要用于redo log的刷盘机制

 

redo log的刷盘机制

redo log的刷盘机制由参数innodb_flush_log_at_trx_commit控制,这个参数有3个值可以设置:

  1. innodb_flush_log_at_trx_commit = 1:实时写,实时刷
  2. innodb_flush_log_at_trx_commit = 0:延迟写,延迟刷
  3. innodb_flush_log_at_trx_commit = 2:实时写,延迟刷

写可以理解成写到操作系统的缓存(os cache),刷可以理解成把操作系统里面的缓存刷到磁盘。

 

 

undo log(回滚日志)

undo log记录的是修改之前的数据,提供回滚的能力

undo log的主要作用也就是回滚数据

undo log如何回滚数据

对于更新sql的话

MySQL在将age = 1修改成age = 2之前,先将age = 1存到undo log里面去,这样需要回滚的时候,可以将undo log里面的age = 1读出来回滚。

 

 

image.png

 

Binlog(归档)

binlog记录的是修改之后的数据,用于归档。主从同步

 

binlog的刷盘策略

binlog也有着自己的刷盘策略,通过sync_binlog参数控制:

  • sync_binlog = 0 :每次提交事务前将binlog写入os cache,由操作系统控制什么时候刷到磁盘
  • sync_binlog =1 :采用同步写磁盘的方式来写binlog,不使用os cache来写binlog
  • sync_binlog = N :当每进行n次事务提交之后,调用一次fsync将os cache中的binlog强制刷到磁盘

 

binlog和redo log两者有什么区别

binlog和redo log都是记录的修改之后的值,有redo log为什么还需要binlog呢?

·  binlog是逻辑日志,记录的是对哪一个表的哪一行做了什么修改;redo log是物理日志,记录的是对哪个数据页中的哪个记录做了什么修改,如果你还不了解数据页,你可以理解成对磁盘上的哪个数据做了修改。

·  binlog是追加写;redo log是循环写,日志文件有固定大小,会覆盖之前的数据。

·  binlog是Server层的日志;redo log是InnoDB的日志。如果不使用InnoDB引擎,是没有redo log的

 

 

总结

 

·  Buffer Pool是MySQL进程管理的一块内存空间,有减少磁盘IO次数的作用。

·  redo log是InnoDB存储引擎的一种日志,主要作用是崩溃恢复,有三种刷盘策略,有innodb_flush_log_at_trx_commit 参数控制,推荐设置成2。

·  undo log是InnoDB存储引擎的一种日志,主要作用是回滚。

·  binlog是MySQL Server层的一种日志,主要作用是归档。

·  MySQL挂了有两种情况:操作系统挂了MySQL进程跟着挂了;操作系统没挂,但是MySQL进程挂了。