本文主要基于《高性能MySQL》
本小节介绍的文件都位于数据目录下(Data目录)。Data目录下的文件有frm,ibd,ibdata1等,下面分别介绍一下这些文件的作用。
1、数据库目录
Data目录下除了文件之外,还有一些子目录,这些子目录表示的是数据库,也就是说每创建一个数据库,就会在该目录下新建一个子目录,子目录名与数据库名一致,与该数据库相关的数据会放到该子目录下,比如表定义文件(frm文件)。
2、frm文件
在MySQL中建立任何一张表,其对应的数据库目录下都会有该表的.frm文件。frm文件用来保存每个表的元数据(meta)和表结构等信息。数据库崩溃时,可以用 .frm 文件恢复表结构。
表的定义是在服务层处理的,所以任何存储引擎的数据表都有frm文件,命名方式为“表名.frm”。
3、ibd文件
当存储引擎是InnoDB,且设置innodb_file_per_table=ON时,mysql会在数据库目录创建ibd文件,该文件也叫作独立表空间。每创建一个新表就会创建一个对应的ibd文件,文件名为“表名.ibd”。该文件存储数据库表数据和索引数据。
数据库表数据和索引都是由存储引擎操作的,服务器层不负责索引和表数据。如果存储引擎是myisam,那么存储表数据的文件后缀是MYD,存储索引的文件后缀是MYI,这时就不会有ibd文件了。
从frm文件、ibd文件和数据库目录的名字上可以看到,mysql直接以库名和表名创建的这些文件或目录,那如果mysql对库名和表名的大小写不敏感,而操作系统敏感会怎么样?mysql的解决方式是对库名和表名大小写是否敏感完全取决于操作系统。
4、ibdata文件
ibdata是系统表空间,也叫作共享表空间,默认文件名为ibdata1。可以通过参数innodb_data_file_path设置文件名和文件大小。如果innodb_file_per_table=OFF,那么innodb不会创建ibd文件,数据库表和索引的数据都会存入系统表空间。同时该文件还保存了双写缓冲,回滚日志,数据字典,插入缓冲等。注意一点该文件大小不能自动收缩,所以该文件在使用中要么是保持大小不变要么是不断扩大。
5、ib_logfile文件
该文件叫做事务日志或redo日志,默认有两个文件,文件名分别是ib_logfile0和ib_logfile1。每当事务执行的时候,会先将事务日志写入内存的日志缓冲,当满足一定条件后,将日志缓冲数据写入磁盘事务日志文件。如果系统发生崩溃,重启后,mysql读取该文件,将已经提交的事务应用到磁盘数据文件,从而保证了事务的持久性。redo日志记录的是物理日志,也就是说记录的是数据页的变化,因此重启后使用redo日志恢复数据速度很快,要快于后面提到的二进制日志文件。
在文章《mysql知识点系列-重要组件详解(线程缓存、表缓存、数据字典、日志缓冲、表空间)》有更详细的介绍。
6、UNDO日志
UNDO日志也叫做回滚日志,用于事务回滚和MVCC(多版本并发控制)。UNDO日志属于逻辑日志,不记录查询操作,记录了更新或者删除操作与更新前后数据,通过逆操作进行回滚,比如更新一个数据,回滚就是更新回原来的值,删除了就是要插入回来。在5.6版本之前,UNDO日志记录到系统表空间。在这之后,mysql支持记录到独立文件中。通过参数innodb_undo_tablespaces配置是否开启独立UNDO日志,取值范围是0~128,默认是0,表示不开启,如果取n,且n大于0,mysql会创建n个undo文件,文件名为undo001,undo002,…undon,可以通过innodb_undo_directory设置undo文件的存放位置,默认在Data目录下。与undo日志相关的还有参数innodb_undo_logs,表示回滚段的个数,默认是128。
7、慢查询日志
慢查询日志可以查找出哪些查询语句的执行效率低,以便进行优化。默认文件名为“主机名-slow.log”,位于Data目录下。默认是关闭的,也就是不记录慢查询日志,下文“分析SQL执行慢的方式”会再介绍有关内容。
8、二进制日志文件
二进制文件用于数据库恢复和主从复制,它是由服务器层创建并写入的。默认是关闭的,可以设置log_bin开启二进制日志,该参数只能在配置文件中修改,例如设置log_bin=path/file_name,如果没有设置path,那么会在Data目录下创建file_name.000001文件,每当使用flush logs命令、重启或者文件最大设定值(max_binlog_size 参数设置每个 binlog文件的大小),二进制日志文件后面的数字便会递增,如果没有设置file_name,那么会使用主机名-bin.数字作为文件名。
二进制文件里面不记录查询操作,只记录对数据库修改的操作,包括增删改和DDL,里面记录逻辑日志,可以简单理解为记录的就是sql语句 。
InnoDB只有在事务提交时才会记录biglog ,此时记录还在内存中,那么 biglog是什么时候刷到磁盘中的呢?
mysql 通过 sync_binlog
参数控制 biglog 的刷盘时机,取值范围是 0-N:
- 0:不去强制要求,由系统自行判断何时写入磁盘;
- 1:每次 commit 的时候都要将 binlog 写入磁盘;
- N:每N个事务,才会将 binlog 写入磁盘。
从上面可以看出, sync_binlog 最安全的是设置是 1 ,这也是MySQL 5.7.7之后版本的默认值。但是设置一个大一些的值可以提升数据库性能,因此实际情况下也可以将值适当调大,牺牲一定的一致性来获取更好的性能。
9、中继日志
中继日志是在主从复制中使用的。备机从主机的二进制日志文件里面获得数据库修改后的数据行或者SQL语句,并将这些数据写入到中继日志中,然后启动SQL线程读取中继日志,并将日志里面的修改操作应用到备机数据库中。
https://mp.weixin.qq.com/s/L9xqW-975eEY3JnYtjEUHw