章节索引 :

MySQL 物理组成-日志文件和数据文件

上一小节,我们以一条查询语句的执行流程,系统了解了 MySQL 的逻辑架构。那么,MySQL 的物理组成是咋样的呢?本文继续从物理组成这个角度来介绍 MySQL,希望大家对 MySQL 的整体架构组成能有更全面的了解。

1.物理组成

图片描述上方是 MySQL 物理组成的简单示意图,MySQL 大致上可以分为日志文件和数据文件两大部分。

日志文件包括二进制日志、InnoDB 在线 redo 日志、错误日志、慢查询日志、一般查询日志等。

数据文件主要指不同存储引擎的物理文件,不同数据文件的扩展名是不一样的,如 InnoDB 用 .ibd、MyISAM 用 .MYD。

除日志文件和数据文件外,还有配置文件 my.cnf、pid 文件 mysql.pid、socket 文件 mysql.sock。

1.1 日志文件

重要日志模块:二进制日志-binlog

二进制日志,其实就是我们平常所说的 binlog,它是 MySQL 重要的日志模块,在 Server 层实现。

binlog 以二进制形式,将所有修改数据的 query 记录到日志文件中,包括 query 语句、执行时间、相关事务信息等。

binlog 的开启,通过在配置文件 my.cnf 中,显式指定参数 log-bin=file_name。如果未指定 file_name,则会记录为 mysql-bin.******(* 代表 0~9 之间的某个数字,表示日志的序号)

log-bin = /mysql/log/mysql-bin # binlog的存储路径

下面为一条insert语句所生成的binlog内容:

root@localhost [tempdb]>insert into a values(1);
Query OK, 1 row affected (0.00 sec)
[root@mysql-test-1 log]# mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000017
#200413  0:18:17 server id 1873306  end_log_pos 556 	Write_rows: table id 280 flags: STMT_END_F
### INSERT INTO `tempdb`.`a`
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
# at 556
#200413  0:18:17 server id 1873306  end_log_pos 583 	Xid = 4713735
COMMIT/*!*/;

重要日志模块:InnoDB redo log

redo log,是存储引擎 InnoDB 生成的日志,主要为了保证数据的可靠性。redo log 记录了 InnoDB 所做的所有物理变更和事务信息。

redo log 默认存放在数据目录下面,可以通过修改 innodb_log_file_size 和 innodb_log_files_in_group 来配置 redo log 的文件数量和每个日志文件的大小。

innodb_log_file_size = 1000M # 每个redo log文件的大小
innodb_log_files_in_group = 3 # redo log文件数量

错误日志:error log

错误日志,记录 MySQL 每次启动关闭的详细信息,以及运行过程中比较严重的警告和错误信息。

错误日志默认是关闭的,可以通过配置参数 log-error 进行开启,以及指定存储路径。

log-error = /mysql/log/mysql-error.log # 错误日志的存储路径

1.1.4 慢查询日志:slow query log

慢查询日志,记录 MySQL 中执行时间较长的 query,包括执行时间、执行时长、执行用户、主机等信息。

慢查询日志默认是关闭的,可以通过配置 slow_query_log 进行开启。慢查询的阈值和存储路径,通过配置参数 long_query_time 和 slow_query_log_file 实现。

slow_query_log = 1 #开启慢查询
long_query_time = 1 #设置慢查询阈值为1s
slow_query_log_file = /mysql/log/mysql-slow.log #设置慢查询日志存储路径

1.1.5 一般查询日志:general query log

一般查询日志,记录 MySQL 中所有的 query。慢查询记录的是超过阈值的 query,而一般查询日志记录的是所有的 query。一般查询日志的开启需要慎重,因为开启后对 MySQL 的性能有比较大的影响。

一般查询日志默认是关闭的,可以通过配置参数 general_log 进行开启。存储路径可以通过配置参数 general_log_file 来实现

general_log = OFF #默认是关闭的
general_log_file = /mysql/data/mysql-general.log #设置查询日志存储路径

1.2 数据文件

.frm文件

.frm 文件存放表相关的元数据,包括表结构信息等。

每张表都有一个对应的 .frm 文件,不管这张表使用哪种存储引擎。

[root@mysql-test-1 tempdb]# ls -lrt *.frm
-rw-r----- 1 mysql mysql 8556 Apr 13 00:18 a.frm

InnoDB 引擎

.ibd 文件和 ibdata 文件都是 InnoDB 引擎的数据文件

  • 如果是独享表空间的存储方式,则使用.idb文件来存放数据,每张表都会有一个单独的 .ibd 文件。
  • 如果是共享表空间的存储方式,则使用ibdata文件来存放数据,所有表共用一个 ibdata 文件。

是否开启独享表空间,可以通过配置参数 innodb_file_per_table 来实现。

innodb_file_per_table = 1  #1 为开启独享表空间

下面为InnoDB表的创建语句,及相应的数据文件:

root@localhost [tempdb]>create table a (id int) ENGINE = InnoDB;
Query OK, 0 rows affected (0.11 sec)

[root@mysql-test-1 tempdb]# ls -lrt a.*
-rw-r----- 1 mysql mysql  8556 Apr 13 01:57 a.frm
-rw-r----- 1 mysql mysql 98304 Apr 13 01:57 a.ibd

MyISAM引擎

MyISAM 引擎的数据文件包含 .MYD 文件和 .MYI 文件。

  • .MYD 文件,存放 MyISAM 的数据,每张表都有一个单独的 .MYD 文件。
  • .MYI 文件,存放 MyISAM 的索引相关信息,每张表都有一个单独的 .MYI 文件,与 .MYD 文件的存储路径一致。

下面为 MyISAM 表的创建语句,及相应的数据文件:

root@localhost [tempdb]>create table a (id int) ENGINE = MyISAM;
Query OK, 0 rows affected (0.01 sec)

[root@mysql-test-1 tempdb]# ls -lrt a.*
-rw-r----- 1 mysql mysql 8556 Apr 13 02:01 a.frm
-rw-r----- 1 mysql mysql 1024 Apr 13 02:01 a.MYI
-rw-r----- 1 mysql mysql    0 Apr 13 02:01 a.MYD

2. 小结

本文,我们主要介绍了 MySQL 的物理组成:日志文件和数据文件。其中 binlog 和 redo log 是最为重要的日志模块,大家可能会有疑问,这两份日志,到底有啥区别?更新语句跟这两份日志,又有啥关系呢?我们在下一节,一起来寻找答案……