Redo log(Innodb存储引擎的日志文件)
redo log通常是物理日志,记录的是数据页的物理批改,用来复原提交后的数据页,且只能复原到最初一次提交的地位,即前滚。redo log保障了Mysql的持久性(Durability)。
Redo log的运行原理
redo log分为两局部,一是内存中的缓冲日志(redo log buffer),该局部是易失性的,二是磁盘上的重做日志(redo log file),该局部是长久的。
当事务提交的时候,Innodb存储引擎会先把日志写入内存中缓冲区(redo log buffer),而后写入到OS Buffer,此时事务就算是完结了,而后Innodb会在适合的机会将日志同步(fsync)到磁盘中的redo log file中,这时,就算数据库产生异样重启,Mysql也会从redo log file中将数据恢复,保障了事务的Durability。
ps:redo log file是固定大小的, 是一个循环写的过程
Mysql提供了三种形式将redo log buffer中日志刷到redo log file,能够通过设置innodb_flush_log_at_trx_commit来决定
当设置为0时,事务提交时不会将log buffer中的日志写入到os buffer,而是每秒写入os buffer并调用fsync()同步到log file中。如果零碎解体,会失落1秒钟的数据。
当设置为1时,事务提交时会间接将log buffer中的日志写入到os buffer,同时调用fsync()同步到log file中。这种形式,即便零碎解体,也不会产生数据失落,然而IO性能较差。
当设置为2时,事务提交时会间接将log buffer中的日志写入到os buffer,而后每秒调用一次fsync()同步到log file中。如果零碎解体,也会失落1秒钟的数据。