构成MySQL数据库和InnoDB存储引擎表的各种类型文件:
- 参数文件:初始化某些参数,定义某种内存结构等。
- 日志文件:用来记录MySQL实例的日志,如错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件等。
- 二进制日志:记录了对MySQL数据库执行更改的所有操作,但不包括
SELECT
和SHOW
这类操作,因为没有对数据本身修改。 - 参数
binlog_format
,可设置为STATEMENT
(传统方式,记录逻辑SQL语句),ROW
(记录行更改,每行的前后变化),MIXED
。
- 二进制日志:记录了对MySQL数据库执行更改的所有操作,但不包括
- 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)被写入到重做日志文件中。 |