Redo Log的写入并不是直接写入磁盘,Innodb引擎会在写入Redo Log的时候先写入Redo log buffer,之后以一定的频率刷入到真正的redo log file中。这里的一定频率就是接下来的刷盘策略。
那redo log buffer刷盘到redo log file的过程也不是真正的去刷入磁盘,它只是刷入到文件系统缓存(page
cache)中(现代操作系统为了提高文件写入效做的一个优化),真正的写入会交给操作系统自己来决定(比如Page Cache)足够大了。针对这种情况,Innodb给出了Innodb_flush_log_at_trx_commit参数
这个参数有三种策略
设置为1:每次提交事务都将进行同步,刷盘操作(默认)
设置为0:每次事务提交不进行刷盘操作(系统默认master thread每隔1s进行一次重做日志的同步)
设置为2:表示每次事务提交时都只把redo log buffer内容写入page cache,不进行同步,由文件系统(os)自己决定什么时候同步到磁盘。
另外,innodb存储引擎有一个后台线程,每隔1秒,就会把redo log buffer中的内容写到文件系统缓存(page cache),然后调用刷盘操作。
图解Innodb_flush_log_at_trx_commit=1
- 只要更新数据,RedoLogBuffer就在实时做记录,跟Innodb_flush_log_at_trx_commit没有关系,Innodb_flush_log_at_trx_commit这个影响的是在提交事务的时候起作用,设置为1的话就是一提交就写入Page Cache,做刷盘。
图解Innodb_flush_log_at_trx_commit=2
-
当提交事务的时候,去看Innodb_flush_log_at_trx_commit这个值为2,马上就会把redo log buffer中的数据更新到page cache中,但是刷盘的时间由操作系统决定
-
图解Innodb_flush_log_at_trx_commit=0
- 当提交事务的时候,如果参数为0,那么就直接不管了,交给后台线程去刷盘。