
MySQL 日志(redo log、binlog)刷盘策略
我们知道 MySQL 是采用两段提交策略来保证事务的原子性的,redo log 刷盘的时机是在事务提交的 commit 阶段采取
刷盘的,在此之前,redo log 都存在于 redo log buffer 这块指定的内存区域中。
1:write 和 fsync 区别#
这里我们首先要明确两个概念和两个参数:
write:刷盘
fsync:持久化到磁盘
write(刷盘)指的是 MySQL 从 buffer pool 中将内容写到系统的 page cache 中,并没有持久化到系统磁盘上。这个速度
其实是很快的。
fsync 指的是从系统的 cache 中将数据持久化到系统磁盘上。这个速度可以认为比较慢,而且也是 IOPS 升高的真正原因。
2:MySQL 日志刷盘控制参数#
innodb_flush_logs_at_trx_commit(redo log)
取值 0:每次提交事务都只把 redo log 留在 redo log buffer 中
取值 1:每次提交事务都将 redo log 持久化到磁盘上,也就是 write+fsync
取值 2:每次都把 redo log 写到系统的 page cache 中,也就是只 write,不 fsync
sync_binlog(binlog)
取值 0:每次提交都将 binlog 从 binlog cache 中 write 到磁盘上,而不 fsync 到磁盘
取值 1:每次提交事务都将 binlog fsync 到磁盘上
取值 N:每次提交事务都将 binlog write 到磁盘上,累计 N 个事务之后,执行 fsync
3:MySQL 没动刷盘场景#
在某些特定场景下,redo log 会在 commit 这个动作到来之前进行刷盘操作,例如下面的两种情况会让没有提交的事
务的 redo log 写入磁盘:
评论