除了mysql数据库本身的文件外,各个存储引擎还有自己独有的文件,与innodb密切相关的文件有:
1)表空间文件:
innodb采用将存储的数据按表空间进行存放的设计,在默认配置下会有一个初始大小为10mb.名为ibdata1的文件,该文件即为默认的表空间文件,可以通过参数innodb_data_file_path进行设置,用户可以通过多个文件组成一个表空间,同时制定文件的 属性(大小,是否自动扩大等),若设置了参数innodb_file_per_table,则用户可以每个基于innodb存储引擎的表产生一个独立的 表空间,命名为表名.ibd,这样就不用将所有数据都存放在默认的表空间中了,这些单独的表空间文件只存储该表的数据、索引和插入缓冲bitmap的信息,其余的还是存放在默认的表空间中。
2)重做日志文件:
innodb数据目录下默认有两个名为ib_logfile0和ib_logfile1的文件,记录了对于innodb存储引擎的事务日志。当实例或者介质失败后,比如数据库由于其所在的主机掉电导致实例失败。则可以通过重做日志恢复到掉电前的时刻,保证数据的完整性,
每个innodb存储引擎至少有一个重做日志文件组,每个文件至少有两个重做日志文件,为了得到更高的可靠性,用户可以设置多个镜像日志组,将不同的文件组放在不同的磁盘上,以此提高重做日志的高可用性,在日志组中每个重做日志文件的大小一致,并以循环写入的方式运行(先写重做日志文件1,达到文件最后时,切换到文件2,文件2被写满后,再切换到文件1).
下面参数影响着重做日志文件的属性:
innodb_log_file_size:
指定每个重做日志文件的大小,innodb1.2.x版本之前大小不得大于4GB,1.2.x之后扩大为512GB,
innodb_log_files_in_group:
指定了 日志文件组中重做日志文件的数量,默认为2,
innodb_mirrored_log_groups:
指定了日志镜像文件组的数量,默认为1,表示只有一个文件组,没有镜像
innodb_log_group_home_dir:
指定了日志文件组所在的路径,默认为./,表示在mysql数据库的数据目录下。
与二进制日志的区别:
1.二进制日志记录所有与mysql数据库有关的日志记录,包括其他的存储引擎的日志,而重做日志只记录有关该存储引擎的事务日志。
2.记录的内容不同,二进制日志记录的都是关于一个事务的具体操作内容,即逻辑日志,而重做日志记录的是关于每个页的更改的物理情况,
3.写入的时间也不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次,无论这个事务多大,而在事务的进行过程中,不断有重做日志条目被写入重做日志文件中,
innodb存储引擎中,对于不同的操作有不同的重做日志格式,但是他们都有基本的格式,
写入重做日志文件的操作不是直接写,而是先写入一个重做日志缓冲,再按照一定的条件顺序写入,从重做日志缓冲写入磁盘时,按512个字节 也就是一个扇区的大小写入,扇区是最小的写入单位,因此一定会成功,也就不需要有doublewrite.
从日志文件缓冲写入磁盘的条件是:
1.主线程(master thread)每秒会将重做日志缓冲写入磁盘
2.参数innodb_flush_log_at_trx_commit控制,表示在提交的时候,处理重做日志的方式,0(提交事务时,不将事务的重做日志写入磁盘的日志文件,而是等待主线程的每秒刷新)、1(提交时将重做日志写入磁盘的日志文件,伴有fysnc的调用)、2(将重做日志异步写入磁盘,即写到文件系统的缓存,因此不能保证提交时肯定会写入日志文件中,只有这一个动作发生)三个有效值,为了保证事务的持久性,必须设置为1,即每当有事务提交时,就必须确保事务都已经写入重做日志文件,那么当数据库发生宕机,也可以通过重做日志文件恢复, 设置为2,可以保证数据库发生宕机而操作系统及服务器没有发生宕机,可以恢复数据,