mysql redo log以及binlog

转载自:http://blog.itpub.net/30126024/viewspace-2216099/

总结

1、ib_logfile类似oracle的online redo log,包含commit和uncommit的数据

2、binary log类似oracle的online redo log和archive redo log,但是只有commit的数据

statement 格式的 binlog,*后会有 COMMIT;
row 格式的 binlog,*后会有一个 XID event

3、为什么MySQL有binlog,还要redo log?因为MySQL是多存储引擎的,不管使用那种存储引擎,都会有binlog,而不一定有redo log。而redo log 事务日志ib_logfile文件是InnoDB存储引擎产生的

4、ib_logfile是循环使用,binary log不是循环使用,在写满或者重启之后,会生成新的binary log文件

5、两种日志记录的内容差不多类似,都是事务对应DML、DDL的信息,只是作用不同,内容可能重复,比如一个DML记录在了ib_logfile也记录在了binary log

6、ib_logfile作为异常宕机后启动时恢复使用

7、binary log作为数据恢复使用,主从复制搭建使用

8、两种日志写入磁盘的触发点不同,二进制日志只在事务提交完成后进行一次写入,重做日志在事务提交会写入每隔1秒也会写入。MySQL为了保证master和slave的数据一致性,就必须保证binlog和InnoDB redo日志的一致性(因为备库通过二进制日志重放主库提交的事务,如果主库commit之前就写入binlog,一旦主库crash,再次启动时会回滚事务。但此时从库已经执行,则会造成主备数据不一致)。所以必须保证二进制日志只在事务提交完成后进行一次写入

9、在主从复制结构中,要保证事务的持久性和一致性,对两种日志的相关变量设置为如下*为妥当:sync_binlog=1(即每提交一次事务同步写到磁盘中);innodb_flush_log_at_trx_commit=1(即每提交一次事务都写到磁盘中)。这两项变量的设置保证了:每次提交事务都写入二进制日志和事务日志,并在提交时将它们刷新到磁盘中

10、innodb中,表数据刷盘的规则只有一个:checkpoint。但是触发checkpoint的情况却有几种(1.重用redo log文件;2.脏页达到一定比例)

11、ib_logfile作为redo log记录的是“做了什么改动”,是物理日志,记录的是”在某个数据页上做了什么修改”;

binary log记录的是这个语句的原始逻辑,分两种模式,statement格式记录的是sql语句,row格式记录的是行的内容,记录更新前和更新后的两条数据。

 

详述

ib_logfile

官方文档https://dev.mysql.com/doc/refman/5.7/en/glossary.html

一组文件,通常名为ib_logfile0和ib_logfile1,构成重做日志。 有时也称为日志组。 这些文件记录了尝试更改InnoDB表中数据的语句。 在崩溃后启动时,会自动重播这些语句以更正由不完整事务写入的数据。

此数据不能用于手动恢复; 对于该类型的操作,请使用binlog二进制日志

 

binary log

官方文档https://dev.mysql.com/doc/refman/5.7/en/binary-log.html

二进制日志包含描述数据库更改的“事件”,例如表创建操作或对表数据的更改。 它还包含可能已进行更改的语句的事件(例如,不匹配任何行的DELETE),除非使用基于行的日志记录。 二进制日志还包含有关每个语句获取更新数据的时间长度的信息。

二进制日志有两个重要目的:

用于复制

某些数据恢复操作需要使用二进制日志。备份恢复后,将重新执行备份后记录的二进制日志中的事件。 这些事件使数据库从备份点更新。

二进制日志不用于不修改数据的SELECT或SHOW等语句,也就是说select show等语句不会产生binlog

 

checkpoint

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_checkpoint

当对缓冲池中缓存的数据页进行更改时,这些更改将在稍后的某个时间写入数据文件,这一过程称为刷新。 检查点是已成功写入数据文件的*新更改(由LSN值表示)的记录。

 

sharp checkpoint

将重做条目包含在重做日志的某些部分中的所有脏缓冲池页面刷新到磁盘的过程。 在InnoDB覆盖重用日志文件之前发生 ; 日志文件以循环方式使用。 通常发生写入密集型工作负载。

 

flush

将发生在内存区域或临时磁盘存储区域中缓冲的 更改写入数据库文件 。 定期刷新的InnoDB存储结构包括重做日志,撤消日志和缓冲池。

刷新可能是因为 内存区域已满并且系统需要释放一些空间 ,因为提交操作意味着可以*终确定事务的更改,或者因为慢速关闭操作意味着应该*终完成所有未完成的工作。 当一次刷新所有缓冲数据并不重要时,InnoDB可以使用一种称为 模糊检查点 的技术来刷新小批量页面以分散I / O开销。