写点什么

InnoDB(3,韩顺平 java 从入门到精通课件

用户头像
Java高工P7
关注
发布于: 2 小时前

表空间文件




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 指定了日志文件镜像


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


组的数量(默认为 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:表示重做日志的数据部分,恢复时,要调用对应函数才可以解析



前面已经提到过,重做日志的写入也不是直接写,而是先写入一个重做日志缓冲中,然后按照一定的条件顺序地被刷新进日志文件

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
InnoDB(3,韩顺平java从入门到精通课件