文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 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 參考手冊  /  ...  /  NDB Cluster 磁碟資料物件

25.6.11.1 NDB Cluster 磁碟資料物件

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

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

  • 資料檔案:儲存欄位資料。資料檔案直接指派給表空間。

  • 復原日誌檔:包含復原交易所需的復原資訊。指派給復原日誌檔群組。

  • 日誌檔群組:包含一個或多個復原日誌檔。指派給表空間。

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

復原日誌檔僅由磁碟資料表使用,記憶體中僅儲存的 NDB 表格不需要或不使用。

NDB Cluster 表空間和日誌檔群組不是以檔案形式實作的。

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

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

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

  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' 將復原日誌檔新增至日誌檔群組時,會在叢集中每個資料節點的 DataDir 內的 ndb_node_id_fs 目錄中建立名稱為 filename 的檔案,其中 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' 將資料檔案新增至表空間時,會在叢集中每個資料節點的 DataDir 內的 ndb_node_id_fs 目錄中建立名稱為 filename 的檔案,其中 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 DATAFILEENGINE 子句;對於任何其他 ALTER TABLESPACE 陳述式,都會拒絕 ENGINENDB 表空間的 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 TABLEc2c3 新增索引

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 陳述式可以按任何順序執行。