MySQL中ALTER LOGFILE GROUP 语句详解

在 MySQL 的 InnoDB 存储引擎中,ALTER LOGFILE GROUP 语句用于修改重做日志组(redo log group)的配置。重做日志是 InnoDB 用来保证事务持久性的一个关键组件,它们用于在系统崩溃后恢复数据。

InnoDB 支持多个重做日志组,每个组可以有多个重做日志文件。在大多数情况下,InnoDB 会自动管理这些日志文件,但在某些高级配置中,管理员可能需要手动干预。

ALTER LOGFILE GROUP 语句的基本语法如下:

ALTER LOGFILE GROUP logfile_group
    ADD 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_3
    ADD UNDOFILE 'undo_10.dat'
    INITIAL_SIZE=32M
    ENGINE=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 的主内存存储引擎。

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值