在 MySQL 的 InnoDB 存儲引擎中,ALTER LOGFILE GROUP
?語句用于修改重做日志組(redo log group)的配置。重做日志是 InnoDB 用來保證事務持久性的一個關鍵組件,它們用于在系統崩潰后恢復數據。
InnoDB 支持多個重做日志組,每個組可以有多個重做日志文件。在大多數情況下,InnoDB 會自動管理這些日志文件,但在某些高級配置中,管理員可能需要手動干預。
ALTER LOGFILE GROUP
?語句的基本語法如下:
ALTER LOGFILE GROUP logfile_groupADD UNDOFILE 'file_name'[INITIAL_SIZE [=] size][WAIT]ENGINE [=] engine_name
ALTER LOGFILE GROUP ... ADD UNDOFILE
?語句實際上是針對 InnoDB 的撤銷表空間(undo tablespace)而不是重做日志組的。在 MySQL 8.0 及之后的版本中,InnoDB 引入了獨立的撤銷表空間來替代早期的系統表空間(system tablespace)中的撤銷段(undo segments)。
ALTER LOGFILE GROUP ... ADD UNDOFILE
?語句允許您向現有的撤銷表空間組中添加一個新的撤銷文件(undo file)。但是,請注意,此語句是特定于撤銷表空間,而不是重做日志組。
注意:
NDB Cluster(Network DataBase Cluster)是 MySQL Cluster 的一部分,它是一個高度可用的、分布式的數據庫系統,旨在提供實時的、高吞吐量的數據訪問。在 NDB Cluster 中,Disk Data 對象(如表空間、撤銷日志文件、數據文件等)共享相同的命名空間,這意味著每個 Disk Data 對象都必須具有唯一的名稱。
具體來說,NDB Cluster 不允許具有相同名稱的不同類型的 Disk Data 對象存在。例如,您不能有一個名為 "my_data" 的表空間和另一個同樣名為 "my_data" 的撤銷日志文件,或者一個名為 "my_undo" 的撤銷日志文件和另一個名為 "my_undo" 的數據文件。這是為了確保在 NDB Cluster 內部可以準確地識別和引用每個 Disk Data 對象。
INITIAL_SIZE
?參數是用于設置 InnoDB 撤銷表空間或撤銷日志文件(undo log file,在某些上下文中)的初始大小的。如果未指定此參數,則撤銷文件的初始大小默認為 134217728 字節(即 128 MB)。
在指定?INITIAL_SIZE
?時,您可以在大小值后面跟隨一個單字母的縮寫來表示數量級,這與在?my.cnf
(或?my.ini
,取決于操作系統和 MySQL 版本)配置文件中使用的縮寫類似。常見的縮寫包括:
- M:表示兆字節(megabytes)
- G:表示吉字節(gigabytes)
在 32 位系統上,由于內存地址空間的限制,INITIAL_SIZE
?參數的最大值通常是 4294967296 字節,即 4 GB(因為 2^32 字節等于 4 GB,但實際的可用空間可能會因系統和其他因素而有所減少)。
對于?INITIAL_SIZE
?的最小值,官方文檔或相關 Bug 報告通常建議至少為 1048576 字節,即 1 MB。這是因為過小的初始大小可能會導致頻繁的文件擴展操作,這可能會影響性能。
注意:WAIT被解析,但在其他情況下被忽略。該關鍵字目前沒有任何效果,用于將來的擴展。
ENGINE
?子句是在定義或修改 NDB Cluster 相關的表或表組時使用的,用于指定所使用的存儲引擎。在 NDB Cluster 中,ENGINE
?子句是必需的,因為它決定了表或表組將使用哪種存儲引擎。
對于 NDB Cluster,目前接受的?engine_name
?值只有“NDBCLUSTER”和“NDB”。這兩個值實際上是等效的,都表示使用 NDB Cluster 存儲引擎。盡管“NDB”是一個較舊的名稱,但在 MySQL NDB Cluster 中,這兩個名稱都仍然有效,并且通常都可以使用。
下面是一個示例,假設日志文件組lg_3已經使用CREATE LOGFILE group創建:
ALTER LOGFILE GROUP lg_3ADD UNDOFILE 'undo_10.dat'INITIAL_SIZE=32MENGINE=NDBCLUSTER;
當您使用?ALTER LOGFILE GROUP
?語句并指定?ENGINE = NDBCLUSTER
(或者等效的?ENGINE = NDB
)時,您會在 NDB Cluster 的每個數據節點上創建一個撤銷日志文件(undo log file)。要驗證這些撤銷文件是否已創建并獲取有關它們的信息,您可以查詢 Information Schema 的?FILES
?表。
以下是一個示例查詢,展示了如何檢查 NDB Cluster 中的撤銷日志文件:
mysql> SELECT FILE_NAME, LOGFILE_GROUP_NUMBER, EXTRA-> FROM INFORMATION_SCHEMA.FILES-> WHERE LOGFILE_GROUP_NAME = 'lg_3';
+-------------+----------------------+----------------+
| FILE_NAME | LOGFILE_GROUP_NUMBER | EXTRA |
+-------------+----------------------+----------------+
| newdata.dat | 0 | CLUSTER_NODE=3 |
| newdata.dat | 0 | CLUSTER_NODE=4 |
| undo_10.dat | 11 | CLUSTER_NODE=3 |
| undo_10.dat | 11 | CLUSTER_NODE=4 |
+-------------+----------------------+----------------+
4 rows in set (0.01 sec)
在 NDB Cluster 中,UNDO_BUFFER_SIZE
?指定的內存是從全局內存池中分配的,這個全局內存池的大小由?SharedGlobalMemory
?數據節點配置參數的值確定。此外,InitialLogFileGroup
?數據節點配置參數的設置也可能為?UNDO_BUFFER_SIZE
?隱式指定一個默認值。
其中:
-
UNDO_BUFFER_SIZE:指定了用于存儲撤銷日志條目(這些條目在事務被回滾或用于 MVCC 操作時可能需要)的內存大小。這個值通常根據系統的工作負載和性能需求來設置。
-
SharedGlobalMemory:定義了 NDB Cluster 中所有節點共享的全局內存池的大小。這個內存池用于存儲各種數據結構和緩存,包括撤銷日志緩沖區。增加這個值可能會提高性能,但也會增加內存使用。
-
InitialLogFileGroup:通常用于定義日志文件組的初始大小和配置。在某些 NDB Cluster 版本和配置中,這個參數的設置可能會隱式地影響?
UNDO_BUFFER_SIZE
?的默認值,盡管這不是一個直接的關聯。具體的行為取決于 NDB Cluster 的版本和配置。
當調整這些參數時,需要確保全局內存池的大小足夠大,以容納所有必要的內存需求,包括撤銷日志緩沖區、數據緩存、索引緩存等。如果全局內存池太小,可能會導致性能下降或系統不穩定。
實際上,ALTER LOGFILE GROUP
?語句在 NDB Cluster 中主要與磁盤數據(Disk Data)存儲引擎相關,但需要注意的是,NDB Cluster 本身是一個內存數據庫集群,其主要數據存儲是在內存中完成的。然而,NDB Cluster 也支持將某些數據或日志存儲在磁盤上,以提高持久性和恢復能力。
在 NDB Cluster 中,當您使用磁盤數據表(Disk Data tables)時,這些表的數據實際上是在內存中處理的,但它們的某些部分(如數據和索引的鏡像)可以被配置為存儲在磁盤上。這些磁盤數據表使用了一種稱為?DiskData
?的存儲引擎,而不是 NDB Cluster 的主內存存儲引擎。