文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


17.6.3.3 通用表空間

通用表空間是使用 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 陳述式將表格新增至表空間,如下列範例所示

CREATE TABLE:

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;

ALTER TABLE:

mysql> ALTER TABLE t2 TABLESPACE ts1;

不支援將表格分割區新增至共用表空間。共用表空間包括 InnoDB 系統表空間和通用表空間。

如需詳細的語法資訊,請參閱 CREATE TABLEALTER TABLE

通用表空間的列格式支援

通用表空間支援所有表格列格式 (REDUNDANTCOMPACTDYNAMICCOMPRESSED),但壓縮和未壓縮的表格不能在同一個通用表空間中共存,因為它們的實體頁面大小不同。

若要讓通用表空間包含壓縮表格 (ROW_FORMAT=COMPRESSED),則必須指定 FILE_BLOCK_SIZE 選項,且 FILE_BLOCK_SIZE 值必須是相對於 innodb_page_size 值的有效壓縮頁面大小。此外,壓縮表格的實體頁面大小 (KEY_BLOCK_SIZE) 必須等於 FILE_BLOCK_SIZE/1024。例如,如果 innodb_page_size=16KBFILE_BLOCK_SIZE=8K,則表格的 KEY_BLOCK_SIZE 必須為 8。

下表顯示允許的 innodb_page_sizeFILE_BLOCK_SIZEKEY_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 時,表空間可能僅包含具有未壓縮列格式(COMPACTREDUNDANTDYNAMIC 列格式)的表格。

使用 ALTER TABLE 在表空間之間移動表格

具有 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 TABLESFLUSH 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;
注意

tablespace_name 是 MySQL 中區分大小寫的識別碼。

通用表空間限制
  • 產生的或現有的表空間無法變更為通用表空間。

  • 不支援建立暫存通用表空間。

  • 通用表空間不支援暫存表格。

  • 與系統表空間類似,截斷或刪除儲存在一般表空間中的表格,會在一般表空間的 .ibd 資料檔案 內部建立可用空間,這些空間只能用於新的 InnoDB 資料。這些空間不會像 每個表格一個檔案 的表空間那樣釋放回作業系統。

    此外,在共享表空間(一般表空間或系統表空間)中的表格上進行的表格複製 ALTER TABLE 操作,可能會增加表空間使用的空間量。此類操作需要的額外空間,與表格中的資料加上索引所佔用的空間一樣多。表格複製 ALTER TABLE 操作所需的額外空間,不會像每個表格一個檔案的表空間那樣釋放回作業系統。

  • 不支援對屬於一般表空間的表格使用 ALTER TABLE ... DISCARD TABLESPACEALTER TABLE ...IMPORT TABLESPACE

  • 不支援將表格分割區放置於一般表空間中。

  • 當來源和複本位於同一主機時,不支援 ADD DATAFILE 子句,因為這會導致來源和複本在相同位置建立具有相同名稱的表空間,這是不可支援的。但是,如果省略 ADD DATAFILE 子句,則表空間會在資料目錄中建立,並使用一個唯一的產生檔案名稱,這是允許的。

  • 除非 InnoDB 知道該目錄,否則一般表空間無法在 undo 表空間目錄 (innodb_undo_directory) 中建立。已知的目錄是透過 datadirinnodb_data_home_dirinnodb_directories 變數定義的目錄。