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 。
~
~
完畢!