mysql 5.7 tablespace_mysql5.7 General tablespace使用说明

说明:文章内容起源于网络并结合自己的实验而得;但参考的文章地址当时没记录下来,如果发现有侵权问题,请留言。

~

~

General tablespace 是一种共享的 innodb 表空间,有点类似 ibdata1 。可以在一个表空间数据文件下存储多张表,即使这些表来自不同的 schame 。

一、General tablespace 的优点

1)类似系统表空间,可以存储多个 schema 下的多张表。

2)与 file_per_table tablespace 相比, General tablespace 有潜在的内存的优点。这种方式存储表空间的元数据到内存中,可以减小内存消耗。

3)General tablespace 可以将数据文件存在其它盘上。这样做的好处是,比如说我需要将几张热点表放到更快的存储盘上,就可以在更快的存储盘上创建 general tablespace ,将热点表放过去。

4)General 支持所有的行格式,以及相关特性。

5)数据表可以在 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)

-- 会在datadir为tbs01生成tbs01.ibd文件

在非 datadir 位置创建 general tablespace:

mysql> create tablespace tbs02 add datafile ‘/u01/mysql/3306/general_tbs/tbs02.ibd‘ engine=innodb;

Query OK, 0 rows affected (0.01 sec)

-- 会在datadir为tbs02生成tbs02.isl文件

isl其实是路径:

# cat tbs02.isl

/u01/mysql/3306/general_tbs/tbs02.ibd

Information_schema 下的 INNODB_SYS_TABLESPACES 表有这些表空间的元数据信息:

mysql> select * from information_schema.INNODB_SYS_TABLESPACES where NAME like ‘tbs%‘;

+-------+-------+------+-------------+------------+-----------+---------------+------------+---------------+-----------+----------------+

| SPACE | NAME | FLAG | FILE_FORMAT | ROW_FORMAT | PAGE_SIZE | ZIP_PAGE_SIZE | SPACE_TYPE | FS_BLOCK_SIZE | FILE_SIZE | ALLOCATED_SIZE |

+-------+-------+------+-------------+------------+-----------+---------------+------------+---------------+-----------+----------------+

| 41 | tbs01 | 2089 | Barracuda | Compressed | 16384 | 8192 | General | 4096 | 65536 | 53248 |

| 42 | tbs02 | 2048 | Any | Any | 16384 | 0 | General | 4096 | 131072 | 135168 |

+-------+-------+------+-------------+------------+-----------+---------------+------------+---------------+-----------+----------------+

2 rows in set (0.00 sec)

三、General 表空间的使用

注意:

1)tbs01 建表空间时指定了 FILE_BLOCK_SIZE=8k;tbs02 建表空间时没有指定 FILE_BLOCK_SIZE;

在建表空间的时候使用了FILE_BLOCK_SIZE则只该表空间在只能存储压缩表,否则建非压缩表时会报错。也就是说 压缩表和非压缩表无法在同一个表空间中。

2)当表使用了General表空间是,在对应的数据库目录下,只有.frm文件,没有ibd文件;到移动到file_per_table时,就出现了.ibd文件;

1、General表空间上建表

tbs01上建非压缩表:

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

tbs01上建压缩表:

mysql> create table tt(a int) tablespace=tbs01 ROW_FORMAT=COMPRESSED;

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)

2、移动表

将General表空间中的表移动到 file_per_table 表空间:

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 ( 9.41 sec )

Records: 0 Duplicates: 0 Warnings: 0

花了 9 秒多,说明这种移动大表还是很花时间的。

附,将表移动到系统表空间

ALTER TABLE test01 TABLESPACE innodb_system;

删除表空间,注意表空间中有表的时候删除会失败。

mysql> drop tablespace tbs02;

ERROR 1529 (HY000): Failed to drop TABLESPACE tbs02

四、General tablespace 的限制

1)General tablespace 不支持临时表。

2)与系统表空间类似,truncate 或 drop table 只是标记空间为不可用,但是不会将空间还给操作系统。

3)MySQL 5.7.24 版本及之后的版本,不在支持将分区放到 general tablespace 中去了。

ALTER TABLE ... DISCARD TABLESPACE and ALTER TABLE ...IMPORT TABLESPACE 不支持 general tablespace 。

~

~

完毕!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值