临时/共享/undo独立表空间的联系

20201031

17:03

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回滚段布局结构,其中:

  1. rseg0预留在系统表空间ibdata;
  2. rseg 1~rseg 3232个回滚段存放于临时表的系统表空间中;
  3. rseg33~ 则根据配置存放到独立undo表空间中(如果没有打开独立Undo表空间,则存放于ibdata中,图中就是这种情况,系统表空间ibdata含了两个范围:rseg0和geseg33~

 
 

来自 <https://blog.csdn.net/langkeziju/article/details/75015316>

 
 

参考:


前言:

 
 

MySQL 5.6引用了独立undo tablespace 之后,MySQL 5.7temporary 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

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

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

 
 

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

 
 

来自 <https://blog.csdn.net/cq377078944/article/details/100379356>

发表评论

电子邮件地址不会被公开。