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 秒钟的数据。