暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL InnoDB通用表空间

数据库实用技能 2021-04-19
1312






通用表空间是一个共享表空间,类似于系统表空间。它可以容纳多个表,并支持所有表行格式。也可以在相对于MySQL数据目录或独立于MySQL数据目录的位置创建常规表空间。

   语法:

    CREATE TABLESPACE tablespace_name

ADD DATAFILE 'file_name'

[FILE_BLOCK_SIZE = value]

[ENCRYPTION [=] {'Y' | 'N'}]

[ENGINE [=] engine_name]

ADD DATAFILE
:定义表空间数据文件的名称。必须使用CREATE TABLESPACE
语句指定数据文件 ,并且数据文件名必须具有.ibd
扩展名。一个 InnoDB
普通表仅支持单个数据文件。

数据文件默认放在MySQL数据目录(DATADIR
)下;如果要将数据文件放在MySQL数据目录(DATADIR
)之外的位置,请包含绝对目录路径或相对于MySQL数据目录的路径。如果未指定路径,则会在MySQL数据目录中创建常规表空间。

为避免与隐式创建的每表文件表空间冲突,不支持在MySQL数据目录下的子目录中创建通用表空间。此外,在MySQL数据目录之外创建通用表空间时,该目录必须存在,并且必须InnoDB
在创建表空间之前知道 。要使未知目录已知InnoDB
,请将该目录添加到innodb_directories
参数值。innodb_directories
是一个只读启动选项。配置它需要重新启动服务器。

一般的表空间支持所有表行格式(REDUNDANT
COMPACT
, DYNAMIC
COMPRESSED
)与压缩和非压缩表不能在同一个表空间一般共存的警告,由于不同的物理页面大小。

对于包含压缩表(ROW_FORMAT=COMPRESSED
)的常规表空间, FILE_BLOCK_SIZE
必须指定,并且该FILE_BLOCK_SIZE
值必须是与该 值相关的有效压缩页大小 innodb_page_size
。此外,压缩表(KEY_BLOCK_SIZE
)的物理页面大小必须等于 FILE_BLOCK_SIZE/1024
。例如,如果 innodb_page_size=16K
和 FILE_BLOCK_SIZE=8K
, KEY_BLOCK_SIZE
表的必须为8。

下表显示了允许的 innodb_page_size
, FILE_BLOCK_SIZE
和 KEY_BLOCK_SIZE
组合。 FILE_BLOCK_SIZE
值也可以以字节为单位指定。要确定KEY_BLOCK_SIZE
 给定的有效值FILE_BLOCK_SIZE
,请将 FILE_BLOCK_SIZE
值除以1024.表压缩不支持32K和64K InnoDB
页面大小。有关的更多信息 KEY_BLOCK_SIZE

表15.7压缩表的允许页大小,FILE_BLOCK_SIZE和KEY_BLOCK_SIZE组合

 

InnoDB页面大小(innodb_page_size)

允许的FILE_BLOCK_SIZE值

允许的KEY_BLOCK_SIZE值

64K

64K(65536)

不支持压缩

32K

32K(32768)

不支持压缩

16K

16K(16384)

N A:如果innodb_page_size等于FILE_BLOCK_SIZE,则表空间不能包含压缩表。

16K

8K(8192)

8

16K

4K(4096)

4

16K

2K(2048)

2

16K

1K(1024)

1

8K

8K(8192)

N / A:如果innodb_page_size等于FILE_BLOCK_SIZE,则表空间不能包含压缩表。

8K

4K(4096)

4

8K

2K(2048)

2

8K

1K(1024)

1

4K

4K(4096)

N / A:如果innodb_page_size等于FILE_BLOCK_SIZE,则表空间不能包含压缩表。

4K

2K(2048)

2

4K

1K(1024)

1

InnoDB页面大小(innodb_page_size)

允许的FILE_BLOCK_SIZE值

允许的KEY_BLOCK_SIZE值

    

创建表空间:

mysql>  create database sbtest;

Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLESPACE sbtest ADD DATAFILE '/data/mydata/my8888/sbtest.ibd' Engine=InnoDB;

Query OK, 0 rows affected (0.16 sec)

mysql> use sbtest;

Database changed

 

将表添加到表空间:

mysql> create table sbtest1(i int) ENGINE=InnoDB TABLESPACE sbtest;

Query OK, 0 rows affected (0.13 sec)

mysql> create table sbtest2(i int) ENGINE=InnoDB TABLESPACE sbtest;

Query OK, 0 rows affected (0.00 sec)

 

使用ALTER TABLE在表空间之间移动表:

mysql> alter table t1 tablespace sbtest;

Query OK, 0 rows affected (0.13 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

重命名表空间:

mysql> alter tablespace sbtest rename to sbtest1;

Query OK, 0 rows affected (0.08 sec)

 

删除常规表空间:

mysql> drop tablespace sbtest1;

ERROR 3120 (HY000): Tablespace `sbtest1` is not empty.

mysql> drop table t1;

Query OK, 0 rows affected (0.11 sec)

mysql> drop table t;

Query OK, 0 rows affected (0.07 sec)

mysql> drop tablespace sbtest;

Query OK, 0 rows affected (0.08 sec)

mysql>

 

一般表空间限制:

a、  生成的或现有的表空间不能更改为常规表空间。

b、  不支持创建临时通用表空间。

c、  常规表空间不支持临时表。

d、  与系统表空间类似,截断或删除存储在通用表空间中的表会在通用表空间.ibd数据文件内部创建可用空间,该 文件只能用于新InnoDB数据。空间不会像文件每表表 空间一样释放回操作系统 。

e、  此外,ALTER TABLE驻留在共享表空间(通用表空间或系统表空间)中的表上的表复制操作可以增加表空间使用的空间量。此类操作需要与表中的数据和索引一样多的额外空间。表复制ALTER TABLE
 操作所需的额外空间不会像文件每表表空间一样释放回操作系统。

f、   ALTER TABLE ... DISCARD TABLESPACE
并且 ALTER TABLE ...IMPORT TABLESPACE
不支持属于常规表空间的表。

g、  在MySQL 5.7.24中不支持在一般表空间中放置表分区,在MySQL 8.0.13中删除了。

 


文章转载自数据库实用技能,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论