mysql 文件存储技术_MySQL技术内幕-文件

学习构成MySQL数据库和InnoDB存储引擎表的各种类型文件

参数文件:

当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义某种内存结构有多大等。在默认情况下,MySQL实例会按照一定的顺序在指定的位置进行读取,用户只需通过命令mysql--help|grep my.cnf来寻找即可。

MySQL数据库也可以不需要参数文件,这时所有的参数值取决于编译MySQL时指定的默认值和源代码中指定参数的默认值。但是,如果MySQL实例在默认的数据库目录下找不到mysql架构,则启动同样会失败,mysql架构记录了访问该实例的权限,当找不到这个架构时,MySQL实例不能成功启动。

MySQL数据库中参数分为两类:动态参数、静态参数

日志文件:

□ 错误日志(error log)

□ 二进制日志(binlog)

□ 慢查询日志(slow query log)

□ 查询日志(log)

套接字文件:

在UNIX系统下本地连接MySQL可以采用UNIX域套接字方式,这个方式需要一个套接字(socket)文件。套接字文件可由参数socket控制。一般在/tmp目录下,名为mysql.sock:

mysql> show variables like 'socket'\G;

pid文件:

当MySQL实例启动时,会将自己的进程ID写入一个文件中—该文件即为pid文件。该文件可有参数pid_file控制,默认位于数据库目录下,文件名为主机名.pid:

mysql> show variables like 'pid_file'\G;

表结构定义文件:

MySQL插件式存储引擎的体系结构,数据的存储根据表进行,每个表都会有与之对应的文件。但不论表采用何种存储引擎,MySQL都有一个以frm为后缀名的文件,这个文件记录了该表的表结构定义 。对于MyIsam表:还有另外两种文件,.MYD保存表数据 .MYI存储表索引。

frm用来存放视图的定义,如用户创建了一个v_a视图,那么对应地会产生一个v_a.frm文件,用来记录视图的定义,该文件是文本文件,可以使用cat进行查看。

InnoDB存储引擎文件:

□ 表空间文件

InnoDB采用将存储的数据按表空间(tablespace)进行存放,在默认配置会有一个初始大小为10MB,名为ibdata1的文件。该文件就是默认表空间文件(tablespace file),用户可以通过参数innodb_data_file_path对其进行设置,通过多个文件组成一个表空间。同时指定属性如:

[mysqld]

innodb_data_file_path = /data1/ibdata1:2000M;/data2/ibdata2:2000M:autoextend

这里将/data1/ibdata1和/data2/ibdata2两个文件用来组成表空间,若两个文件位于不同的磁盘,磁盘的负载可能被平均,因此可以提高数据库的整体性能。同时两个文件的文件名都跟了属性,可以自动增长(autoextend)。

若设置innodb_data_file_path参数后,所以基于InnoDB存储引擎的表的数据都会记录到该共享表空间中。 若设置了innodb_file_per_table,则用户可以将每个基于InnoDB存储引擎产生一个独立表空间。独立表空间的命名规则为:表名.ibd。通过这个方式,用户不用将所有数据都存放于默认的表空间中。

mysql> show variables like 'innodb_file_per_table'\G;

*************************** 1. row ***************************

Variable_name: innodb_file_per_table

Value: ON

1 row in set (0.00 sec)

mysql> system ls -lh /usr/local/mysql/data/*

-rw-rw----                         1    mysql     mysql     8.7k      9月  27    13:25         /usr/local/mysql/data/t1.frm

-rw-rw----                         1    mysql     mysql     17M      9月  27    13:40         /usr/local/mysql/data/t1.idb

-rw-rw----                         1    mysql     mysql     8.7k      9月  27    14:24         /usr/local/mysql/data/t2.frm

-rw-rw----                         1    mysql     mysql     17M      9月  27    14:24         /usr/local/mysql/data/t2.idb

表t1和t2都是基于InnoDB存储的表,由于设置参数innodb_file_per_table=ON,因此产生了单独的.idb独立表空间文件。需要注意,这些单独的表空间文件仅存储该表的数据、索引和插入缓存BITMAP等信息,其余信息还是存放在默认的表空间中。下图显示InnoDB存储引擎对于文件的存储方式:

e9fc0f40c5b500e6edd841c0d091984a.png

□ 重做日志文件

每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组下至少有2个重做日志文件,如默认的ib_logfile0和ib_logfile1.为了得到更高的可靠性,用户可以设置多个镜像日志组(mirrored log groups),将不同的文件组放在不同的磁盘上,以此提高重做日志的高可用性。在日志组中每个重做日志文件的大小一致,并以循环写入的方式运行。InnoDB存储引擎先写重做日志文件1,当达到文件的最后时,会切换至重做日志文件2,再当重做日志文件2也被写满时,会再切换到重做日志文件1中。

下列参数影响着重做日志文件的属性:

□ innodb_log_file_size

□ innodb_log_files_in_group

□ innodb_mirrored_log_groups

□ innodb_log_group_home_dir

参数innodb_log_file_size指定每个重做日志文件的大小。在InnoDB1.2.x版本之前,重做日志文件大小不得大于等于4GB,而1.2.x版本将该限制扩大为了512GB.

参数innodb_log_files_in_group指定日志文件中重做日志文件的数量,默认为2.

参数innodb_mirrored_log_groups指定日志镜像文件组的数量,默认为1,表示只有一个日志文件组,没有镜像。

参数innodb_log_group_home_dir指定日志文件组所在的路径,默认为./

重做日志与二进制日志的区别?

1:二进制日志会记录所有与MySQL数据库相关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。而InnoDB存储引擎的重做日志只记录有关该存储引擎本身的事务日志。

2:记录内容不同,二进制日志文件记录的格式有STATEMENT、ROW、MIXED,其记录的都是关于一个事务的具体操作内容,即该日志是逻辑日志。而InnoDB存储引擎的重做日志文件记录的是关于每个页(Page)的更改的物理情况。

3:写入时间不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次,不论这时该事务多大。而在事务进行的过程中,却不断有重做日志条目(redo entry)被写入到重做日志文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值