General tablespace
General tablespace
是一种共享的
innodb
表空间,有点类似
ibdata1
。可以在一个表空间数据文件下存储多张表,即使这些表来自不同的
schame
。
General tablespace
的优点
类似系统表空间,可以存储多个
schema
下的多张表。
与
file_per_table tablespace
相比,
General tablespace
有潜在的内存的优点。这种方式存储表空间的元数据到内存中,可以减小内存消耗。
General tablespace
可以将数据文件存在其它盘上。这样做的好处是,比如说我需要将几张热点表放到更快的存储盘上,就可以在更快的存储盘上创建
general tablespace
,将热点表放过去。
General
支持所有的行格式,以及相关特性。
数据表可以在
general tablespace
和
per_file_table tablespace
之间来回移动。类似
Oracle
数据库的
move table
。
创建
general tablespace
的语法
CREATE TABLESPACE tablespace_name ADD DATAFILE 'file_name' [FILE_BLOCK_SIZE = value] [ENGINE [=] engine_name] |
注意为了避免
data directory
冲突,表空间建立在
data directory
子目录下是不被支持的。因为
datadir
子目录会被
mysql
认为是
database
。但是
general tablespace
可以建立在
datadir
下。
General tablespace
建立在非
datadir
目录下后,
data directory
下会产生一个
.isl
文件,里面是详细路径。
例如在
datadir
下面建一个
general tablespace
,
page_size
是
8k
,默认引擎
innodb
:
mysql> create tablespace tbs01 add datafile 'tbs01.ibd' file_block_size=8192 engine=innodb; Query OK, 0 rows affected (0.02 sec) mysql> create tablespace tbs02 add datafile '/u01/mysql/3306/general_tbs/tbs02.ibd' engine=innodb; Query OK, 0 rows affected (0.01 sec) |
Isl
其实是路径:
[root@oradb-2062 data]# more tbs02.isl /u01/mysql/3306/general_tbs/tbs02.ibd |
Information_schema
下的
INNODB_SYS_TABLESPACES
表有这些表空间的元数据信息:
mysql> *************************** 1. row *************************** space: 61 name: tbs01 FLAG: 2089 FILE_FORMAT: Barracuda PAGE_SIZE: 16384 SPACE_TYPE: General FILE_SIZE: 65536 ALLOCATED_SIZE: 16384 *************************** 2. row *************************** space: 63 name: tbs02 FLAG: 2048 FILE_FORMAT: Any PAGE_SIZE: 16384 SPACE_TYPE: General FILE_SIZE: 65536 ALLOCATED_SIZE: 32768 2 rows in set (0.00 sec) |
General
表空间的使用
Tbs01
建表空间时指定
FILE_BLOCK_SIZE=8k
Tbs02
建表空间时没有指定
FILE_BLOCK_SIZE
FILE_BLOCK_SIZE
只有在存储压缩表的时候才能在建表空间的时候使用。否则建非压缩表会报错。也就是说
压缩表和非压缩表无法在同一个表空间中
。
mysql> create table tt(a int) tablespace=tbs01; ERROR 1478 (HY000): InnoDB: Tablespace `tbs01` uses block size 8192 and cannot contain a table with physical page size 16384 |
建压缩表是可以的。
mysql> create table tt(a int)
Query OK, 0 rows affected (0.02 sec) |
同样地,也不能在
tbs02
中建压缩表
mysql> create table tt01(a int) tablespace=tbs02 ROW_FORMAT=COMPRESSED; ERROR 1478 (HY000): InnoDB: Tablespace `tbs02` cannot contain a COMPRESSED table mysql> create table tt01(a int) tablespace=tbs02; Query OK, 0 rows affected (0.01 sec) |
将表空间中到的表移动到
file_per_table tablespace
。
mysql> alter table tt tablespace=innodb_file_per_table; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table tt01 tablespace=innodb_file_per_table; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 |
将一张
250
万的表从
file_per_table tablespace
移动到
general tablespace
mysql> alter table test02 tablespace=tbs02;
Query OK, 0 rows affected ( Records: 0 Duplicates: 0 Warnings: 0 |
花了
9
秒多,说明这种移动大表还是很花时间的。
附,将表移动到系统表空间
ALTER TABLE test01 TABLESPACE innodb_system; |
删除表空间,注意表空间中有表的时候不能删除成功。
mysql> ERROR 1529 (HY000): Failed to drop TABLESPACE tbs02 |
General tablespace
的限制
General tablespace
不支持临时表。
与系统表空间类似,
truncate
或
drop table
只是标记空间为可用,但是不会还给操作系统。
MySQL 5.7.24
版本及之后的版本,不在支持将分区放到
general tablespace
中去了。
ALTER TABLE … DISCARD TABLESPACE and ALTER TABLE …IMPORT TABLESPACE
不支持
general tablespace
。