文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 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 參考手冊  /  ...  /  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']

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

InnoDB 的注意事項

CREATE 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 叢集的注意事項

此陳述式用於建立表空間,其中可包含一或多個資料檔案,為 NDB 叢集磁碟資料表提供儲存空間(請參閱 第 25.6.11 節「NDB 叢集磁碟資料表」)。使用此陳述式會建立一個資料檔案並將其新增至表空間。可以使用 ALTER TABLESPACE 陳述式將其他資料檔案新增至表空間(請參閱 第 15.1.10 節「ALTER TABLESPACE 陳述式」)。

注意

所有 NDB 叢集磁碟資料物件都共用相同的命名空間。這表示每個磁碟資料物件都必須具有唯一名稱(而不僅僅是給定類型的每個磁碟資料物件)。例如,您不能有與日誌檔案群組名稱相同的表空間,或者與資料檔案名稱相同的表空間。

必須使用 USE LOGFILE GROUP 子句將一個或多個 UNDO 日誌檔案的日誌檔案群組指派給要建立的表空間。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 搭配使用時,會在每個叢集資料節點上建立表空間和相關聯的資料檔案。您可以藉由查詢資訊綱要 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 叢集表空間後將更多資料檔案新增至其中。

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

    注意

    在判斷用於資料檔案的路徑時,NDB 不會展開 ~(波浪號)字元。

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

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

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

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

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

  • FILE_BLOCK_SIZE:此選項專屬於 InnoDB 通用表空間,並且會被 NDB 忽略。此選項定義表空間資料檔案的區塊大小。數值可以使用位元組或千位元組指定。例如,8 千位元組的檔案區塊大小可以指定為 8192 或 8K。如果您沒有指定此選項,FILE_BLOCK_SIZE 的預設值會是 innodb_page_size 的值。FILE_BLOCK_SIZE 在您打算使用表空間來儲存壓縮的 InnoDB 表格(ROW_FORMAT=COMPRESSED)時是必要的。在這種情況下,您必須在建立表空間時定義表空間的 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 GROUP:此為 NDB 所必需,它是先前使用 CREATE LOGFILE GROUP 建立的日誌檔案群組的名稱。不支援 InnoDB,在 InnoDB 中會產生錯誤。

  • EXTENT_SIZE:此選項專屬於 NDB,且不受 InnoDB 支援,在 InnoDB 中會產生錯誤。EXTENT_SIZE 設定表空間中任何檔案所使用的範圍大小(以位元組為單位)。預設值為 1M。最小值為 32K,理論最大值為 2G,但實際最大值取決於許多因素。在大多數情況下,變更範圍大小對效能沒有任何可測量的影響,對於除了最不尋常的情況之外,建議使用預設值。

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

    您可以藉由查詢 Information Schema FILES 表格,來查看給定資料檔案中剩餘的範圍數量,並以此推斷檔案中剩餘的空間量。如需進一步的討論和範例,請參閱 第 28.3.15 節,「INFORMATION_SCHEMA FILES 表格」

  • INITIAL_SIZE:此選項專屬於 NDB,且不受 InnoDB 支援,在 InnoDB 中會產生錯誤。

    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 9.0 版本僅支援 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。FILE_BLOCK_SIZE 為 8192 需要壓縮資料表的 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 表空間一律需要使用由一個或多個復原記錄檔組成的記錄檔群組。在此範例中,我們首先使用此處所示的 CREATE LOGFILE GROUP 語法建立名為 mylg 的記錄檔群組,其中包含名為 myundo-1.dat 的一個復原長檔案。

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 磁碟資料物件」