关系型数据库的文件结构大同小异,基本上都是由数据文件(表空间)和日志组成。MySQL在初始化时会在与执行文件相同的目录下创建一个DATA目录,存储数据库运行所需的数据。表空间的默认路径也在DATA目录中。数据库中使用DATADIR参数指定数据存储路径,
DATA路径下数据如图所示,它包括:
文件名称 | 描述 |
---|---|
binlog.xxxxxx | BINARY日志; |
db01目录 | 数据库db01的数据目录; |
db02目录 | 数据库db02的数据目录; |
ibdatax | 系统表空间; |
ibtmpx | 临时表空间; |
#innodb_redo | REDO日志目录; |
#innodb_temp | session临时目录; |
#ib_xxxxx_x.dblwr | 双写日志; |
mysql目录 | 系统库mysql数据; |
sys目录 | 系统库sys数据; |
performance_schema目录 | 系统库performance_schema数据; |
undo_xxx | UNDO表空间文件; |
mysql.ibd | INNODB元数据表空间; |
所有的文件结构,可以通过配置文件来设置。配置文件默认保存在/etc/my.cnf中,如果保存在其它位置,在启动数据库时要指定路径。
1 系统表空间
系统表空间是与Change Buffer关联的一个存储区域,它也可以用于存储表数据和索引数据。系统表空间对应一个或多个数据文件。默认情况下,系统表空间有一个数据文件,存储路径在DATA目录中,文件名为ibdata1。文件名和文件大小可通过参数设置,它是静态参数,需要在my.cnf配置文件中指定,不可在数据库运行中修改。例如,配置两个文件,分别为12M,自动扩展,
$ cat /etc/my.cnf
innodb-data-file-path = ibdata1:12M;ibdata2:12M:autoextend
2 单表文件
单表文件是指使用INNODB引擎时,每个表单独使用一个表空间文件,这是默认选项。可通过修改innodb_file_per_table参数来设置是否使用。该参数是动态,可随时设置。如果设置为永远生效,需要在my.cnf文件里设置。
当innodb_file_per_table状态为on时,创建表的同时会默认在DATA路径的数据库子目录创建表空间文件。例如:
mysql> use db01;
mysql> create table tb01 (c1 int, c2 varchar(32));
创建表时,自动生成DATA/db01/tb01.ibd文件。
如果希望使用DATA路径以外的存储,
mysql> create table tb02 (c1 int, c2 varchar(32)) data directory = '/mysql/mysql-server/dfiles';
创建表时,自动在data directory指定的路径下生成db01/tb02.ibd
如果nnodb_file_per_table状态为off,相同的语法创建表,会自动使用系统表空间。
相比通用表空间(也可称为共享表空间),单表文件的优势在于:
• 当表被Truncate或Drop后,文件占用存储空间自动被回收。
• 可以按照需要在指定的存储设备上创建表空间文件,提升性能,便于管理。
• 避免由于单个文件损坏导致多个表数据受损
• 未使用的空间只能被表内使用,会造成资源浪费
• 在执行多表的写入时,需要更多的FSYNC调用来操作多个数据文件,消耗更多的资源。同样,MYSQLD进程也需要多个HANDLE来维护多个数据文件。
3 通用表空间
通用表空间是一个共享的InnoDB表空间,使用CREATE TABLESPACE语法创建。
• 与系统表空间类似,通用表空间可共享,保存多个表的数据。
• 相比单表文件表空间,通用表空间消耗更少的内存资源。
• 通用表空间可以存储在DATA路径中,也可以存储在DATA路径以外的位置,利用外部存储的性能或高可用优势。
创建通用表空间TS01,数据文件为DATA/ts01.ibd,
mysql> create tablespace ts01 add datafile 'ts01.ibd' engine=innodb;
创建通用表空间TS01,数据文件保存在外部路径中,
mysql> create tablespace ts01 add datafile '/mysql/mysql-server/dfiles/ts01.ibd' engine=innodb;
静态参数,修改my.cnf
mysql> show variables like 'innodb_directories';
innodb_directories = "/mysql/mysql-server/dfiles;/disk1/dfiles"
4 临时表空间
InnoDB使用session和global临时表空间。Global临时表空间配置至少一个文件,
Session临时表空间为每一个连接分配一个表空间文件。
Global临时表空间默认分配一个文件,为DATA/ibtmp1,可以通过参数进行修改。例如,配置2个文件并自动扩展:
innodb_temp_data_file_path= ibtmp1:12M;ibtmp2:12M:autoextend
用户创建连接时,系统自动从临时表空间池中分配一个文件。一个Session最多可分配两个临时表空间文件,一个用于用户临时表,另外一个用于优化器创建内部临时表。当session断开后,临时表空间被truncate,并返回表空间池。当数据库启动时,系统自动在表空间池中创建10个文件,并且按照需要自动扩展。文件默认保存在DATA/#innodb_temp路径中,从temp_1.ibt到temp_10.ibt。保存路径可通过innodb_temp_tablespaces_dir参数自定义。
CSDN视频课程:
https://edu.csdn.net/lecturer/8135?spm=1002.2001.3001.4144