??每个表存储引擎有自己独有的文件。
一、表空间文件
??InnoDB采用将存储的数据按表空间(tablespace)进行存放的设计。 ??默认配置下有一个初识大小为10M,名为ibdata1的文件,默认的表空间文件(tablespace file)。 ??通过参数innodb_data_file_path设置文件
innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend
??表示将/db/ibdata1和/dr2/db/ibdata2两个文件来组成表空间,其中ibadata1的大小为2000M,文件ibdata2的大小为2000MB,如果用完了这2000MB,该文件可以自动增长(autoextend)。
??除了共享表空间,还可以设置独立表空间,通过参数innodb_file_per_table控制,生成的文件名为:表名.ibd
show variables like 'innodb_file_per_table'
二、重做日志文件
??记录InnoDB存储引擎事务日志的文件称作重做日志文件(redo log file)。
2.1 概述
??每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组下至少有2个重做日志文件,如默认的ib_logfile0和ib_logfile1。为了得到更高的可靠性,用户可以设置多个的镜像日志组(mirrored log groups),将不同的文件组放在不同的磁盘上。
??相同组内的文件是循环写入日志的。
2.2 相关参数
-
innodb_log_file_size 指定每个重做日志文件的大小。 -
innodb_log_files_in_group 指定日志文件组中重做日志文件的数量,默认为2。 -
innodb_mirrored_log_groups 指定日志镜像文件组的数量,默认为1。 -
innodb_log_group_home_dir 指定日志文件组所在的路径,默认为./,表示在MYSQL数据路的数据目录下。
??查看配置
show variables like 'innodb%log%'
2.3 与二进制日志文件的区别
??1、范围不同。二进制日志会记录所有与MYSQL数据库有关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。而InnoDB存储引擎的重做日志只记录有关该存储引擎本身的事务日志。
??2、记录的内容不同。二进制日志记录的都是关于一个事务的具体操作内容,即该日志是逻辑日志。而InnoDB存储引擎的重做日志记录的是关于每个页(Page)的更改物理情况。
??3、写入的时间不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次,不论这时该事务多大。而在事务进行的过程中,却不断有重做日志条目(redo entry)被写入到重做日志文件中。
2.4 重做日志条目结构
??redo_log_type | space | page_no | redo_log_body
-
redo_log_type 占用1字节,表示重做日志的类型。 -
space表示表空间的ID,采用压缩的方式,因此占用的空间可能小于4字节。 -
page_no 表示页的偏移量,同样采用压缩的方式 -
redo_log_body 表示每个重做日志的数据部分,恢复时需要调用相应的函数进行解析。
2.5 重做日志文件的写入过程
??写入重做日志文件的操作不是直接写,而是先写入一个重做日志缓冲(redo log buffer)中,然后按照一定的条件顺序地写入日志文件。
??从重做日志缓冲往磁盘写入时,是按512个字节,也就是一个扇区的大小进行写入。因为扇区是写入的最小单位,因此可以保证写入必定是成功的。因此在重做日志的写入过程中不需要有doublewrite。
??从日志缓冲写入磁盘上的重做日志文件的条件:
??1、主线程会每秒将重做日志缓冲写入磁盘的重做日志文件中,不论事务是否已经提交。
??2、另一个触发写磁盘是由 innodb_flush_log_at_trx_commit 控制,表示在提交(commit)操作时,处理重做日志的方式。0,1,2值所代表的含义:
-
0,表示当提交事务时,并不将事务的重组哦日志写入磁盘,而是等待主线程每秒的刷新。 -
1,表示在执行commit时将重做日志缓冲同步写到磁盘,即伴有fsync的调用。为了保证事务的ACID,必须选1。 -
2,表示将重做日志异步写到磁盘,并不能完全保证在执行cmomit时肯定会写入。
|