mysql5.7 General 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 。

~
~
完畢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章