Redo Log Undo Log 与 Bin Log介绍
Posted 一只猪的思考
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redo Log Undo Log 与 Bin Log介绍相关的知识,希望对你有一定的参考价值。
redo log称为重做日志
,用来保证事务的原子性
和持久性
。
其由两部分组成:一是内存中的重做日志缓冲(redo log buffer),其是易失的;二是重做日志文件(redo log file),其是持久的。
InnoDB是事务的存储引擎,其通过Force Log at Commit
机制实现事务的持久性,即当事务提交(COMMIT)时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的COMMIT操作完成才算完成
。这里的日志是指重做日志,在InnoDB存储引擎中,由两部分
组成,即redo log和undo log。redo log用来保证事务
的持久性,undo log用来帮助事务回滚
及MVCC
的功能。redo log
基本上都是顺序
写的,在数据库运行时不需要对redo log的文件进行读取操作。而undo log
是需要进行随机
读写的。
为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,InnoDB存储引擎都需要调用一次fsync操作。fsync的效率取决于磁盘的性能,因此磁盘的性能决定了事务提交的性能,也就是数据库的性能。
参数innodb_flush_log_at_trx_commit
用来控制重做日志刷新到磁盘的策略。该参数的默认值为1,表示事务提交时必须调用一次fsync操作。还可以设置该参数的值为0和2。0表示事务提交时不进行写入重做日志操作,这个操作仅在master thread中完成,而在master thread中每1秒
会进行一次重做日志文件的fsync操作。2表示事务提交时将重做日志写入重做日志文件,但仅写入文件系统(OS 操作系统)的缓存中
,不进行fsync操作。在这个设置下,当mysql数据库发生宕机而操作
对于刷新磁盘策略,大部分企业会选择默认参数。为了提高性能,减少 fsync的发生,可以采用批量提交。
在MySQL数据库中还有一种二进制日志(binlog),其用来进行POINT-IN-TIME(PIT)的恢复及主从复制(Replication)环境的建立。从表面上看其和重做日志非常相似,都是记录了对于数据库操作的日志。然而,从本质上来看,两者有着非常大的不同。
首先,重做日志是在InnoDB存储引擎层产生
,而二进制日志是在MySQL数据库的上层
产生的,并且二进制日志不仅仅针对于InnoDB存储引擎,MySQL数据库中的任何存储引擎对于数据库的更改都会产生二进制日志。
其次,两种日志记录的内容形式不同。MySQL数据库上层的二进制日志是一种逻辑日志
,其记录的是对应的SQL语句
。而InnoDB存储引擎层面的重做日志是物理格式日志
,其记录的是对于每个页
的修改。
此外,两种日志记录写入磁盘的时间点
不同。二进制日志只在事务提交完成后
进行一次写入。而InnoDB存储引擎的重做日志在事务进行中
不断地被写入,这表现为日志并不是随事务提交的顺序进行写入的。
以上是关于Redo Log Undo Log 与 Bin Log介绍的主要内容,如果未能解决你的问题,请参考以下文章
纯手绘图解 - MySQL undo log、redo log、binlog