redo log buffer是一块内存区域,存放将要写入redo log文件的数据。redo log buffer大小是通过设置innodb_log_buffer_size参数来实现的。redo log buffer会周期性地刷新到磁盘的redo log file中。一个大的redo log buffer允许大事务在提交之前不写入磁盘的redo log文件。因此,如果有事务需要update、insert、delete许多记录,则可增加redo log buffer来节省磁盘I/O。
参数innodb_flush_log_at_trx_commit选项控制redo log buffer的内容何时写入redo log file,即控制redo log flush的频率。
innodb_flush_log_at_trx_commit的参数取值及其说明如下:
刷写其实是两个操作,即刷(flush)和写(write)。区分这两个概念(两个系统调用)是很重要的。在大多数的操作系统中,把InnoDB的log buffer(内存)写入日志(调用系统调用write),只是简单地把数据移到操作系统缓存(内存)中,并没有实际持久化数据。
通常设置为0的时候,mysqld进程的崩溃会导致上一秒钟的所有事务数据丢失。当该值为2时,表示事务提交时不写入重做日志文件,而是写入文件系统缓存中,当DB数据库发生故障时能恢复数据,如果操作系统也出现宕机,就会丢失掉文件系统没有及时写入磁盘的数据。
设为1当然是最安全的,适合数据安全性要求非常高的而且磁盘I/O写能力足够支持业务,比如订单、交易、充值支付消费系统。如果对数据一致性和完整性要求不高,完全可以设为2,推荐使用带蓄电池后备电源的缓存cache,防止系统断电异常。如果只要求性能,例如高并发写的日志服务器,就设置为0来获得更高性能。