通用表空間是使用 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_nameALTER 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變數定義的目錄。