文件首頁
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 參考手冊  /  ...  /  NDB Cluster 磁碟資料物件

25.6.11.1 NDB Cluster 磁碟資料物件

NDB Cluster 磁碟資料儲存是使用下列物件實作的

  • 表格空間 (Tablespace):作為其他磁碟資料物件的容器。一個表格空間包含一個或多個資料檔案和一個或多個復原記錄檔群組。

  • 資料檔案 (Data file):儲存欄位資料。資料檔案直接指定給表格空間。

  • 復原記錄檔 (Undo log file):包含回滾交易所需的復原資訊。指定給復原記錄檔群組。

  • 記錄檔群組 (Log file group):包含一個或多個復原記錄檔。指定給表格空間。

復原記錄檔和資料檔案是每個資料節點檔案系統中的實際檔案;預設情況下,它們會放置在 NDB Cluster config.ini 檔案中指定的 DataDir 中的 ndb_node_id_fs 中,其中 node_id 是資料節點的節點 ID。可以透過在建立復原記錄檔或資料檔案時,將絕對或相對路徑指定為檔案名稱的一部分,將它們放置在其他位置。建立這些檔案的陳述式將在本節稍後顯示。

復原記錄檔僅供磁碟資料表格使用,並非僅在記憶體中儲存的 NDB 表格所需或使用。

NDB Cluster 表格空間和記錄檔群組不會以檔案的形式實作。

雖然並非所有的磁碟資料物件都以檔案的形式實作,但它們都共用相同的命名空間。這表示每個磁碟資料物件都必須是唯一命名的 (而不僅僅是特定類型的每個磁碟資料物件)。例如,您不能讓一個表格空間和一個記錄檔群組都命名為 dd1

假設您已設定具有所有節點 (包括管理和 SQL 節點) 的 NDB Cluster,則在磁碟上建立 NDB Cluster 表格的基本步驟如下

  1. 建立記錄檔群組,並將一個或多個復原記錄檔指定給它 (復原記錄檔有時也稱為 復原檔案 (undofile))。

  2. 建立表格空間;將記錄檔群組以及一個或多個資料檔案指定給表格空間。

  3. 建立使用此表格空間進行資料儲存的磁碟資料表格。

可以使用 mysql 用戶端或其他 MySQL 用戶端應用程式中的 SQL 陳述式來完成每個任務,如下列範例所示。

  1. 我們使用 CREATE LOGFILE GROUP 建立名為 lg_1 的記錄檔群組。這個記錄檔群組將由兩個復原記錄檔組成,我們將它們命名為 undo_1.logundo_2.log,其初始大小分別為 16 MB 和 12 MB。(復原記錄檔的預設初始大小為 128 MB。) 您也可以選擇性地指定記錄檔群組的復原緩衝區的大小,或允許它假設預設值 8 MB。在此範例中,我們將復原緩衝區的大小設定為 2 MB。記錄檔群組必須使用復原記錄檔建立;因此,我們在此 CREATE LOGFILE GROUP 陳述式中,將 undo_1.log 新增至 lg_1

    CREATE LOGFILE GROUP lg_1
        ADD UNDOFILE 'undo_1.log'
        INITIAL_SIZE 16M
        UNDO_BUFFER_SIZE 2M
        ENGINE NDBCLUSTER;

    若要將 undo_2.log 新增至記錄檔群組,請使用下列 ALTER LOGFILE GROUP 陳述式

    ALTER LOGFILE GROUP lg_1
        ADD UNDOFILE 'undo_2.log'
        INITIAL_SIZE 12M
        ENGINE NDBCLUSTER;

    需要注意的一些項目

    • 此處使用的 .log 檔案副檔名不是必要的。我們使用它僅僅是為了讓記錄檔容易識別。

    • 每個 CREATE LOGFILE GROUPALTER LOGFILE GROUP 陳述式都必須包含 ENGINE 選項。此選項唯一允許的值是 NDBCLUSTERNDB

      重要

      在任何給定時間,同一個 NDB Cluster 中最多只能有一個記錄檔群組。

    • 當您使用 ADD UNDOFILE 'filename' 將復原記錄檔新增至記錄檔群組時,會使用 filename 這個名稱在叢集中每個資料節點的 DataDir 中的 ndb_node_id_fs 目錄中建立檔案,其中 node_id 是資料節點的節點 ID。每個復原記錄檔的大小都在 SQL 陳述式中指定。例如,如果 NDB Cluster 有 4 個資料節點,則剛才顯示的 ALTER LOGFILE GROUP 陳述式會建立 4 個復原記錄檔,每個資料節點的資料目錄中各 1 個;這些檔案的名稱都是 undo_2.log,且每個檔案的大小都是 12 MB。

    • UNDO_BUFFER_SIZE 受可用系統記憶體量限制。

    • 如需有關這些陳述式的詳細資訊,請參閱第 15.1.16 節「CREATE LOGFILE GROUP 陳述式」第 15.1.6 節「ALTER LOGFILE GROUP 陳述式」

  2. 現在我們可以建立表格空間,這是一個抽象的容器,供磁碟資料表格用來儲存資料的檔案使用。表格空間與特定的記錄檔群組相關聯;當建立新的表格空間時,您必須指定它用於復原記錄的記錄檔群組。您還必須指定至少一個資料檔案;建立表格空間後,您可以向表格空間新增更多資料檔案。也可以從表格空間中捨棄資料檔案 (請參閱本節稍後的範例)。

    假設我們希望建立一個名為 ts_1 的表格空間,它使用 lg_1 作為其記錄檔群組。我們希望表格空間包含兩個資料檔案,分別命名為 data_1.datdata_2.dat,其初始大小分別為 32 MB 和 48 MB。( INITIAL_SIZE 的預設值為 128 MB。) 我們可以使用兩個 SQL 陳述式來執行此操作,如下所示

    CREATE TABLESPACE ts_1
        ADD DATAFILE 'data_1.dat'
        USE LOGFILE GROUP lg_1
        INITIAL_SIZE 32M
        ENGINE NDBCLUSTER;
    
    ALTER TABLESPACE ts_1
        ADD DATAFILE 'data_2.dat'
        INITIAL_SIZE 48M;

    CREATE TABLESPACE 陳述式會建立具有資料檔案 data_1.dat 的表格空間 ts_1,並將 ts_1 與記錄檔群組 lg_1 建立關聯。ALTER TABLESPACE 會新增第二個資料檔案 (data_2.dat)。

    需要注意的一些項目

    • 與此範例中用於復原記錄檔的 .log 檔案副檔名一樣,.dat 檔案副檔名沒有特殊意義;使用它僅僅是為了容易識別。

    • 當您使用 ADD DATAFILE 'filename' 將資料檔案新增至表格空間時,會使用 filename 這個名稱在叢集中每個資料節點的 DataDir 中的 ndb_node_id_fs 目錄中建立檔案,其中 node_id 是資料節點的節點 ID。每個資料檔案的大小都在 SQL 陳述式中指定。例如,如果 NDB Cluster 有 4 個資料節點,則剛才顯示的 ALTER TABLESPACE 陳述式會建立 4 個資料檔案,每個資料節點的資料目錄中各 1 個;這些檔案的名稱都是 data_2.dat,且每個檔案的大小都是 48 MB。

    • NDB 會保留每個表格空間的 4% 作為資料節點重新啟動期間使用。這個空間無法用於儲存資料。

    • CREATE TABLESPACE 陳述式必須包含 ENGINE 子句;只有使用與表格空間相同儲存引擎的表格,才能在表格空間中建立。對於 NDB 表格空間,ALTER TABLESPACE 僅針對 ALTER TABLESPACE ... ADD DATAFILE 接受 ENGINE 子句;任何其他 ALTER TABLESPACE 陳述式都會拒絕 ENGINE。對於 NDB 表格空間,ENGINE 選項唯一允許的值是 NDBCLUSTERNDB

    • 擴展區的配置會在給定表空間使用的所有資料檔案之間以循環方式執行。

    • 關於 CREATE TABLESPACEALTER TABLESPACE 陳述式的更多資訊,請參閱 第 15.1.21 節,「CREATE TABLESPACE 陳述式」,以及 第 15.1.10 節,「ALTER TABLESPACE 陳述式」

  3. 現在可以建立一個表格,其未索引的欄位會使用表空間 ts_1 中的檔案儲存在磁碟上

    CREATE TABLE dt_1 (
        member_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        last_name VARCHAR(50) NOT NULL,
        first_name VARCHAR(50) NOT NULL,
        dob DATE NOT NULL,
        joined DATE NOT NULL,
        INDEX(last_name, first_name)
        )
        TABLESPACE ts_1 STORAGE DISK
        ENGINE NDBCLUSTER;

    TABLESPACE ts_1 STORAGE DISK 會告知 NDB 儲存引擎使用表空間 ts_1 來將資料儲存在磁碟上。

    如所示建立表格 ts_1 後,您可以對其執行 INSERTSELECTUPDATEDELETE 陳述式,就像對任何其他 MySQL 表格一樣。

    也可以在 CREATE TABLEALTER TABLE 陳述式中,使用欄位的定義中的 STORAGE 子句來指定個別欄位是儲存在磁碟上還是記憶體中。STORAGE DISK 會使欄位儲存在磁碟上,而 STORAGE MEMORY 會使使用記憶體內儲存。如需更多資訊,請參閱 第 15.1.20 節,「CREATE TABLE 陳述式」

您可以藉由查詢 INFORMATION_SCHEMA 資料庫中的 FILES 表格,取得剛建立的 NDB 磁碟資料檔案和復原記錄檔的相關資訊,如下所示

mysql> SELECT
              FILE_NAME AS File, FILE_TYPE AS Type,
              TABLESPACE_NAME AS Tablespace, TABLE_NAME AS Name,
              LOGFILE_GROUP_NAME AS 'File group',
              FREE_EXTENTS AS Free, TOTAL_EXTENTS AS Total
          FROM INFORMATION_SCHEMA.FILES
          WHERE ENGINE='ndbcluster';
+--------------+----------+------------+------+------------+------+---------+
| File         | Type     | Tablespace | Name | File group | Free | Total   |
+--------------+----------+------------+------+------------+------+---------+
| ./undo_1.log | UNDO LOG | lg_1       | NULL | lg_1       |    0 | 4194304 |
| ./undo_2.log | UNDO LOG | lg_1       | NULL | lg_1       |    0 | 3145728 |
| ./data_1.dat | DATAFILE | ts_1       | NULL | lg_1       |   32 |      32 |
| ./data_2.dat | DATAFILE | ts_1       | NULL | lg_1       |   48 |      48 |
+--------------+----------+------------+------+------------+------+---------+
4 rows in set (0.00 sec)

如需更多資訊和範例,請參閱 第 28.3.15 節,「INFORMATION_SCHEMA FILES 表格」

隱含儲存在磁碟上的欄位的索引。對於剛才範例中定義的表格 dt_1,只有 dobjoined 欄位儲存在磁碟上。這是因為 idlast_namefirst_name 欄位上有索引,因此屬於這些欄位的資料會儲存在 RAM 中。只有未索引的欄位可以保存在磁碟上;索引和索引欄位資料會繼續儲存在記憶體中。在您設計磁碟資料表格時,必須記住索引的使用與 RAM 保留之間的權衡。

您無法將索引新增至已明確宣告為 STORAGE DISK 的欄位,除非先將其儲存類型變更為 MEMORY;任何嘗試這樣做的操作都會失敗並顯示錯誤。可以對隱含使用磁碟儲存的欄位建立索引;執行此操作時,欄位的儲存類型會自動變更為 MEMORY。所謂的「隱含」是指其儲存類型未宣告,而是繼承自父表格的欄位。在下列 CREATE TABLE 陳述式中(使用先前定義的表空間 ts_1),欄位 c2c3 會隱含地使用磁碟儲存

mysql> CREATE TABLE ti (
    ->     c1 INT PRIMARY KEY,
    ->     c2 INT,
    ->     c3 INT,
    ->     c4 INT
    -> )
    ->     STORAGE DISK
    ->     TABLESPACE ts_1
    ->     ENGINE NDBCLUSTER;
Query OK, 0 rows affected (1.31 sec)

由於 c2c3c4 本身未宣告為 STORAGE DISK,因此可以對它們建立索引。在這裡,我們分別使用 CREATE INDEXALTER TABLE 將索引新增至 c2c3

mysql> CREATE INDEX i1 ON ti(c2);
Query OK, 0 rows affected (2.72 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE ti ADD INDEX i2(c3);
Query OK, 0 rows affected (0.92 sec)
Records: 0  Duplicates: 0  Warnings: 0

SHOW CREATE TABLE 確認已新增索引。

mysql> SHOW CREATE TABLE ti\G
*************************** 1. row ***************************
       Table: ti
Create Table: CREATE TABLE `ti` (
  `c1` int(11) NOT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  `c4` int(11) DEFAULT NULL,
  PRIMARY KEY (`c1`),
  KEY `i1` (`c2`),
  KEY `i2` (`c3`)
) /*!50100 TABLESPACE `ts_1` STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

您可以使用 ndb_desc 來查看,索引欄位(強調文字)現在使用記憶體內儲存而不是磁碟儲存

$> ./ndb_desc -d test t1
-- t1 --
Version: 33554433
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 4
Number of primary keys: 1
Length of frm data: 317
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 4
FragmentCount: 4
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options:
HashMap: DEFAULT-HASHMAP-3840-4
-- Attributes --
c1 Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c2 Int NULL AT=FIXED ST=MEMORY
c3 Int NULL AT=FIXED ST=MEMORY
c4 Int NULL AT=FIXED ST=DISK
-- Indexes --
PRIMARY KEY(c1) - UniqueHashIndex
i2(c3) - OrderedIndex
PRIMARY(c1) - OrderedIndex
i1(c2) - OrderedIndex

效能注意事項。如果將磁碟資料檔案保留在與資料節點檔案系統不同的實體磁碟上,則使用磁碟資料儲存的叢集效能將大幅提升。必須對叢集中的每個資料節點執行此操作,才能獲得任何明顯的好處。

您可以使用絕對和相對檔案系統路徑與 ADD UNDOFILEADD DATAFILE;相對路徑是根據資料節點的資料目錄計算的。

記錄檔群組、表空間和使用這些的任何磁碟資料表格都必須按特定順序建立。對於捨棄這些物件也是如此,但須遵守下列限制

  • 只要有任何表空間使用記錄檔群組,就無法捨棄該群組。

  • 只要表空間包含任何資料檔案,就無法捨棄該表空間。

  • 只要仍有任何使用表空間的表格,就無法從表空間捨棄任何資料檔案。

  • 無法捨棄與不同表空間相關聯建立的檔案,只能捨棄與該檔案建立的表空間相關聯建立的檔案。

例如,若要捨棄本節中迄今建立的所有物件,您可以使用下列陳述式

mysql> DROP TABLE dt_1;

mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_2.dat';

mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_1.dat';

mysql> DROP TABLESPACE ts_1;

mysql> DROP LOGFILE GROUP lg_1;

這些陳述式必須按照顯示的順序執行,但兩個 ALTER TABLESPACE ... DROP DATAFILE 陳述式可以按任一順序執行。

注意事項

較舊版本的 NDB Cluster 會在 ALTER TABLESPACE ... DROP DATAFILEDROP TABLESPACE 中使用 ENGINE 子句。在 NDB 8.4 及更高版本中,這兩種陳述式都不再支援此子句。