MySQL事务日志
Mysql事务日志有三大类:binlog、redo log和undo log
- Redo log重做日志的意思,作用是用于恢复数据,
- undo log的主要作用也就是回滚数据,
- 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个值可以设置:
- innodb_flush_log_at_trx_commit = 1:实时写,实时刷
- innodb_flush_log_at_trx_commit = 0:延迟写,延迟刷
- 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读出来回滚。
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进程挂了。