[MySQL] 日志刷盘机制
概念
MySQL的InnoDB日志管理机制中,有一个概念叫MTR(mini-transaction)
。
MySQL中把对底层页面的一次原子访问的过程称之为一个Mini-Transaction,这里的原子操作,指的是要么全部成功,要么全部失败,不存在中间状态。
向底层页面插入一个新的record,至少会产生两个MTR。首先对page的修改要持久化,需要redo log,这里是一个MTR。InnoDB为了支持MVCC和事务回滚,会产生一个undo log,undo log写入undo page,这需要一个MTR。
MTR承上启下,是上面逻辑层与下面物理层的交互窗口,同时保证下层物理数据的正确性、完整性及持久性的机制:
日志刷盘触发条件
触发条件 | 描述 |
---|---|
时间 | 线程默认每秒刷新一次 |
手机 | Log Buffer空间用尽 |
Check Point | 既有空间触发也有时间触发,主要分为Sharp Checkpoint和Fuzzy Checkpoint |
强一致事务要求 | 根据参数innodb_flush_log_at_trx_commit值不同,产生不同的行为 |
innodb_flush_log_at_trx_commit
0:每次事务提交时,根本不会去刷日志缓冲区。log buffer将每秒一次地写入到OS cache的log file中,并且log file的flush(刷到磁盘)上的Log Files操作同时进行。
1:每次事务提交时MySQL都会把log buffer的数据写入到OS cache的log file,并且flush(刷到磁盘)Log Files中去,该模式为系统默认。
2:每次事务提交时MySQL都会把log buffer的数据写入到OS cache的log file,但是flush(刷到磁盘)Log Files的操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
当设置为0,该模式速度最快,但不太安全,这种设置是最危险的。如果此时运气不好,mysqld进程的崩溃,那么对数据库最新的更新都会丢失,即使事务已经提交了。但一般丢失的数据都是在一秒内产生的。
当设置为1,该模式是最安全的,但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。
当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。
此参数可根据业务的可靠性要求进行调整,参数的选择对性能影响较大。