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

MySQL 的物理组成是咋样的呢?本文继续从物理组成这个角度来介绍 MySQL,希望大家对 MySQL 的整体架构组成能有更全面的了解。 1.物理组成 上方是 MySQL 物理组成的简单示意图,MySQL 大致上可以分为日志文件和数据文件两大部分。 日志文件包括二进制日志、InnoDB 在线 redo 日...

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 是最为重要的日志模块,大家可能会有疑问,这两份日志,到底有啥区别?更新语句跟这两份日志,又有啥关系呢?我们在下一节,一起来寻找答案……

评论0

首页 导航 会员 客服