300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > mysql知识点系列-数据目录(Data目录)下文件类型一窥究竟

mysql知识点系列-数据目录(Data目录)下文件类型一窥究竟

时间:2020-02-27 08:09:44

相关推荐

mysql知识点系列-数据目录(Data目录)下文件类型一窥究竟

本文主要基于《高性能MySQL》

文章目录

1、数据库目录2、frm文件3、ibd文件4、ibdata文件5、ib_logfile文件6、UNDO日志7、慢查询日志8、二进制日志文件9、中继日志

本小节介绍的文件都位于数据目录下(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./s/L9xqW-975eEY3JnYtjEUHw

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。