通用表空間是使用 CREATE TABLESPACE
語法建立的共用 InnoDB
表空間。通用表空間的功能和特性在本節的以下主題中說明
通用表空間提供以下功能
與系統表空間類似,通用表空間是能夠儲存多個表格資料的共用表空間。
相較於單表表空間,通用表空間具有潛在的記憶體優勢。伺服器會在表空間的生命週期內將表空間中繼資料保留在記憶體中。相較於在個別單表表空間中相同數量的表格,在較少通用表空間中的多個表格會消耗較少的表空間中繼資料記憶體。
通用表空間資料檔案可以放置在相對於 MySQL 資料目錄或獨立於 MySQL 資料目錄的目錄中,這為您提供了許多與單表表空間相同的資料檔案和儲存管理功能。與單表表空間一樣,將資料檔案放置在 MySQL 資料目錄之外的能力,可讓您分別管理重要表格的效能、為特定表格設定 RAID 或 DRBD,或將表格繫結到特定磁碟,例如。
通用表空間支援所有表格列格式和相關功能。
TABLESPACE
選項可以與CREATE TABLE
一起使用,以在通用表空間、單表表空間或系統表空間中建立表格。TABLESPACE
選項可以與ALTER TABLE
一起使用,以在通用表空間、單表表空間和系統表空間之間移動表格。
使用 CREATE TABLESPACE
語法建立通用表空間。
CREATE TABLESPACE tablespace_name
[ADD DATAFILE 'file_name']
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
一般表格空間可以在資料目錄內或外部建立。為了避免與隱式建立的每個表格單獨檔案表格空間發生衝突,不支援在資料目錄下的子目錄中建立一般表格空間。在資料目錄外部建立一般表格空間時,該目錄必須存在,並且在建立表格空間之前必須為 InnoDB
所知。若要使未知目錄為 InnoDB
所知,請將該目錄新增至 innodb_directories
引數值。innodb_directories
是一個唯讀的啟動選項。設定它需要重新啟動伺服器。
範例
在資料目錄中建立一般表格空間
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
或
mysql> CREATE TABLESPACE `ts1` Engine=InnoDB;
ADD DATAFILE
子句是可選的。如果在建立表格空間時未指定 ADD DATAFILE
子句,則會隱式建立具有唯一檔案名稱的表格空間資料檔案。唯一的檔案名稱是一個 128 位元的 UUID,格式化為以破折號分隔的五組十六進位數字 (aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
)。一般表格空間資料檔案包含 .ibd
副檔名。在複寫環境中,來源上建立的資料檔案名稱與複本上建立的資料檔案名稱不同。
在資料目錄外部的目錄中建立一般表格空間
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;
您可以指定相對於資料目錄的路徑,只要表格空間目錄不在資料目錄下即可。在此範例中,my_tablespace
目錄與資料目錄位於同一層級
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;
ENGINE = InnoDB
子句必須定義為 CREATE TABLESPACE
語句的一部分,或者必須將 InnoDB
定義為預設儲存引擎 (default_storage_engine=InnoDB
)。
建立一般表格空間後,可以使用 CREATE TABLE
或 tbl_name
... TABLESPACE [=] tablespace_name
ALTER TABLE
語句將表格新增至表格空間,如下列範例所示tbl_name
TABLESPACE [=] tablespace_name
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
mysql> ALTER TABLE t2 TABLESPACE ts1;
不支援將表格分割區新增至共用表格空間。共用表格空間包括 InnoDB
系統表格空間和一般表格空間。
如需詳細的語法資訊,請參閱 CREATE TABLE
和 ALTER TABLE
。
一般表格空間支援所有表格列格式 (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=16KB
且 FILE_BLOCK_SIZE=8K
,則表格的 KEY_BLOCK_SIZE
必須為 8。
下表顯示允許的 innodb_page_size
、FILE_BLOCK_SIZE
和 KEY_BLOCK_SIZE
組合。也可以使用位元組來指定 FILE_BLOCK_SIZE
值。若要判斷給定 FILE_BLOCK_SIZE
的有效 KEY_BLOCK_SIZE
值,請將 FILE_BLOCK_SIZE
值除以 1024。32K 和 64K InnoDB
頁面大小不支援表格壓縮。如需有關 KEY_BLOCK_SIZE
的詳細資訊,請參閱 CREATE TABLE
和 第 17.9.1.2 節:「建立壓縮表格」。
表格 17.3 壓縮表格允許的頁面大小、FILE_BLOCK_SIZE 和 KEY_BLOCK_SIZE 組合
InnoDB 頁面大小 (innodb_page_size) | 允許的 FILE_BLOCK_SIZE 值 | 允許的 KEY_BLOCK_SIZE 值 |
---|---|---|
64KB | 64K (65536) | 不支援壓縮 |
32KB | 32K (32768) | 不支援壓縮 |
16KB | 16K (16384) | 無。如果 innodb_page_size 等於 FILE_BLOCK_SIZE ,則表格空間不能包含壓縮表格。 |
16KB | 8K (8192) | 8 |
16KB | 4K (4096) | 4 |
16KB | 2K (2048) | 2 |
16KB | 1K (1024) | 1 |
8KB | 8K (8192) | 無。如果 innodb_page_size 等於 FILE_BLOCK_SIZE ,則表格空間不能包含壓縮表格。 |
8KB | 4K (4096) | 4 |
8KB | 2K (2048) | 2 |
8KB | 1K (1024) | 1 |
4KB | 4K (4096) | 無。如果 innodb_page_size 等於 FILE_BLOCK_SIZE ,則表格空間不能包含壓縮表格。 |
4KB | 2K (2048) | 2 |
4KB | 1K (1024) | 1 |
此範例示範如何建立一般表格空間並新增壓縮表格。此範例假設預設的 innodb_page_size
為 16KB。FILE_BLOCK_SIZE
為 8192 時,壓縮表格必須具有 8 的 KEY_BLOCK_SIZE
。
mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;
mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
如果在建立一般表格空間時未指定 FILE_BLOCK_SIZE
,則 FILE_BLOCK_SIZE
預設為 innodb_page_size
。當 FILE_BLOCK_SIZE
等於 innodb_page_size
時,表格空間只能包含具有未壓縮列格式 (COMPACT
、REDUNDANT
和 DYNAMIC
列格式) 的表格。
可以使用 ALTER TABLE
和 TABLESPACE
選項,將表格移動至現有的一般表格空間、新的每個表格單獨檔案表格空間或系統表格空間。
不支援將表格分割區新增至共用表格空間。共用表格空間包括 InnoDB
系統表格空間和一般表格空間。
若要將表格從每個表格單獨檔案表格空間或系統表格空間移動至一般表格空間,請指定一般表格空間的名稱。一般表格空間必須存在。如需更多資訊,請參閱 ALTER TABLESPACE
。
ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;
若要將表格從一般表格空間或每個表格單獨檔案表格空間移動至系統表格空間,請指定 innodb_system
作為表格空間名稱。
ALTER TABLE tbl_name TABLESPACE [=] innodb_system;
若要將表格從系統表格空間或一般表格空間移動至每個表格單獨檔案表格空間,請指定 innodb_file_per_table
作為表格空間名稱。
ALTER TABLE tbl_name TABLESPACE [=] innodb_file_per_table;
ALTER TABLE ... TABLESPACE
作業會導致整個表格重建,即使 TABLESPACE
屬性與先前的值沒有變更。
ALTER TABLE ... TABLESPACE
語法不支援將表格從暫時表格空間移動至持續表格空間。
允許在 CREATE TABLE ... TABLESPACE=innodb_file_per_table
中使用 DATA DIRECTORY
子句,但不支援將其與 TABLESPACE
選項結合使用。在 DATA DIRECTORY
子句中指定的目錄必須為 InnoDB
所知。如需更多資訊,請參閱使用 DATA DIRECTORY 子句。
從加密表格空間移動表格時,會有一些限制。請參閱 加密限制。
可以使用 ALTER TABLESPACE ... RENAME TO
語法來重新命名一般表格空間。
ALTER TABLESPACE s1 RENAME TO s2;
重新命名一般表格空間需要 CREATE TABLESPACE
權限。
無論 autocommit
設定為何,RENAME TO
作業都會以 autocommit
模式隱式執行。
當 LOCK TABLES
或 FLUSH TABLES WITH READ LOCK
對於位於表格空間中的表格生效時,無法執行 RENAME TO
作業。
在重新命名表格空間時,會在一般表格空間內的表格上取得獨佔中繼資料鎖,這會防止並行 DDL。支援並行 DML。
DROP TABLESPACE
語句用於捨棄 InnoDB
一般表格空間。
在執行 DROP TABLESPACE
作業之前,必須先從表格空間捨棄所有表格。如果表格空間不是空的,DROP TABLESPACE
會傳回錯誤。
使用類似於下列的查詢來識別一般表格空間中的表格。
mysql> SELECT a.NAME AS space_name, b.NAME AS table_name FROM INFORMATION_SCHEMA.INNODB_TABLESPACES a,
INFORMATION_SCHEMA.INNODB_TABLES b WHERE a.SPACE=b.SPACE AND a.NAME LIKE 'ts1';
+------------+------------+
| space_name | table_name |
+------------+------------+
| ts1 | test/t1 |
| ts1 | test/t2 |
| ts1 | test/t3 |
+------------+------------+
當捨棄表格空間中的最後一個表格時,不會自動刪除一般 InnoDB
表格空間。必須使用 DROP TABLESPACE
明確捨棄表格空間。tablespace_name
一般表格空間不屬於任何特定的資料庫。DROP DATABASE
作業可以捨棄屬於一般表格空間的表格,但它無法捨棄表格空間,即使 DROP DATABASE
作業捨棄了屬於表格空間的所有表格。
與系統表格空間類似,截斷或捨棄儲存在一般表格空間中的表格會在一般表格空間 .ibd 資料檔案 中建立內部可用空間,該空間只能用於新的 InnoDB
資料。在 DROP TABLE
作業期間刪除每個表格單獨檔案表格空間時,不會將空間釋放回作業系統。
此範例示範如何捨棄 InnoDB
一般表格空間。一般表格空間 ts1
是使用單一表格建立的。在捨棄表格空間之前,必須先捨棄該表格。
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 Engine=InnoDB;
mysql> DROP TABLE t1;
mysql> DROP TABLESPACE ts1;
是 MySQL 中區分大小寫的識別碼。tablespace_name
無法將已產生或現有的表格空間變更為一般表格空間。
不支援建立暫時一般表格空間。
一般表格空間不支援暫時表格。
與系統表格空間類似,截斷或捨棄儲存在一般表格空間中的表格會在一般表格空間 .ibd 資料檔案 中建立內部可用空間,該空間只能用於新的
InnoDB
資料。對於每個表格單獨檔案表格空間,空間不會釋放回作業系統。此外,對位於共享表空間(一般表空間或系統表空間)中的表執行表複製的
ALTER TABLE
操作可能會增加表空間的使用量。此類操作需要的額外空間與表中的資料加上索引一樣多。表複製的ALTER TABLE
操作所需的額外空間不會像每個表檔案表空間一樣釋放回作業系統。不支援對屬於一般表空間的表使用
ALTER TABLE ... DISCARD TABLESPACE
和ALTER TABLE ...IMPORT TABLESPACE
。不支援將表分割區放置在一般表空間中。
由於會導致來源和複本在相同位置建立相同名稱的表空間,因此在來源和複本位於同一主機的複寫環境中,不支援
ADD DATAFILE
子句。但是,如果省略ADD DATAFILE
子句,則會在資料目錄中建立表空間,並使用唯一產生的檔案名稱,這是允許的。除非
InnoDB
知道該目錄,否則無法在撤銷表空間目錄 (innodb_undo_directory
) 中建立一般表空間。已知的目錄是由datadir
、innodb_data_home_dir
和innodb_directories
變數定義的目錄。