redo log包含日志缓冲(redo log buffer)和磁盘上的日志文件(redo logfile)两部分。
mysql每执行新一条dml语句都会先将日志记录在redo log buffer,后续在某个时间点再将多条操作记录写到redo log file,这种先写日志再写磁盘的技术就是mysql中WAL技术(writing-ahead logging)。
在计算机的操作系统中用户空间缓冲区的数据是无法直接写入磁盘的,中间必需经过操作系统缓冲区(OS Buffer)。因此,redo log buffer写入redo log file,实际上会先写入OS Buffer,然后再调用fsync()将其刷入到redo log file。
redo log刷盘步骤:redo log buffer→os buffer→磁盘(redo log file)
铺垫了这么多,redo log在什么时候写入磁盘呢?
mysql通过innodb_flush_log_at_trx_commit配置来控制redo log的写盘时机。
0:延迟写。提交事务时不会将redo log写入os buffer,而是每隔1秒将redo log写入os buffer并调用fsync()刷入磁盘。系统崩溃会丢失一秒钟的数据。
1:实时写,实时刷。每次提交事务都将redo log写入os buffer并调用fsync()刷入磁盘。这种方式系统奔溃不会丢失数据,因每次提交事务都写入磁盘,性能比较差
2:实时写,延时刷。每次提交事务都将redo log写入os buffer,但并不会马上调用fsync()刷如磁盘,而是间隔1秒调fsync()刷盘。相对于每次提交都写盘和每隔1秒写盘,实施写os buffer延时刷盘是一个数据一致性与性能的之间的这种方案。