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


MySQL 8.4 參考手冊  /  ...  /  CREATE TABLESPACE 陳述式

15.1.21 CREATE TABLESPACE 陳述式

CREATE [UNDO] TABLESPACE tablespace_name

  InnoDB and NDB:
    [ADD DATAFILE 'file_name']
    [AUTOEXTEND_SIZE [=] value]

  InnoDB only:
    [FILE_BLOCK_SIZE = value]
    [ENCRYPTION [=] {'Y' | 'N'}]

  NDB only:
    USE LOGFILE GROUP logfile_group
    [EXTENT_SIZE [=] extent_size]
    [INITIAL_SIZE [=] initial_size]
    [MAX_SIZE [=] max_size]
    [NODEGROUP [=] nodegroup_id]
    [WAIT]
    [COMMENT [=] 'string']

  InnoDB and NDB:
    [ENGINE [=] engine_name]

  Reserved for future use:
    [ENGINE_ATTRIBUTE [=] 'string']

此陳述式用於建立表格空間 (tablespace)。精確的語法和語意取決於所使用的儲存引擎。在標準 MySQL 版本中,這通常是 InnoDB 表格空間。MySQL NDB Cluster 也支援使用 NDB 儲存引擎的表格空間。

InnoDB 的考量

CREATE TABLESPACE 語法用於建立一般表格空間或還原表格空間 (undo tablespace)。必須指定 UNDO 關鍵字才能建立還原表格空間。

一般表格空間是共用表格空間。它可以容納多個表格,並支援所有表格列格式。一般表格空間可以在相對於資料目錄的位置或獨立於資料目錄的位置建立。

建立 InnoDB 一般表格空間後,請使用 CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_nameALTER TABLE tbl_name TABLESPACE [=] tablespace_name,將表格加入表格空間。如需更多資訊,請參閱 第 17.6.3.3 節,〈一般表格空間〉

還原表格空間包含還原日誌。還原表格空間可以透過指定完全限定的資料檔案路徑,在選定的位置建立。如需更多資訊,請參閱 第 17.6.3.4 節,〈還原表格空間〉

NDB Cluster 的考量

此陳述式用於建立表格空間,其中可包含一個或多個資料檔案,為 NDB Cluster 磁碟資料表格提供儲存空間 (請參閱第 25.6.11 節,〈NDB Cluster 磁碟資料表格〉)。使用此陳述式建立一個資料檔案,並將其加入表格空間。可以使用 ALTER TABLESPACE 陳述式,將其他資料檔案加入表格空間 (請參閱 第 15.1.10 節,〈ALTER TABLESPACE 陳述式〉)。

注意

所有 NDB Cluster 磁碟資料物件都共用相同的命名空間。這表示每個磁碟資料物件都必須有唯一的名稱 (而不僅僅是每個給定類型的磁碟資料物件)。例如,您不能有名稱相同的表格空間和記錄檔群組,也不能有名稱相同的表格空間和資料檔案。

一個或多個 UNDO 記錄檔的記錄檔群組必須使用 USE LOGFILE GROUP 子句指派給要建立的表格空間。logfile_group 必須是使用 CREATE LOGFILE GROUP 建立的現有記錄檔群組 (請參閱 第 15.1.16 節,〈CREATE LOGFILE GROUP 陳述式〉)。多個表格空間可以使用相同的記錄檔群組進行 UNDO 記錄。

設定 EXTENT_SIZEINITIAL_SIZE 時,您可以選擇在數字後面加上一個字母的縮寫,表示數量級,類似於 my.cnf 中使用的縮寫。一般來說,這可以是字母 M (表示百萬位元組) 或 G (表示十億位元組)。

INITIAL_SIZEEXTENT_SIZE 會受到四捨五入的影響,如下所示

  • EXTENT_SIZE 會四捨五入到最接近 32K 的整數倍。

  • INITIAL_SIZE向下捨入到最接近 32K 的整數倍;此結果會四捨五入到最接近 (四捨五入後的) EXTENT_SIZE 的整數倍。

注意

NDB 保留表格空間的 4%,用於資料節點重新啟動作業。此保留空間不能用於資料儲存。

上述的四捨五入是明確完成的,當執行任何此類四捨五入時,MySQL 伺服器會發出警告。四捨五入的值也會由 NDB 核心用於計算 INFORMATION_SCHEMA.FILES 資料行值和其他用途。但是,為了避免出現非預期的結果,我們建議您在指定這些選項時,一律使用 32K 的整數倍。

CREATE TABLESPACEENGINE [=] NDB 一起使用時,會在每個 Cluster 資料節點上建立表格空間和相關聯的資料檔案。您可以透過查詢資訊綱要 FILES 表格,驗證是否已建立資料檔案並取得相關資訊。(請參閱本節稍後的範例。)

(請參閱 第 28.3.15 節,〈INFORMATION_SCHEMA FILES 表格〉。)

選項

  • ADD DATAFILE:定義表格空間資料檔案的名稱。建立 NDB 表格空間時,此選項一律為必要;對於 InnoDB,只有在建立還原表格空間時才需要。 file_name (包含任何指定的路徑) 必須以單引號或雙引號括住。檔案名稱 (不包括檔案副檔名) 和目錄名稱的長度必須至少為一個位元組。不支援零長度檔案名稱和目錄名稱。

    由於 InnoDBNDB 處理資料檔案的方式有很大的差異,因此在接下來的討論中會分別介紹這兩個儲存引擎。

    InnoDB 資料檔案。InnoDB 表格空間僅支援單一資料檔案,其名稱必須包含 .ibd 副檔名。

    若要將 InnoDB 一般表格空間資料檔案放在資料目錄外部的位置,請包含完全限定的路徑或相對於資料目錄的路徑。還原表格空間只允許使用完全限定的路徑。如果您沒有指定路徑,則會在資料目錄中建立一般表格空間。如果未指定路徑而建立的還原表格空間,則會在 innodb_undo_directory 變數定義的目錄中建立。如果未設定 innodb_undo_directory,則會在資料目錄中建立還原表格空間。

    為了避免與隱含建立的每個表格檔案表格空間發生衝突,不支援在資料目錄下的子目錄中建立 InnoDB 一般表格空間。在資料目錄外部建立一般表格空間或還原表格空間時,該目錄必須存在,且必須在建立表格空間之前為 InnoDB 所知。若要讓目錄為 InnoDB 所知,請將其新增至 innodb_directories 值,或新增至其中一個值會附加到 innodb_directories 值的變數。innodb_directories 是唯讀變數。設定此變數需要重新啟動伺服器。

    如果建立 InnoDB 表格空間時未指定 ADD DATAFILE 子句,則會隱含建立具有唯一檔案名稱的表格空間資料檔案。唯一的檔案名稱是一個 128 位元的 UUID,格式為五組以破折號分隔的十六進位數字 (aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee)。如果儲存引擎需要,則會新增檔案副檔名。 .ibd 檔案副檔名會新增至 InnoDB 一般表格空間資料檔案。在複寫環境中,複寫來源伺服器上建立的資料檔案名稱與複本上建立的資料檔案名稱不同。

    建立 InnoDB 表格空間時,ADD DATAFILE 子句不允許循環目錄參考。例如,以下陳述式中的循環目錄參考 (/../) 不允許

    CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd 'any_directory/../ts1.ibd';

    Linux 上存在此限制的例外情況,如果先前的目錄是符號連結,則允許循環目錄參考。例如,如果 any_directory 是符號連結,則允許上述範例中的資料檔案路徑。(仍然允許資料檔案路徑以 '../' 開頭。)

    NDB 資料檔案。NDB 表格空間支援多個資料檔案,這些檔案可以有任何合法的檔案名稱;可以使用 ALTER TABLESPACE 陳述式,在建立 NDB Cluster 表格空間之後,將更多資料檔案新增至其中。

    預設情況下,NDB 表格空間資料檔案是在資料節點檔案系統目錄中建立,也就是資料節點資料目錄 (DataDir) 下名為 ndb_nodeid_fs/TS 的目錄,其中 nodeid 是資料節點的 NodeId。若要將資料檔案放在預設位置以外的位置,請包含絕對目錄路徑或相對於預設位置的路徑。如果指定的目錄不存在,NDB 會嘗試建立它;執行資料節點處理序的系統使用者帳戶必須具有執行此作業的適當權限。

    注意

    在決定資料檔案使用的路徑時,NDB 不會展開 ~ (波浪符號) 字元。

    當多個資料節點在相同的實體主機上執行時,適用下列考量

    • 建立資料檔案時,您無法指定絕對路徑。

    • 無法在資料節點檔案系統目錄外建立表格空間資料檔案,除非每個資料節點都有個別的資料目錄。

    • 如果每個資料節點都有自己的資料目錄,則可以在此目錄內的任何位置建立資料檔案。

    • 如果每個資料節點都有自己的資料目錄,那麼只要該路徑解析到主機檔案系統上每個執行於該主機上的資料節點的唯一位置,則也可以使用相對路徑在節點的資料目錄之外建立資料檔案。

  • FILE_BLOCK_SIZE:此選項專屬於 InnoDB 通用表空間,NDB 會忽略此選項。此選項定義了表空間資料檔案的區塊大小。值可以用位元組或 KB 指定。例如,一個 8 KB 的檔案區塊大小可以指定為 8192 或 8K。如果未指定此選項,則 FILE_BLOCK_SIZE 預設為 innodb_page_size 的值。當您打算使用表空間來儲存壓縮的 InnoDB 表格 ( ROW_FORMAT=COMPRESSED ) 時,必須使用 FILE_BLOCK_SIZE。在這種情況下,您必須在建立表空間時定義表空間的 FILE_BLOCK_SIZE

    如果 FILE_BLOCK_SIZE 等於 innodb_page_size 的值,則表空間只能包含具有未壓縮列格式 ( COMPACTREDUNDANTDYNAMIC ) 的表格。具有 COMPRESSED 列格式的表格,其物理頁面大小與未壓縮的表格不同。因此,壓縮的表格無法與未壓縮的表格共存於同一個表空間中。

    若要讓通用表空間包含壓縮表格,必須指定 FILE_BLOCK_SIZE,且 FILE_BLOCK_SIZE 的值相對於 innodb_page_size 的值必須是有效的壓縮頁面大小。此外,壓縮表格的物理頁面大小 ( KEY_BLOCK_SIZE ) 必須等於 FILE_BLOCK_SIZE/1024。例如,如果 innodb_page_size=16K,且 FILE_BLOCK_SIZE=8K,則表格的 KEY_BLOCK_SIZE 必須為 8。如需更多資訊,請參閱第 17.6.3.3 節「通用表空間」

  • USE LOGFILE GROUPNDB 需要此選項,此為先前使用 CREATE LOGFILE GROUP 建立的記錄檔群組的名稱。InnoDB 不支援此選項,使用時會發生錯誤。

  • EXTENT_SIZE:此選項專屬於 NDB,InnoDB 不支援此選項,使用時會發生錯誤。EXTENT_SIZE 設定任何屬於表空間的檔案所使用的區塊大小,單位為位元組。預設值為 1MB。最小值為 32KB,理論最大值為 2GB,但實際最大值取決於許多因素。在大多數情況下,變更區塊大小不會對效能產生任何可測量的影響,建議除了最不尋常的情況外,所有情況都使用預設值。

    一個 區塊 是一種磁碟空間配置單位。在另一個區塊被使用之前,一個區塊會盡可能填滿該區塊可以包含的資料。理論上,每個資料檔案最多可以使用 65,535 (64K) 個區塊;但是,建議的最大值為 32,768 (32K) 個。單一資料檔案建議的最大大小為 32GB,也就是 32K 個區塊 × 每個區塊 1MB。此外,一旦將區塊配置給特定的分割區,就不能用於儲存來自不同分割區的資料;一個區塊不能儲存來自一個以上分割區的資料。例如,這表示,一個具有單一資料檔案的表空間,其 INITIAL_SIZE (在接下來的項目中描述) 為 256MB,且 EXTENT_SIZE 為 128MB,則只有兩個區塊,因此最多只能用於儲存來自兩個不同磁碟資料表格分割區的資料。

    您可以藉由查詢資訊綱要 FILES 表格來查看給定資料檔案中剩餘多少區塊,並由此推估該檔案中剩餘多少可用空間。如需更深入的討論和範例,請參閱 第 28.3.15 節「INFORMATION_SCHEMA FILES 表格」

  • INITIAL_SIZE:此選項專屬於 NDBInnoDB 不支援此選項,使用時會發生錯誤。

    INITIAL_SIZE 參數設定使用 ADD DATATFILE 指定的資料檔案的總大小(以位元組為單位)。一旦建立此檔案,其大小就無法變更;但是,您可以使用 ALTER TABLESPACE ... ADD DATAFILE 將更多資料檔案新增至表空間。

    INITIAL_SIZE 是可選的;其預設值為 134217728 (128 MB)。

    在 32 位元系統上,INITIAL_SIZE 支援的最大值為 4294967296 (4 GB)。

  • AUTOEXTEND_SIZE:定義當表空間已滿時,InnoDB 擴展表空間大小的量。設定值必須是 4MB 的倍數。預設設定為 0,這會導致表空間根據隱含的預設行為進行擴展。如需更多資訊,請參閱第 17.6.3.9 節「表空間 AUTOEXTEND_SIZE 組態」

    在任何版本的 MySQL NDB Cluster 中皆無效,無論使用哪種儲存引擎。

  • MAX_SIZE:目前 MySQL 會忽略此選項;保留供未來使用。在任何版本的 MySQL 或 MySQL NDB Cluster 中皆無效,無論使用哪種儲存引擎。

  • NODEGROUP:目前 MySQL 會忽略此選項;保留供未來使用。在任何版本的 MySQL 或 MySQL NDB Cluster 中皆無效,無論使用哪種儲存引擎。

  • WAIT:目前 MySQL 會忽略此選項;保留供未來使用。在任何版本的 MySQL 或 MySQL NDB Cluster 中皆無效,無論使用哪種儲存引擎。

  • COMMENT:目前 MySQL 會忽略此選項;保留供未來使用。在任何版本的 MySQL 或 MySQL NDB Cluster 中皆無效,無論使用哪種儲存引擎。

  • ENCRYPTION 子句可以啟用或停用 InnoDB 通用表空間的頁面層級資料加密。

    如果未指定 ENCRYPTION 子句,則 default_table_encryption 設定會控制是否啟用加密。ENCRYPTION 子句會覆寫 default_table_encryption 設定。但是,如果啟用 table_encryption_privilege_check 變數,則需要 TABLE_ENCRYPTION_ADMIN 權限才能使用與 default_table_encryption 設定不同的 ENCRYPTION 子句設定。

    必須安裝並設定金鑰環外掛程式,才能建立啟用加密的表空間。

    當通用表空間被加密時,所有位於表空間中的表格都會被加密。同樣地,在加密表空間中建立的表格也會被加密。

    如需更多資訊,請參閱 第 17.13 節「InnoDB 靜態資料加密」

  • ENGINE:定義使用表空間的儲存引擎,其中 engine_name 是儲存引擎的名稱。目前,標準 MySQL 8.4 版本僅支援 InnoDB 儲存引擎。MySQL NDB Cluster 支援 NDBInnoDB 表空間。如果未指定選項,則會將 default_storage_engine 系統變數的值用於 ENGINE

  • ENGINE_ATTRIBUTE 選項用於指定主要儲存引擎的表空間屬性。此選項保留供未來使用。

    分配給此選項的值必須是包含有效 JSON 文件或空字串 ( '') 的字串常值。無效的 JSON 會被拒絕。

    CREATE TABLESPACE ts1 ENGINE_ATTRIBUTE='{"key":"value"}';

    ENGINE_ATTRIBUTE 值可以重複而不會發生錯誤。在這種情況下,會使用最後指定的值。

    伺服器不會檢查 ENGINE_ATTRIBUTE 值,當表格的儲存引擎變更時也不會清除這些值。

注意事項

  • 如需有關 MySQL 表空間命名規則,請參閱 第 11.2 節「綱要物件名稱」。除了這些規則外,不允許使用斜線字元 ( / ),也不可以使用以 innodb_ 開頭的名稱,因為此字首是保留給系統使用的。

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

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

  • TABLESPACE 選項可以與 CREATE TABLEALTER TABLE 搭配使用,以將 InnoDB 表格分割區或子分割區指派給每個表格的表空間。所有分割區都必須屬於相同的儲存引擎。不支援將表格分割區指派給共用的 InnoDB 表空間。共用表空間包括 InnoDB 系統表空間和通用表空間。

  • 通用表空間支援使用 CREATE TABLE ... TABLESPACE 新增任何列格式的表格。不需要啟用 innodb_file_per_table

  • innodb_strict_mode 不適用於通用表空間。表空間管理規則的執行是嚴格的,且獨立於 innodb_strict_mode。如果 CREATE TABLESPACE 參數不正確或不相容,無論 innodb_strict_mode 設定為何,操作都會失敗。當使用 CREATE TABLE ... TABLESPACEALTER TABLE ... TABLESPACE 將表新增至通用表空間時,會忽略 innodb_strict_mode,但語句的評估方式如同已啟用 innodb_strict_mode

  • 使用 DROP TABLESPACE 來移除表空間。在刪除表空間之前,必須先使用 DROP TABLE 從表空間中刪除所有表。在刪除 NDB Cluster 表空間之前,您還必須使用一個或多個 ALTER TABLESPACE ... DROP DATATFILE 語句來移除其所有資料檔案。請參閱第 25.6.11.1 節,「NDB Cluster 磁碟資料物件」

  • 新增至 InnoDB 通用表空間的 InnoDB 表的所有部分,包括索引和 BLOB 頁面,都位於通用表空間中。

    對於指定到表空間的 NDB 表,只有未編索引的欄會儲存在磁碟上,並實際使用表空間資料檔案。所有 NDB 表的索引和已編索引的欄始終保存在記憶體中。

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

  • 通用表空間不與任何資料庫或綱要關聯。

  • ALTER TABLE ... DISCARD TABLESPACEALTER TABLE ...IMPORT TABLESPACE 不支援屬於通用表空間的表。

  • 伺服器對參照通用表空間的 DDL 使用表空間層級的中繼資料鎖定。相比之下,伺服器對參照每個表檔案表空間的 DDL 使用表層級的中繼資料鎖定。

  • 已產生或現有的表空間不能變更為通用表空間。

  • 通用表空間名稱與每個表檔案表空間名稱之間沒有衝突。每個表檔案表空間名稱中存在的「/」字元在通用表空間名稱中是不允許的。

  • mysqldump 不會傾印 InnoDB CREATE TABLESPACE 語句。

InnoDB 範例

此範例示範如何建立通用表空間並新增三個不同資料列格式的未壓縮表。

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENGINE=INNODB;

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

mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT;

mysql> CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC;

此範例示範如何建立通用表空間並新增壓縮表。此範例假設預設的 innodb_page_size 值為 16K。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;

此範例示範如何建立通用表空間,而未指定 ADD DATAFILE 子句,該子句為選用子句

mysql> CREATE TABLESPACE `ts3` ENGINE=INNODB;

此範例示範如何建立還原表空間

mysql> CREATE UNDO TABLESPACE undo_003 ADD DATAFILE 'undo_003.ibu';

NDB 範例

假設您想要使用名為 mydata-1.dat 的資料檔案建立名為 myts 的 NDB Cluster 磁碟資料表空間。NDB 表空間始終需要使用一個包含一個或多個還原記錄檔的記錄檔群組。在此範例中,我們首先建立名為 mylg 的記錄檔群組,其中包含一個名為 myundo-1.dat 的還原長記錄檔,方法是使用此處顯示的 CREATE LOGFILE GROUP 語句

mysql> CREATE LOGFILE GROUP myg1
    ->     ADD UNDOFILE 'myundo-1.dat'
    ->     ENGINE=NDB;
Query OK, 0 rows affected (3.29 sec)

現在您可以使用以下語句建立先前所述的表空間

mysql> CREATE TABLESPACE myts
    ->     ADD DATAFILE 'mydata-1.dat'
    ->     USE LOGFILE GROUP mylg
    ->     ENGINE=NDB;
Query OK, 0 rows affected (2.98 sec)

現在您可以使用包含 TABLESPACESTORAGE DISK 選項的 CREATE TABLE 語句來建立磁碟資料表,類似於此處所示

mysql> CREATE TABLE mytable (
    ->     id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->     lname VARCHAR(50) NOT NULL,
    ->     fname VARCHAR(50) NOT NULL,
    ->     dob DATE NOT NULL,
    ->     joined DATE NOT NULL,
    ->     INDEX(last_name, first_name)
    -> )
    ->     TABLESPACE myts STORAGE DISK
    ->     ENGINE=NDB;
Query OK, 0 rows affected (1.41 sec)

重要的是要注意,由於 idlnamefname 欄都已編索引,因此實際上只有 mytable 中的 dobjoined 欄儲存在磁碟上。

如先前所述,當 CREATE TABLESPACEENGINE [=] NDB 一起使用時,會在每個 NDB Cluster 資料節點上建立表空間及其相關聯的資料檔案。您可以透過查詢資訊綱要 FILES 表來驗證資料檔案是否已建立並取得其相關資訊,如此處所示

mysql> SELECT FILE_NAME, FILE_TYPE, LOGFILE_GROUP_NAME, STATUS, EXTRA
    ->     FROM INFORMATION_SCHEMA.FILES
    ->     WHERE TABLESPACE_NAME = 'myts';

+--------------+------------+--------------------+--------+----------------+
| file_name    | file_type  | logfile_group_name | status | extra          |
+--------------+------------+--------------------+--------+----------------+
| mydata-1.dat | DATAFILE   | mylg               | NORMAL | CLUSTER_NODE=5 |
| mydata-1.dat | DATAFILE   | mylg               | NORMAL | CLUSTER_NODE=6 |
| NULL         | TABLESPACE | mylg               | NORMAL | NULL           |
+--------------+------------+--------------------+--------+----------------+
3 rows in set (0.01 sec)

如需其他資訊和範例,請參閱第 25.6.11.1 節,「NDB Cluster 磁碟資料物件」