InnoDB(3,韩顺平 java 从入门到精通课件
InnoDB 采用将存储的数据按表空间(tablesapce)进行存放的设计,在默认配置下会有一个初始大小为 10MB,名为 ibdata1 的文件,该文件就是默认的表空间文件(tablespace file),用户可以通过参数 innodb_data_file_path 对其进行设置
如果设计了 innodb_data_file_path 参数,所有基于 InnoDB 存储引擎的表的数据都会记录到该共享表空间中,如果还设置了参数 innodb_file_per_table,则用户可以将每一个基于 InnoDB 存储引擎的表产生一个独立表空间,独立表空间的命名为:表明.idb。
这些单独的表空间文件仅仅存储该表的数据、索引和插入缓冲 BITMAP 等信息,其余信息还是会放在默认的表空间中的。
在默认情况下,InnoDB 存储的数据目录会有两个名为 ib_logfile0 和 ib_logfile1 的文件,这两个就是重做日志文件(redo log file)
重做日志对 InnoDB 存储引擎至关重要,他们记录了对于 InnoDB 存储引擎的事务日志。
当实例或者介质失败时,InnoDB 存储引擎会使用重做日志恢复到之前的状态,以此来保证数据的完整性
每个 InnoDB 存储引擎至少有 1 个重做日志文件组(group),每个文件组都至少有 2 个重做日志,比如默认的 ib_logfile0 和 ib_logfile1,同一个日志组中的每个重做日志的大小都是一致的,并以循环写入的方式去运行,即会先去写重做日志 1,重做日志 1 写满后会切换至重做日志 2(此时会对重做日志 1 进行回收空间利用,回顾之前的 Master Thread 执行),但重做日志 2 也写满后,再用重做日志 1。
关于重做日志镜像组
首先先认识什么是高可用性:高可用性就是指尽可能的减少停止服务的时间(由于某种原因,比如磁盘损坏,文件缺失)
重做日志镜像组可以提升高可用性,将镜像组放在别的磁盘上,那么一旦重做日志出现了问题,可以用镜像组来进行替代。
重做日志受下列的参数影响
innodb_log_file_size
innodb_log_files_in_group
innodb_mirrored_log_groups
innodb_log_group_home_dir
innodb_log_file_size 决定了每一个重做日志文件的大小、
innodb_log_files_in_group 指定了每个日志文件组这种重做日志文件的数量(默认为 2)
innodb_mirrored_log_groups 指定了日志文件镜像
组的数量(默认为 1,表示只有一个日志文件组,没有镜像)
innodb_log_group_home_dir 指定了日志文件组所在的路径(默认为./,为根目录)
重做日志的大小设置
重做日志的大小设置对于 InnoDB 存储引擎的性能有着非常大的影响,如果太大,会导致恢复时载入重做日志会需要很长的时间,如果太小,一个事务的日志可能需要来回切换好几次重做日志(重做日志写入的循环性),此外重做日志太小会导致频繁地发生 async checkpoint(前面体系架构中提到过的,重做日志不可用时,发生的 checkpoint),导致性能的抖动。
重做日志里面有一个 capacity 变量,该值代表了最后的检查点不能超过这个阈值,如果超过则必须将缓冲池中的一些脏页刷新进磁盘中(刷新进去就持久化了,重做日志就不需要这部分内容,可以释放这部分内容来重用空间),即发生 async checkpoint,进行刷新脏页,这时候会导致用户阻塞的。
重做日志与二进制日志的区别
二进制日志记录所有与 MySQL 数据库相关的事务日志记录(包括其他引擎),但重做日志只记录 InnoDB 或者本身引擎,而且是关于事务方面的事务日志。
其次是记录内容的不同,二进制日志是记录事务具体操作内容,而 InnoDB 的重做日志记录的是每个页的更改的物理情况
此外是写入的时间也不同,二进制日志是仅在事务提交前进行提交,即无论该事务多大,它只会提交一次,而在事务进行过程中,由于事务持久性的影响,在一个事务中,重做日志必须不断的进行更新写入。
重做日志的条目结构
重做日志的条目结构,即重做日志里面的内容,总共有以下 4 个部分
redo_log_type:占用 1 字节,表示重做日志的类型
space:占用小于 4 字节,表示表空间的 ID,但是采用压缩方式表示
page_no:表示页的偏移量,同样采用压缩的方式
redo_log_body:表示重做日志的数据部分,恢复时,要调用对应函数才可以解析
前面已经提到过,重做日志的写入也不是直接写,而是先写入一个重做日志缓冲中,然后按照一定的条件顺序地被刷新进日志文件
评论