[InnoDB 学习2] 存储引擎文件

 

构成MySQL数据库和InnoDB存储引擎表的各种类型文件:

  • 参数文件:初始化某些参数,定义某种内存结构等。
  • 日志文件:用来记录MySQL实例的日志,如错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件等。
    • 二进制日志:记录了对MySQL数据库执行更改的所有操作,但不包括SELECTSHOW这类操作,因为没有对数据本身修改。
    • 参数binlog_format,可设置为STATEMENT(传统方式,记录逻辑SQL语句),ROW(记录行更改,每行的前后变化),MIXED
  • socket文件:当用UNIX域套接字方式进行连接时需要的文件。
  • pid文件:MySQL实例的进程ID文件。
  • MySQL表结构文件:用来存放MySQL表结构定义文件。
    • frm文件,记录了该表的表结构定义。
  • 存储引擎文件:(用来存放MySQL表存储引擎的关系,每个存储引擎都有自己的文件来保存各种数据。)这些存储引擎真正存储了记录和索引等数据。
show variables like '%log_%';

存储引擎文件

表空间(table space)文件

InnoDB将存储的数据按表空间进行存放。(默认10MB,名为ibdata1)。

用户可以通过多个文件组成一个表空间(同时制定文件属性)。

[mysqld]
innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend

将/db/ibdata1和/dr2/db/ibdata2两个文件组成表空间。
注:若这2个文件位于不同的磁盘上,磁盘的负载可能被平均。

  • 设置了innodb_data_file参数后,所有基于innodb存储引擎的表数据,都会记录到该共享表空间中。
  • 若设置了innodb_file_per_table参数后,每张表将产生独立表空间(命名规则:表名.ibd)。
  • 注:独立表空间文件仅存储该表的数据、索引、插入缓冲bitmap等信息,其余信息还是放在默认表空间中。

重做日志

1.概念

默认情况情况下,在InnoDB存储引擎的数据目录下会有两个名为ib_logfile0和iblogfile1的文件。称为重做日志文件(redo log file)。

每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组下至少有2个重做日志文件。
为了得到更高的可靠性,用户可以设置多个镜像日志组,将不同的文件组放在不同的磁盘上,以提高重做日志的高可用性。

在日志组中的每个重做日志文件大小一致,并以循环写入的方式运行。(InnoDB存储引擎先写重做日志文件1,当达到文件最后时,会切换至重做日志文件2。当文件2也写满时,会再切换到文件1。)

注:重做日志文件的大小对性能有非常大的影响,太大,恢复时可能需要很长时间;太小,可能导致多次切换重做日志,导致频繁发生async checkpoint,导致性能抖动。

重做日志文件对不同的操作,有不同的格式。

2.重做日志文件的写入方式

写入重做日志文件的操作不是直接写,而是先写入一个重做日志缓冲(redo log buffer)中,然后按照一定的条件顺序写入日志文件。

从做日志缓冲往磁盘写入时,是按512个字节,也就1个扇区的大小进行写入。

因为扇区是写入的最小单位,因此可以保证写入必定成功。(因此在重做日志写入的过程中不再需要doublewrite
(因为现代硬盘自身的电源足够完成断电后,1个扇区的写入操作,足以保证原子写。)

3.重做日志文件写入磁盘的条件

  • Master Thread每一秒会刷新。(无论事务是否提交)
  • 每个事务提交时。
    • 参数innodb_flush_log_at_trx_commit控制处理重做日志的方式
    • 0:提交事务时,不将事务的重做日志写入磁盘上的日志文件,而是等待主线程每秒的刷新。
    • 1:执行commit时,将重做日志缓冲同步写到磁盘,即伴有fsync的调用。
    • 2:将重做日志异步写到磁盘。(不能保证执行commit时肯定会写入重做日志文件)(但MySQL数据库宕机,而操作系统没有时,未写入磁盘的事务日志保存在文件系统缓存中,也可以恢复不丢失)
    • 为了保证事务的ACID中的持久性,必须设置为1。
  • 当重做日志缓冲池剩余空间小于1/2时。

区别

二进制日志和重做日志的区别

同样是记录事务日志,二进制日志和重做日志有什么区别?

方面 二进制日志 InnoDB存储引擎的重做日志
引擎范围 会记录所有与MySQL数据库相关的日志记录。
(包括InnoDB,MyISAM,Heap等其他存储引擎)
只记录该存储引擎本身的事物日志。
记录内容 记录的都是关于一个事务的具体操作内容,即该日志是逻辑日志。
(无论记录格式是设置为STATEMENT,ROW,MIXED)
记录的是关于每一页(Page)的更改的物理情况。
写入时间 仅仅在事务提交前进行,即只写磁盘一次。 在事务进行的过程中,却不断有重做日志条目(redo entry)被写入到重做日志文件中。