innodb_flush_log_at_trx_commit - xiaoboluo768/qianjinliangfang GitHub Wiki
- 控制redo buffer何时刷新到磁盘日志文件的参数
- innodb_flush_log_at_trx_commit参数可以控制将redo buffer中的更新记录写入到磁盘日志文件的操作时机,通过调整这个参数,可以在性能和数据安全之间做取舍。此参数有以下几个值:
- 0:在事务提交时,不会立即触发将缓存日志写入到磁盘日志文件中,而是大约每秒一次由主线程刷新到磁盘文件的操作,并调用操作系统的fsync刷新IO缓存。最不安全,但是性能最好。如果mysql服务挂掉或者操作系统挂掉,会丢失至少一秒的数据(由于主线程最小每秒去落盘,主线程可能由于工作负载的原因,这个循环间隔可能大于1S才去执行,那么如果碰到这种情况下mysqld或者操作系统crash掉了,将丢失超过一秒的数据)
- 1:在事务提交时,Innodb立即触发将缓存中的redo日志写回到磁盘日志文件中,并调用系统fsync刷新IO缓存,最安全,但是性能最差。mysql挂掉或者操作系统挂掉不丢失数据。完全符合ACID的标准要求设置为1
- 2:在事务提交时,innodb立即将缓存中的redo日志写回到日志文件,但是并不马上调用fsync来刷新IO缓存,而是大约每秒一次磁盘IO缓存刷新操作或者交由操作系统来决定何时刷新磁盘IO缓存。安全性和性能介于0和1之间,如果mysql服务挂掉而操作系统不挂,不会丢失数据,如果操作系统挂掉,也会丢失至少一秒的数据(由于主线程最小每秒去落盘,主线程可能由于工作负载的原因,这个循环间隔可能大于1S才去执行,那么如果碰到这种情况下mysqld挂了,不会丢失数据,但是如果操作系统crash掉了,将丢失超过一秒的数据)
- InnoDB日志刷新频率由innodb_flush_log_at_timeout参数控制,允许您将日志刷新频率设置为N秒(其中N为1 ... 2700,默认值为1)。但是,如果mysqld进程崩溃或者操作系统崩溃都可以导致丢失多达N秒的事务
- DDL操作和其他内部InnoDB活动刷新InnoDB日志的动作不受此参数控制
- innodb的崩溃恢复过程中,忽略该参数的设置,总是完全应用redo log(前滚和回滚)
- 对于有主从复制的环境,要保证主从数据的持久性和一致性,必须设置该参数为1,且同时设置sync_binlog=1
- 全局变量,动态变量,默认值为1,枚举类型
- 警告:许多操作系统和某些磁盘硬件会执行flush-to-disk操作欺骗。即他们可能告诉mysqld redo log已经落盘了,其实这个时候并没有落盘。在这种情况下,即使设置1,也不能保证事务的持久性,在最坏的情况下,断电可能会损坏InnoDB数据。所以使用UPS备用电源和带BBU的阵列卡可以使操作更安全。当然您也可以尝试禁用磁盘缓存硬件高速缓存
- innodb_flush_log_at_trx_commit参数可以控制将redo buffer中的更新记录写入到磁盘日志文件的操作时机,通过调整这个参数,可以在性能和数据安全之间做取舍。此参数有以下几个值:
上一篇:innodb_fast_shutdown | 下一篇:innodb_force_recovery