MySQL8.0学习记录18 - Tablespaces

共享表空间和独立表空间

MySQL表空间的管理方式有两种:共享表空间和独立表空间。独立表空间是MySQL5.6.6及以后版本的默认模式,可以通过查看系统变量innodb_file_per_table=ON来确认。在独立表空间默认下,每个表都有自己的表空间文件,而且每个表的数据和索引都在自己的表空间中。

通过CREATE TABLESPACE 可以创建一般的共享表空间,它在某些方面有一定的优势,比如:

  • 一般表空间是能够存储多个表的数据的共享表空间
  • 一般表空间可能比独立表空间更省内存。数据库服务器在表空间的生命周期内将表空间元数据保留在内存中。多个表在少量的一般共享表空间里面,相比多个表拥有各自独立表空间,前者表空间元数据占用的内存更少。
  • 一般的表空间数据文件可以放在相对于或独立于MySQL数据目录的目录中,通过这种方式可以将一些关键表存放在特定的磁盘中。
  • 一般的表空间支持所有的表行格式和相关功能

注意:表空间的名称是大小写敏感的。

一般共享表空间的创建与使用

这里只关注InnoDB引擎下,创建表空间。

CREATE TABLESPACE tablespace_name
    [ADD DATAFILE 'file_name']
    [AUTOEXTEND_SIZE [=] value]
    [FILE_BLOCK_SIZE = value]
    [ENCRYPTION [=] {'Y' | 'N'}]
    [ENGINE [=] engine_name]

一般的表空间可以在数据目录中或在其之外创建, 但是不能在MySQL数据目录的子目录中,这是为了避免和独立表空间发生冲突。如果在数据目录之外,需要先将目录添加到变量innodb_directories 中,多个目录分号隔开。但是innodb_directories 变量只能在启动的时候指定,所以对运行中的数据库服务器会比较麻烦。启动比如:

mysqld --innodb-directories="directory_path_1;directory_path_2"

或修改配置文件重启

[mysqld]
innodb_directories="directory_path_1;directory_path_2"

创建表空间的时候,也可以不指定表空间的文件名,这时候MySQL会分配一个128 比特的由五部分组成的UUID名称,比如‘aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.ibd’。文档有提到,在复制环境中,在备份库上创建出来的文件名与源库不同,所以未指定名称的情况下,不应该依赖这个名称做什么操作。

创建表空间的时候,需要指定Engine选项,目前支持的有NDB和InnoDB。如果变量default_storage_engine=InnoDB,可不用显式指定存储引擎。

普通表空间支持所有的表行格式(REDUNDANT,COMPACT,DYNAMIC,COMPRESSED),但需要注意的是,由于物理页大小不同,压缩表和未压缩表不能共存于同一个普通表空间。

压缩行格式需要的参数FILE_BLOCK_SIZE

这个选项是InnoDB所特有的,定义表空间数据文件的块大小,默认为innodb_page_size值。但是当FILE_BLOCK_SIZE 等于innodb_page_size 时,表空间只能包含具有未压缩行格式的表(COMPACT,REDUNDANT和DYNAMIC)。如果存储压缩行的表,FILE_BLOCK_SIZE参数是必须的。由于物理页大小不同,所以压缩格式的表和未压缩格式表不能共存于同一个普通表空间。

表空间扩展

默认情况下,表空间扩展的规则:

  • 如果表空间的大小小于一个区,那么一次扩展一页大小
  • 如果表空间的大小大于一个区,但是小于32个区的大小,一次扩展一个区的大小
  • 如果表空间的大小大于32个区,那么一次扩展4个区

默认情况下,页的大小是16K(可以查看变量innodb_page_size),64个页组成一个区,大小是1M。可以看到默认情况下,每次最大扩展4M。从MySQL 8.0.23开始,定义了InnoDB在表空间变满时扩展其大小的数量。该设置必须是4MB的倍数。

表空间的使用和操作

CREATE TABLE 和ALTER TABLE的时候,都有TABLESPACE,所以既可以在创建表的时候指定表空间,也可以在一般表空间、按文件表空间和系统表空间之间移动表。

重命名或删除表空间如下,在删除表空间之前需要先删除表。

ALTER TABLESPACE s1 RENAME TO s2;
DROP TABLESPACE ts1;

一般表空间的限制

  • 现有的表空间不能被改变为一般表空间
  • 不支持创建临时的一般表空间
  • 一般表空间不支持临时表
  • 与系统表空间类似,截断或丢弃存储在一般表空间中的表会在一般表空间.ibd数据文件中创建内部空闲空间,该空间只能用于新的InnoDB数据。空间不会被释放回操作系统,因为它是针对每表文件的表空间的。
  • 对驻留在共享表空间(一般表空间或系统表空间)的表进行复制ALTER TABLE操作会增加表空间使用的空间量。这种操作需要的额外空间与表内的数据和索引一样多。复制表的ALTER TABLE操作所需要的额外空间不会像独立空间那样释放回操作系统。
  • alter table … DISCARD TABLESPACE和ALTER TABLE …IMPORT TABLESPACE对于属于一般表空间的表不支持
  • ADD DATAFILE子句在复制环境中不被支持
  • 从MySQL 8.0.21开始,一般的表空间不能在UNDO表空间目录(innodb_undo_directory)中创建,除非该目录直接被InnoDB知道。已知的目录是那些由datadir、innodb_data_home_dir和innodb_directories变量定义的目录。
  • 一般表空间应该是不支持表分区的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值