文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  通用表空間

17.6.3.3 通用表空間

通用表空間是使用 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_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。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 時,表格空間只能包含具有未壓縮列格式 (COMPACTREDUNDANTDYNAMIC 列格式) 的表格。

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

可以使用 ALTER TABLETABLESPACE 選項,將表格移動至現有的一般表格空間、新的每個表格單獨檔案表格空間或系統表格空間。

不支援將表格分割區新增至共用表格空間。共用表格空間包括 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 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 知道該目錄,否則無法在撤銷表空間目錄 (innodb_undo_directory) 中建立一般表空間。已知的目錄是由 datadirinnodb_data_home_dirinnodb_directories 變數定義的目錄。