通用表空間是使用 CREATE TABLESPACE
語法建立的共用 InnoDB
表空間。通用表空間的功能和特性在本節的下列主題中說明
通用表空間提供以下功能
與系統表空間類似,通用表空間是可以儲存多個資料表資料的共用表空間。
相較於單表表空間,通用表空間具有潛在的記憶體優勢。伺服器會將表空間中繼資料保留在記憶體中,直到表空間的生命週期結束。較少的通用表空間中的多個資料表,會比位於個別單表表空間中的相同數量資料表,消耗較少的表空間中繼資料記憶體。
通用表空間資料檔案可以放置在相對於或獨立於 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。8192 的 FILE_BLOCK_SIZE
需要壓縮表格的 KEY_BLOCK_SIZE
為 8。
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
列格式)的表格。
具有 TABLESPACE
選項的 ALTER TABLE
可以用來將表格移動到現有的通用表空間、新的單表單檔表空間或系統表空間。
不支援將表格分割區新增至共用表空間。共用表空間包括 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
語法不支援將表格從暫存表空間移動到永久表空間。
允許將 DATA DIRECTORY
子句與 CREATE TABLE ... TABLESPACE=innodb_file_per_table
搭配使用,但在其他情況下,不支援將其與 TABLESPACE
選項搭配使用。DATA DIRECTORY
子句中指定的目錄必須為 InnoDB
所知。如需詳細資訊,請參閱 使用 DATA DIRECTORY 子句。
從加密表空間移動表格時,有一些限制。請參閱加密限制。
支援使用 ALTER TABLESPACE ... RENAME TO
語法來重新命名通用表空間。
ALTER TABLESPACE s1 RENAME TO s2;
重新命名通用表空間需要 CREATE TABLESPACE
權限。
RENAME TO
作業會在 autocommit
模式中隱式執行,而無論 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
知道該目錄,否則一般表空間無法在 undo 表空間目錄 (innodb_undo_directory
) 中建立。已知的目錄是透過datadir
、innodb_data_home_dir
和innodb_directories
變數定義的目錄。