您的位置:首页 > 数据库 > MySQL

InnoDB存储引擎redo log文件——《MySQL技术内幕InnoDB存储引擎》读书笔记

2016-01-04 15:20 537 查看
redo log的作用是记录事务日志。万一实例或介质失败,可以通过redo log进行恢复,保证数据的完整性。

每个InnoDB存储引擎至少有1个redo log文件组,每个文件组下至少有2个redo log文件。为了得到更高的可靠性,可以设置多个mirrored log group,将不同的文件组放在不同的磁盘上。日志组中每个redo log文件的大小一致,并以循环方式使用。InnoDB存储引擎先写redo log文件1,当达到文件的最后是,会切换至文件2,当文件2也被写满时,会再切换到文件1中。

参数innodb_log_file_size指定了redo log文件的大小;innodb_log_files_in_group指定了redo log文件组中redo log文件的数量,默认为2;innodb_mirrored_log_groups指定了日志镜像文件组的数量,默认为1,代表只有一个文件组,没有镜像;innodb_log_group_home_dir指定了日志文件组所在路径,默认在数据库路径下。

redo log文件的大小不能设置得太大,如果设置得太大,在恢复时可能需要很多的时间,另一方面又不能太小,否则可能导致一个事务的日志需要多次切换redo log文件。

InnoDB存储引擎的redo log文件记录关于每个page的更改的物理情况。在事务进行的过程中,不断有redo entry被写入redo log文件中。

redo log结构

Space idPageNoOpCodeData
对于写入redo log文件的操作不是直接写,而是先写入一个redo log buffer中,然后按照一定的条件写入日志文件。

主线程每秒会将redo log buffer写入磁盘的redo log文件中,无论事务是否已经提交。另一个触发写入过程是由innodb_flush_log_at_trx_commit控制,表示在commit操作时,处理redo log的方式。

参数innodb_flush_log_at_trx_commit可设置的值有0、1、2。0代表当前事务提交时,并不将事务的redo log写入磁盘上的日志文件,而是等待主线程每秒的刷新。而1和2不同的地方在于:1是在commit时将重做日志缓冲同步写到磁盘;2是重做日志异步写到磁盘,不能保证commit时肯定会写入redo log文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: