
mysql的 redo logRedo Log介绍Redo顾名思义就是重做。以恢复操作为目的在数据库发生意外时重现操作。Redo Log指事务中修改的任何数据将最新的数据备份存储的位置Redo Log被称为重做日志。Redo Log 的生成和释放随着事务操作的执行就会生成Redo Log在事务提交时会将产生Redo Log写入Log Buffer事务的提交不会立刻写入磁盘文件。MySQL 里经常说到的 WAL 技术WAL 的全称是Write-Ahead Logging它的关键点就是先写日志再写磁盘等事务操作的脏页写入到磁盘之后Redo Log 的使命也就完成了Redo Log占用的空间就可以重用被覆盖写入。Redo Log工作原理Redo Log 是为了实现事务的持久性而出现的产物。防止在发生故障的时间点尚有脏页未写入表的IBD文件中在重启 MySQL 服务的时候根据 Redo Log 进行重做实现事务的未入磁盘数据进行持久化这一特性。Redo Log写入机制Redo Log 文件内容是以顺序循环的方式写入文件写满时则回溯到第一个文件进行覆盖写。如图所示write pos是当前记录的位置一边写一边后移写到最后一个文件末尾后就回到 0 号文件开头checkpoint是当前要擦除的位置也是往后推移并且循环的擦除记录前要把记录更新到数据文件write pos 和 checkpoint 之间还空着的部分可以用来记录新的操作。如果 write pos 追上checkpoint表示写满这时候不能再执行新的更新得停下来先擦掉一些记录把 checkpoint推进一下。有了 redo logInnoDB 就可以保证即使数据库发生异常重启之前提交的记录都不会丢失这个能力称为crash-safeRedo Log相关配置参数每个InnoDB存储引擎至少有1个重做日志文件组group每个文件组至少有2个重做日志文件默认为ib_logfile0和ib_logfile1。可以通过下面一组参数控制Redo Log存储show variables like %innodb_log%;Redo Buffer持久化到Redo Log的策略可通过Innodb_flush_log_at_trx_commit设置0每秒提交 Redo buffer - OS cache - flush cache to disk可能丢失一秒内的事务数据。由后台Master线程每隔 1秒执行一次操作。1默认值每次事务提交执行 Redo Buffer - OS cache - flush cache to disk最安全性能最差的方式。2每次事务提交执行 Redo Buffer - OS cache然后由后台Master线程再每隔1秒执行OS cache - flush cache to disk 的操作。一般建议选择取值2因为 MySQL 挂了数据没有损失整个服务器挂了才会损失1秒的事务提交数据。