一、ibdata1文件介绍–又叫共享表空间/系统表空间

ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据、撤销记录、修改buffer和双写buffer。

ibdata1存储了Data dictionary,Double write buffer,Insert buffer,Rollback segments,UNDO space,Forign key constraint system tables等

设置方法:

vi /etc/my.cnf

开启独享表空间,并指定ibdata1大小为1G,ibdata2大小200M,自动扩张。

innodb_data_home_dir = /var/lib/mysql

innodb_data_file_path = ibdata1:1G;ibdata2:200M:autoextend

innodb_file_per_table

二、 ibtmp1相关–又叫临时表空间 (是新特性)

ibtmp1是非压缩的innodb临时表的独立表空间,通过innodb_temp_data_file_path参数指定文件的路径,文件名和大小,默认配置为ibtmp1:12M:autoextend,也就是说在支持大文件的系统这个文件大小是可以无限增长的。

小结:

存两类:临时表和undo

针对临时表及相关对象引入新的“non-redo” undo log,存放于临时表空间。

设置方法:

1,修改my.cnf配置文件:

innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G

三、undo独立表空间

MySQL5.6中开始支持把undo log分离到独立的表空间,并放到单独的文件目录下;采用独立undo表空间,再也不用担心undo会把 ibdata1 文件搞大;

也给我们部署不同IO类型的文件位置带来便利,对于并发写入型负载,我们可以把undo文件部署到单独的高速存储设备上.

在数据库初始化的时候就使用如下三个参数就可以分离出单独的undo表空间

innodb_undo_tablespaces=3 #设置为3个
innodb_undo_logs=128 #默认128个
innodb_undo_directory =/dbfiles/mysql_home/undologs
mysql> show variables like “%undo%”;
+————————-+——-+
| Variable_name | Value |
+————————-+——-+
| innodb_undo_directory | . |
| innodb_undo_logs | 128
|
| innodb_undo_tablespaces | 0
|
+————————-+——-+

三者的关系参考undo存储管理:

基本文件结构

为了保证事务并发操作时,在写各自的undo log时不产生冲突,InnoDB采用回滚段的方式来维护undo log的并发写入和持久化。回滚段实际上是一种 Undo 文件组织方式,每个回滚段又有多个undo log slot。具体的文件组织方式如下图所示:

上图展示了基本的Undo回滚段布局结构,其中:

rseg0预留在系统表空间ibdata中;

rseg 1~rseg 32这32个回滚段存放于临时表的系统表空间中;

rseg33~ 则根据配置存放到独立undo表空间中(如果没有打开独立Undo表空间,则存放于ibdata中,图中就是这种情况,系统表空间ibdata含了两个范围:rseg0和geseg33~)

参考:

前言:

在MySQL 5.6引用了独立undo tablespace 之后,MySQL 5.7在temporary tablespace上做了改进。

已经实现 将temporary tablespace 从ibdata(系统表空间文件) 中分离。

并且可以重启重置大小, 避免出现像ibdata难以释放的问题。

但 下面所有的讨论只针对InnoDB,并且指定了innodb_file_per_table,所用版本为MySQL 5.7.x

新特性 · 共享临时表空间(shared temporary tablespace):

共享临时表空间出现于MySQL 5.7.1,为的是将临时表空间从系统表空间(system tablespace)文件中独立出来。该共享临时表空间用于存储非压缩InnoDB临时表(non-compressed InnoDB temporary tables)、关系对象(related objects)、回滚段(rollback segment)等数据。更多信息可以参考【MySQL 5.7 Reference Manual 8.4.4 Internal Temporary Table Use in MySQL 】

因为存放的数据特殊性,不会参与crash recovery,因此无需记录redo log。

该共享临时表空间默认大小为12MB。在实例关闭之后,将会被删除。在实例启动时则会被创建。

默认的,该共享临时表空间存放在innodb_data_home_dir中的ibtmp1里,而innodb_data_home_dir默认为datadir。

所以一般该ibtmp1存放在datadir下,显然,其路径与共享表空间的路径一样,取决于innodb_data_home_dir。

新增参数innodb_temp_data_file_path,通过修改其值可以将该共享临时表空间的文件名,扩展大小做修改。

比如在配置文件中加上innodb_temp_data_file_path = temp_tablespace:64M:autoextend

那么在启动实例之后,会生成一个大小为64MB的temp_tablespace文件

-rw-r—– 1 root root 67108864 Jun 20 17:29 temp_tablespace

该参数默认出现于5.7.1,静态,默认值为ibtmp1:12M:autoextend。