MySQL8-中文参考-四十二-

MySQL8 中文参考(四十二)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

译文:dev.mysql.com/doc/refman/8.0/en/ndb-restore-to-different-version.html

25.5.23.1 将 NDB 备份还原到不同版本的 NDB 集群

以下两个部分提供了有关将本机 NDB 备份还原到与备份所在版本不同的 NDB 集群版本的信息。

此外,您应该参考第 25.3.7 节,“升级和降级 NDB 集群”,了解尝试将 NDB 备份还原到运行不同版本 NDB 软件的集群时可能遇到的其他问题。

此外,建议查看 What is New in NDB Cluster 8.0 以及第 3.5 节,“MySQL 8.0 中的更改”,了解 NDB 8.0 与 NDB 集群以前版本之间的其他变化,这些变化可能与您的特定情况相关。

25.5.23.1.1 将 NDB 备份还原到较旧版本的 NDB 集群

当尝试将从较新版本的 NDB 集群中获取的备份还原到较旧版本时,可能会遇到问题,原因是使用了在较早版本中不存在的功能。以下列出了一些问题:

  • utf8mb4_ai_ci 字符集。 NDB 8.0 中默认使用utf8mb4_ai_ci字符集创建的表,在 NDB 7.6 及更早版本中不可用,因此无法被这些较早版本中的ndb_restore二进制文件读取。在这种情况下,必须修改任何使用utf8mb4_ai_ci的表,以便它们使用较旧版本支持的字符集进行备份前的操作。

  • 表元数据格式。 由于 MySQL 服务器和 NDB 处理表元数据的方式发生了变化,使用 NDB 8.0 中包含的 MySQL 服务器二进制文件创建或更改的表无法使用ndb_restore还原到 NDB 7.6 或更早版本的 NDB 集群。这些表使用.sdi文件,较旧版本的mysqld无法理解。

    一个在 NDB 8.0 中备份的表,该表在 NDB 7.6 或更早版本中创建,并且自升级到 NDB 8.0 以来未被修改,应该可以恢复到较旧版本的 NDB 集群。

    由于可以分别恢复元数据和表数据,因此在这种情况下,您可以使用mysqldump制作的转储文件恢复表模式,或者手动执行必要的CREATE TABLE语句,然后仅使用ndb_restore--restore-data选项导入表数据。

  • 多线程备份。 在 NDB 8.0 中进行的多线程备份可以通过以下两种方式之一还原到运行较早版本NDB的集群中:

    • 使用 NDB 8.0 中的ndb_restore二进制文件执行并行还原。参见第 25.5.23.3.1 节,“并行还原并行备份”。

    • 串行还原备份;在这种情况下,不需要较新版本的ndb_restore。请参见第 25.5.23.3.2 节,“串行还原并行备份”。

  • 加密备份。 在 NDB 8.0.22 及更高版本中创建的加密备份无法使用 NDB 8.0.21 或更早版本的ndb_restore进行还原。

  • NDB_STORED_USER 权限。 NDB_STORED_USER权限仅在 NDB 8.0 中受支持。

  • 数据节点的最大数量。 NDB Cluster 8.0 支持最多 144 个数据节点,而较早版本仅支持最多 48 个数据节点。有关此不兼容性引起问题的情况,请参见第 25.5.23.2.1 节,“还原到少于原始节点数”。

25.5.23.1.2 将 NDB 备份还原到较新版本的 NDB Cluster

一般来说,应该可以将使用 ndb_mgm 客户端的 START BACKUP 命令创建的备份从旧版本的 NDB 恢复到新版本,只要你使用新版本附带的 ndb_restore 二进制文件即可。(可能可以使用旧版本的 ndb_restore,但不建议这样做。)其他潜在问题列在这里:

  • 在从备份中恢复元数据时(--restore-meta 选项),ndb_restore 通常会尝试精确复制备份时的表模式。

    在 NDB 8.0 之前的版本中创建的表使用 .frm 文件存储它们的元数据。这些文件可以被 mysqld 在 NDB 8.0 中读取,mysqld 可以使用其中包含的信息来创建后续版本中 MySQL 数据字典使用的 .sdi 文件。

  • 在将旧备份恢复到新版本的 NDB 时,可能无法利用新功能,如 hashmap 分区、更多的 hashmap 桶、读取备份和不同的分区布局。因此,最好使用 mysqldumpmysql 客户端来恢复旧模式,这样 NDB 就可以利用新的模式功能。

  • 使用旧的时间类型且不支持小数秒(用于 MySQL 5.6.4 之前和 NDB 7.3.31 之前)的表无法使用 ndb_restore 恢复到 NDB 8.0。您可以使用 CHECK TABLE 检查这样的表,然后在 mysql 客户端中使用 REPAIR TABLE 必要时将其升级到新的时间列格式;这必须在进行备份之前完成。有关更多信息,请参见 Section 3.6, “Preparing Your Installation for Upgrade”。

    您还可以使用使用 mysqldump 创建的转储来恢复这样的表。

  • 在 NDB 7.6 及更早版本中创建的分布式授权表在 NDB 8.0 中不受支持。这些表可以恢复到 NDB 8.0 集群,但对访问控制没有影响。

译文:dev.mysql.com/doc/refman/8.0/en/ndb-restore-different-number-nodes.html

25.5.23.2 还原到不同数量的数据节点

可以将从 NDB 备份还原到具有不同数量数据节点的集群,与备份来源的原始集群数量不同。以下两个部分分别讨论了目标集群比备份源具有更少或更多数据节点的情况。

25.5.23.2.1 还原到比原始节点少的节点

您可以将备份还原到比原始数据节点少的集群,只要较大数量的节点是较小数量的节点的偶数倍。在以下示例中,我们使用在具有四个数据节点的集群上进行的备份还原到具有两个数据节点的集群。

  1. 原始集群的管理服务器位于主机host10上。原始集群有四个数据节点,节点 ID 和主机名如下所示,来自管理服务器的config.ini文件的摘录:

    [ndbd]
    NodeId=2
    HostName=host2
    
    [ndbd]
    NodeId=4
    HostName=host4
    
    [ndbd]
    NodeId=6
    HostName=host6
    
    [ndbd]
    NodeId=8
    HostName=host8
    

    我们假设每个数据节点最初都是使用ndbmtd") --ndb-connectstring=host10或等效方式启动的。

  2. 以正常方式执行备份。有关如何执行此操作的信息,请参见 Section 25.6.8.2, “Using The NDB Cluster Management Client to Create a Backup”。

  3. 每个数据节点备份创建的文件在这里列出,其中N是节点 ID,B是备份 ID。

    • BACKUP-*B*-0.*N*.Data

    • BACKUP-*B*.*N*.ctl

    • BACKUP-*B*.*N*.log

    这些文件位于每个数据节点的BackupDataDir``/BACKUP/BACKUP-*B*下,在本示例的其余部分中,我们假设备份 ID 为 1。

    将所有这些文件保存以备将来复制到新数据节点(可以通过ndb_restore在数据节点的本地文件系统上访问)。将它们全部复制到一个位置最简单;我们假设您已经这样做了。

  4. 目标集群的管理服务器位于主机host20上,目标集群有两个数据节点,节点 ID 和主机名如下所示,来自主机host20上的管理服务器config.ini文件:

    [ndbd]
    NodeId=3
    hostname=host3
    
    [ndbd]
    NodeId=5
    hostname=host5
    

    host3host5上的每个数据节点进程应该使用ndbmtd") -c host20 --initial或等效方式启动,以便新(目标)集群以干净的数据节点文件系统启动。

  5. 将两组不同的两个备份文件复制到目标数据节点中的每一个。例如,将原始集群中节点 2 和 4 的备份文件复制到目标集群中的节点 3。这些文件如下所示:

    • BACKUP-1-0.2.Data

    • BACKUP-1.2.ctl

    • BACKUP-1.2.log

    • BACKUP-1-0.4.Data

    • BACKUP-1.4.ctl

    • BACKUP-1.4.log

    然后将节点 6 和 8 的备份文件复制到节点 5;这些文件如下列表所示:

    • BACKUP-1-0.6.Data

    • BACKUP-1.6.ctl

    • BACKUP-1.6.log

    • BACKUP-1-0.8.Data

    • BACKUP-1.8.ctl

    • BACKUP-1.8.log

    在本示例的其余部分中,我们假设相应的备份文件已保存在节点 3 和 5 上的目录/BACKUP-1中。

  6. 在两个目标数据节点上,您必须从两组备份中恢复。首先,通过在host3上调用ndb_restore将节点 2 和 4 的备份还原到节点 3,如下所示:

    $> ndb_restore -c host20 --nodeid=2 --backupid=1 --restore-data --backup-path=/BACKUP-1
    
    $> ndb_restore -c host20 --nodeid=4 --backupid=1 --restore-data --backup-path=/BACKUP-1
    

    然后通过在host5上调用ndb_restore将节点 6 和 8 的备份还原到节点 5,如下所示:

    $> ndb_restore -c host20 --nodeid=6 --backupid=1 --restore-data --backup-path=/BACKUP-1
    
    $> ndb_restore -c host20 --nodeid=8 --backupid=1 --restore-data --backup-path=/BACKUP-1
    
25.5.23.2.2 恢复到比原始节点更多的节点

给定ndb_restore命令指定的节点 ID 是原始备份中的节点 ID,而不是要将其恢复到的数据节点的节点 ID。当使用本节描述的方法执行备份时,ndb_restore连接到管理服务器并获取正在将备份恢复到的集群中的数据节点列表。恢复的数据相应地分布,因此在执行备份时不需要知道或计算目标集群中的节点数。

注意

当更改每个节点组的 LCP 线程或 LQH 线程的总数时,应重新创建使用mysqldump创建的备份的模式。

  1. 创建数据备份。您可以通过从系统 shell 调用ndb_mgm客户端的START BACKUP命令来执行此操作,如下所示:

    $> ndb_mgm -e "START BACKUP 1"
    

    这假定所需的备份 ID 为 1。

  2. 创建模式备份。只有在更改每个节点组的 LCP 线程或 LQH 线程的总数时才需要执行此步骤。

    $> mysqldump --no-data --routines --events --triggers --databases > myschema.sql
    

    重要

    一旦使用ndb_mgm创建了NDB本地备份,您在创建模式备份之前不得进行任何模式更改,如果这样做。

  3. 将备份目录复制到新集群。例如,如果要恢复的备份具有 ID 1 和 BackupDataDir = /backups/node_*nodeid*,则此节点上备份的路径为 /backups/node_1/BACKUP/BACKUP-1。在此目录中有三个文件,列在此处:

    • BACKUP-1-0.1.Data

    • BACKUP-1.1.ctl

    • BACKUP-1.1.log

    您应该将整个目录复制到新节点。

    如果您需要创建模式文件,请将其复制到 SQL 节点上的位置,以便mysqld可以读取。

没有要求必须从特定节点或节点恢复备份。

要从刚刚创建的备份中恢复,请执行以下步骤:

  1. 恢复模式

    • 如果您使用mysqldump创建了单独的模式备份文件,请使用mysql客户端导入此文件,类似于以下内容:

      $> mysql < myschema.sql
      

      在导入模式文件时,您可能需要指定 --user--password 选项(可能还有其他选项),以便mysql客户端能够连接到 MySQL 服务器。

    • 如果您不需要创建模式文件,可以使用ndb_restore --restore-meta(简写为 -m)重新创建模式,类似于以下内容:

      $> ndb_restore --nodeid=1 --backupid=1 --restore-meta --backup-path=/backups/node_1/BACKUP/BACKUP-1
      

      ndb_restore 必须能够联系管理服务器;根据需要添加 --ndb-connectstring 选项以实现这一点。

  2. 恢复数据。这需要针对原始集群中的每个数据节点执行一次,每次使用该数据节点的节点 ID。假设原始有 4 个数据节点,则所需的命令集将类似于以下内容:

    ndb_restore --nodeid=1 --backupid=1 --restore-data --backup-path=/backups/node_1/BACKUP/BACKUP-1 --disable-indexes
    ndb_restore --nodeid=2 --backupid=1 --restore-data --backup-path=/backups/node_2/BACKUP/BACKUP-1 --disable-indexes
    ndb_restore --nodeid=3 --backupid=1 --restore-data --backup-path=/backups/node_3/BACKUP/BACKUP-1 --disable-indexes
    ndb_restore --nodeid=4 --backupid=1 --restore-data --backup-path=/backups/node_4/BACKUP/BACKUP-1 --disable-indexes
    

    这些可以并行运行。

    请务必根据需要添加 --ndb-connectstring 选项。

  3. 重建索引。这些索引已被禁用,因为在刚刚显示的命令中使用了 --disable-indexes 选项。重新创建索引可以避免由于恢复在所有点上不一致而导致的错误。重建索引在某些情况下还可以提高性能。要重建索引,请在单个节点上执行以下命令一次:

    $> ndb_restore --nodeid=1 --backupid=1 --backup-path=/backups/node_1/BACKUP/BACKUP-1 --rebuild-indexes
    

    正如之前提到的,您可能需要添加--ndb-connectstring选项,以便ndb_restore可以联系管理服务器。

原文:dev.mysql.com/doc/refman/8.0/en/ndb-restore-parallel-data-node-backup.html

25.5.23.3 从并行进行的备份中恢复

NDB Cluster 8.0 支持在每个数据节点上使用ndbmtd进行并行备份,具有多个 LDMs(参见第 25.6.8.5 节,“使用并行数据节点进行 NDB 备份”)。接下来的两节描述了如何恢复以这种方式进行的备份。

25.5.23.3.1 并行恢复并行备份

并行恢复并行备份需要来自 NDB 8.0 发行版的ndb_restore二进制文件。该过程与在ndb_restore程序描述下的一般用法部分中概述的过程没有实质性区别,并且包括执行两次ndb_restore,类似于以下所示:

$> ndb_restore -n 1 -b 1 -m --backup-path=*path/to/backup_dir*/BACKUP/BACKUP-*backup_id*
$> ndb_restore -n 1 -b 1 -r --backup-path=*path/to/backup_dir*/BACKUP/BACKUP-*backup_id*

backup_id是要恢复的备份的 ID。在一般情况下,不需要额外的特殊参数;ndb_restore始终检查由--backup-path选项指示的目录下是否存在并行子目录,并恢复元数据(串行)然后表数据(并行)。

25.5.23.3.2 串行恢复并行备份

可以以串行方式恢复在数据节点上使用并行方式创建的备份。为此,请调用ndb_restore,并使用--backup-path指向每个 LDM 在主备份目录下创建的子目录,首先恢复任何一个子目录以恢复元数据(由于每个子目录包含元数据的完整副本,因此无论选择哪一个都可以),然后依次恢复每个子目录中的数据。假设我们想要恢复备份 ID 为 100 的备份,该备份使用四个 LDMs,并且BackupDataDir/opt。在这种情况下,我们可以像这样调用ndb_restore来恢复元数据:

$> ndb_restore -n 1 -b 1 -m --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-1-OF-4

要恢复表数据,请依次执行ndb_restore 四次,每次使用一个子目录,如下所示:

$> ndb_restore -n 1 -b 1 -r --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-1-OF-4
$> ndb_restore -n 1 -b 1 -r --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-2-OF-4
$> ndb_restore -n 1 -b 1 -r --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-3-OF-4
$> ndb_restore -n 1 -b 1 -r --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-4-OF-4

您可以使用相同的技术将并行备份恢复到不支持并行备份的较旧版本的 NDB 集群(7.6 或更早版本),使用较旧版本 NDB 集群软件提供的ndb_restore二进制文件。

25.5.24 ndb_secretsfile_reader — 从加密的 NDB 数据文件中获取密钥信息

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-programs-ndb-secretsfile-reader.html

ndb_secretsfile_readerNDB 加密秘密文件中获取加密密钥,给定密码。

用法

ndb_secretsfile_reader *options* *file*

选项 必须包括 --filesystem-password--filesystem-password-from-stdin 之一,并且必须提供加密密码,如下所示:

> ndb_secretsfile_reader --filesystem-password=54kl14 ndb_5_fs/D1/NDBCNTR/S0.sysfile
ndb_secretsfile_reader: [Warning] Using a password on the command line interface can be insecure.
cac256e18b2ddf6b5ef82d99a72f18e864b78453cc7fa40bfaf0c40b91122d18

可与 ndb_secretsfile_reader 一起使用的其他选项显示在下表中。表后面有附加描述。

表 25.45 与程序 ndb_secretsfile_reader 一起使用的命令行选项

格式 描述 添加、弃用或移除
--defaults-extra-file=path 在读取全局文件后读取给定文件 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-file=path 仅从给定文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-group-suffix=string 还读取具有 concat(group, suffix) 的组 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--filesystem-password=password 节点文件系统加密的密码;可以从 stdin、tty 或 my.cnf 文件传递 添加: 8.0.31
--filesystem-password-from-stdin={TRUE&#124;FALSE} 从 stdin 获取加密密码 添加: 8.0.31
--help,-? 显示帮助文本并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--login-path=path 从登录文件中读取���定路径 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--no-defaults 不从登录文件以外的任何选项文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--print-defaults 打印程序参数列表并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--usage,-? 显示帮助文本并退出;与 --help 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--version,-V 显示版本信息并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
格式 描述 添加、弃用或移除
  • --defaults-extra-file

    命令行格式 --defaults-extra-file=path
    类型 字符串
    默认值 [none]

    在读取全局文件后读取给定文件。

  • --defaults-file

    命令行格式 --defaults-file=path
    类型 字符串
    默认值 [none]

    仅从给定文件中读取默认选项。

  • --defaults-group-suffix

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [none]

    还读取带有 concat(group, suffix) 的组。

  • --filesystem-password

    命令行格式 --filesystem-password=password
    引入版本 8.0.31

    通过 stdinttymy.cnf 文件将文件系统加密和解密密码传递给ndb_secretsfile_reader

  • --filesystem-password-from-stdin

    命令行格式 --filesystem-password-from-stdin={TRUE&#124;FALSE}
    引入版本 8.0.31

    stdin(仅限)向 ndb_secretsfile_reader 传递文件系统加密和解密密码。

  • --help

    命令行格式 --help

    显示帮助文本并退出。

  • --login-path

    命令行格式 --login-path=path
    类型 字符串
    默认值 [none]

    从登录文件中读取给定路径。

  • --no-defaults

    命令行格式 --no-defaults

    不要从除登录文件之外的任何选项文件中读取默认选项。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序参数列表并退出。

  • --usage

    命令行格式 --usage

    显示帮助文本并退出;与 --help 相同。

  • --version

    命令行格式 --version

    显示版本信息并退出。

ndb_secretsfile_reader是在 NDB 8.0.31 中添加的。

25.5.25 ndb_select_all — 从 NDB 表中打印行

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-programs-ndb-select-all.html

ndb_select_all 将所有行从 NDB 表打印到 stdout

用法

ndb_select_all -c *connection_string* *tbl_name* -d *db_name* [> *file_name*]

可与 ndb_select_all 一起使用的选项显示��下表中。表后面还有附加描述。

表 25.46 与程序 ndb_select_all 一起使用的命令行选项

格式 描述 添加、弃用或移除
--character-sets-dir=path 包含字符集的目录 移除:8.0.31
--connect-retries=# 放弃之前重试连接的次数 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--connect-retry-delay=# 重试联系管理服务器之间等待的秒数 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--connect-string=connection_string,-c connection_string 与 --ndb-connectstring 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--core-file 在错误时写入核心文件;用于调试 移除:8.0.31
--database=name,-d name 表所在数据库的名称 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-extra-file=path 读取全局文件后读取给定文件 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-file=path 仅从给定文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-group-suffix=string 也读取 concat(group, suffix) 组 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--delimiter=char,-D char 设置列分隔符 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--descending,-z 按降序对结果集进行排序(需要--order) (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--disk 打印磁盘引用(仅对具有未索引列的磁盘数据表有用) (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--gci 在输出中包含 GCI (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--gci64 在输出中包含 GCI 和行时代 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
[--header[=value]](mysql-cluster-programs-ndb-select-all.html#option_ndb_select_all_header),-h 打印标题(设置为 0 或 FALSE 以禁用输出中的标题) (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--lock=#,-l # 锁类型 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--login-path=path 从登录文件中读取给定路径 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--help,-? 显示帮助文本并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-connectstring=connection_string,-c connection_string 设置连接到 ndb_mgmd 的连接字符串。语法:"[nodeid=id;][host=]hostname[:port]"。覆盖 NDB_CONNECTSTRING 和 my.cnf 中的条目 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-mgmd-host=connection_string,-c connection_string 与--ndb-connectstring 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-nodeid=# 为此节点设置节点 ID,覆盖任何由 --ndb-connectstring 设置的 ID (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--ndb-optimized-node-selection 启用用于事务节点选择的优化。默认启用;使用 --skip-ndb-optimized-node-selection 禁用 移除: 8.0.31
--no-defaults 不从除登录文件之外的任何选项文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--nodata 不打印表列数据 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--order=index,-o index 根据具有此名称的索引对结果集进行排序 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--parallelism=#,-p # 并行度 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--print-defaults 打印程序参数列表并退出 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--rowid 打印行 ID (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--tupscan,-t 按照 tup 顺序扫描 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--usage,-? 显示帮助文本并退出;与 --help 相同 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--useHexFormat,-x 以十六进制格式输出数字 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--version,-V 显示版本信息并退出 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
格式 描述 添加、弃用或移除
  • --character-sets-dir

    命令行格式 --character-sets-dir=path
    移除 8.0.31

    包含字符集的目录。

  • --connect-retries

    命令行格式 --connect-retries=#
    类型 整数
    默认值 12
    最小值 0
    最大值 12

    放弃之前重试连接的次数。

  • --connect-retry-delay

    命令行格式 --connect-retry-delay=#
    类型 整数
    默认值 5
    最小值 0
    最大值 5

    尝试联系管理服务器之间等待的秒数。

  • --connect-string

    命令行格式 --connect-string=connection_string
    类型 字符串
    默认值 [none]

    --ndb-connectstring相同。

  • --core-file

    命令行格式 --core-file
    移除 8.0.31

    在错误时写入核心文件;用于调试。

  • --database=*dbname*, -d dbname

    表所在的数据库名称。默认值为TEST_DB

  • --descending, -z

    将输出按降序排序。此选项只能与-o (--order) 选项一起使用。

  • --defaults-extra-file

    命令行格式 --defaults-extra-file=path
    类型 字符串
    默认值 [none]

    在读取全局文件后读取给定文件。

  • --defaults-file

    命令行格式 --defaults-file=path
    类型 字符串
    默认值 [none]

    仅从给定文件中读取默认选项。

  • --defaults-group-suffix

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [none]

    还可以读取使用 concat(group, suffix)的组。

  • --delimiter=*character*, -D *character*

    导致character被用作列分隔符。只有表数据列才会被此分隔符分隔。

    默认分隔符是制表符。

  • --disk

    向输出中添加一个磁盘引用列。该列仅对具有非索引列的磁盘数据表非空。

  • --gci

    向输出中添加一个GCI列,显示每行最后更新时的全局检查点。有关检查点的更多信息,请参见第 25.2 节,“NDB 集群概述”和第 25.6.3.2 节,“NDB 集群日志事件”。

  • --gci64

    向输出中添加一个ROW$GCI64列,显示每行最后更新时的全局检查点,以及此更新发生的时代编号。

  • --help

    命令行格式 --help

    显示帮助文本并退出。

  • --lock=*lock_type*, -l *lock_type*

    在读取表时使用锁定。lock_type 的可能值为:

    • 0: 读取锁定

    • 1: 读取锁定并保持

    • 2: 独占读取锁定

    此选项没有默认值。

  • --login-path

    命令行格式 --login-path=path
    类型 字符串
    默认值 [none]

    从登录文件中读取给定路径。

  • --header=FALSE

    从输出中排除列标题。

  • --nodata

    导致任何表数据被省略。

  • --ndb-connectstring

    命令行格式 --ndb-connectstring=connection_string
    类型 字符串
    默认值 [none]

    设置用于连接到 ndb_mgmd 的连接字符串。语法:"[nodeid=id;][host=]hostname[:port]"。覆盖 NDB_CONNECTSTRING 和 my.cnf 中的条目。

  • --ndb-mgmd-host

    命令行格式 --ndb-mgmd-host=connection_string
    类型 字符串
    默认值 [none]

    --ndb-connectstring相同。

  • --ndb-nodeid

    命令行格式 --ndb-nodeid=#
    类型 整数
    默认值 [none]

    设置此节点的节点 ID,覆盖由--ndb-connectstring设置的任何 ID。

  • --ndb-optimized-node-selection

    命令行格式 --ndb-optimized-node-selection
    已移除 8.0.31

    启用用于事务节点选择的优化。默认启用;使用--skip-ndb-optimized-node-selection来禁用。

  • --no-defaults

    命令行格式 --no-defaults

    不要从登录文件以外的任何选项文件中读取默认选项。

  • --order=*index_name*, -o *index_name*

    根据名为index_name的索引对输出进行排序。

    注意

    这是一个索引的名称,而不是列的名称;在创建时必须显式命名索引。

  • parallelism=*#*, -p #

    指定并行度。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序参数列表并退出。

  • --rowid

    添加一个ROWID列,提供有关存储行的片段的信息。

  • --tupscan, -t

    按元组的顺序扫描表。

  • --usage

    命令行格式 --usage

    显示帮助文本并退出;与--help相同。

  • --useHexFormat -x

    导致所有数字值以十六进制格式显示。这不会影响包含在字符串或日期时间值中的数字的输出。

  • --version

    命令行格式 --version

    显示版本信息并退出。

示例输出

来自 MySQL SELECT 语句的输出:

mysql> SELECT * FROM ctest1.fish;
+----+-----------+
| id | name      |
+----+-----------+
|  3 | shark     |
|  6 | puffer    |
|  2 | tuna      |
|  4 | manta ray |
|  5 | grouper   |
|  1 | guppy     |
+----+-----------+
6 rows in set (0.04 sec)

与等效调用ndb_select_all的输出:

$> ./ndb_select_all -c localhost fish -d ctest1
id      name
3       [shark]
6       [puffer]
2       [tuna]
4       [manta ray]
5       [grouper]
1       [guppy]
6 rows returned

所有字符串值在ndb_select_all的输出中都用方括号([...])括起来。另一个示例,请考虑在此处创建和填充的表:

CREATE TABLE dogs (
    id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(25) NOT NULL,
    breed VARCHAR(50) NOT NULL,
    PRIMARY KEY pk (id),
    KEY ix (name)
)
TABLESPACE ts STORAGE DISK
ENGINE=NDBCLUSTER;

INSERT INTO dogs VALUES
    ('', 'Lassie', 'collie'),
    ('', 'Scooby-Doo', 'Great Dane'),
    ('', 'Rin-Tin-Tin', 'Alsatian'),
    ('', 'Rosscoe', 'Mutt');

这演示了几个额外的ndb_select_all选项的使用:

$> ./ndb_select_all -d ctest1 dogs -o ix -z --gci --disk
GCI     id name          breed        DISK_REF
834461  2  [Scooby-Doo]  [Great Dane] [ m_file_no: 0 m_page: 98 m_page_idx: 0 ]
834878  4  [Rosscoe]     [Mutt]       [ m_file_no: 0 m_page: 98 m_page_idx: 16 ]
834463  3  [Rin-Tin-Tin] [Alsatian]   [ m_file_no: 0 m_page: 34 m_page_idx: 0 ]
835657  1  [Lassie]      [Collie]     [ m_file_no: 0 m_page: 66 m_page_idx: 0 ]
4 rows returned

25.5.26 ndb_select_count — 打印 NDB 表的行数

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-programs-ndb-select-count.html

ndb_select_count 打印一个或多个 NDB 表中的行数。对于单个表,结果等同于使用 MySQL 语句 SELECT COUNT(*) FROM *tbl_name* 获得的结果。

用法

ndb_select_count [-c *connection_string*] -d*db_name* *tbl_name*[, *tbl_name2*[, ...]]

可与ndb_select_count一起使用的选项如下表所示。表后面会有额外的描述。

表 25.47 与程序 ndb_select_count 一起使用的命令行选项

格式 描述 添加、弃用或移除
--character-sets-dir=path 包含字符集的目录 移除:8.0.31
--connect-retries=# 放弃之前重试连接的次数 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--connect-retry-delay=# 尝试联系管理服务器之间等待的秒数 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--connect-string=connection_string,-c connection_string 与 --ndb-connectstring 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--core-file 在错误时写入核心文件;用于调试 移除:8.0.31
--database=name,-d name 表所在数据库的名称 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-extra-file=path 在全局文件读取后读取给定文件 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-file=path 仅从给定文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-group-suffix=string 也读取带有 concat(group, suffix) 的组 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--help,-? 显示帮助文本并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--lock=#,-l # 锁类型 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--login-path=path 从登录文件中读取给定路径 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-connectstring=connection_string,-c connection_string 设置连接到 ndb_mgmd 的连接字符串。语法: "[nodeid=id;][host=]hostname[:port]"。覆盖 NDB_CONNECTSTRING 和 my.cnf 中的条目 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-mgmd-host=connection_string,-c connection_string 与 --ndb-connectstring 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-nodeid=# 为此节点设置节点 ID,覆盖由 --ndb-connectstring 设置的任何 ID (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-optimized-node-selection 启用用于事务节点选择的优化。默认启用;使用 --skip-ndb-optimized-node-selection 来禁用 已移除: 8.0.31
--no-defaults 不从登录文件以外的任何选项文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--parallelism=#,-p # 并行度 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--print-defaults 打印程序参数列表并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--usage,-? 显示帮助文本并退出;与 --help 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--version,-V 显示版本信息并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
格式 描述 添加、弃用或移除
  • --character-sets-dir

    命令行格式 --character-sets-dir=path
    移除 8.0.31

    包含字符集的目录。

  • --connect-retries

    命令行格式 --connect-retries=#
    类型 整数
    默认值 12
    最小值 0
    最大值 12

    在放弃之前重试连接的次数。

  • --connect-retry-delay

    命令行格式 --connect-retry-delay=#
    类型 整数
    默认值 5
    最小值 0
    最大值 5

    尝试联系管理服务器之间等待的秒数。

  • --connect-string

    命令行格式 --connect-string=connection_string
    类型 字符串
    默认值 [none]

    --ndb-connectstring 相同。

  • --core-file

    命令行格式 --core-file
    移除 8.0.31

    在错误时写入核心文件;用于调试。

  • --defaults-file

    命令行格式 --defaults-file=path
    类型 字符串
    默认值 [none]

    仅从给定文件中读取默认选项。

  • --defaults-extra-file

    命令行格式 --defaults-extra-file=path
    类型 字符串
    默认值 [none]

    在全局文件读取后读取给定文件。

  • --defaults-group-suffix

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [none]

    同时读取带有 concat(group, suffix) 的组。

  • --login-path

    命令行格式 --login-path=path
    类型 字符串
    默认值 [none]

    从登录文件中读取给定路径。

  • --help

    命令行格式 --help

    显示帮助文本并退出。

  • --ndb-connectstring

    命令行格式 --ndb-connectstring=connection_string
    类型 字符串
    默认值 [none]

    设置连接到 ndb_mgmd 的连接字符串。语法:"[nodeid=id;][host=]hostname[:port]"。覆盖 NDB_CONNECTSTRING 和 my.cnf 中的条目。

  • --ndb-mgmd-host

    命令行格式 --ndb-mgmd-host=connection_string
    类型 字符串
    默认值 [none]

    --ndb-connectstring相同。

  • --ndb-optimized-node-selection

    命令行格式 --ndb-optimized-node-selection
    已移除 8.0.31

    启用优化以选择事务节点。默认启用;使用--skip-ndb-optimized-node-selection来禁用。

  • --ndb-nodeid

    命令行格式 --ndb-nodeid=#
    类型 整数
    默认值 [none]

    为此节点设置节点 ID,覆盖由--ndb-connectstring设置的任何 ID。

  • --no-defaults

    命令行格式 --no-defaults

    不要从除登录文件以外的任何选项文件中读取默认选项。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序参数列表并退出。

  • --usage

    命令行格式 --usage

    显示帮助文本并退出;与--help相同。

  • --version

    命令行格式 --version

    显示版本信息并退出。

通过在调用此命令时用空格分隔的表名列表,可以从同一数据库中获取多个表的行数,如示例输出所示。

示例输出

$> ./ndb_select_count -c localhost -d ctest1 fish dogs
6 records in table fish
4 records in table dogs

25.5.27 ndb_show_tables — 显示 NDB 表的列表

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-programs-ndb-show-tables.html

ndb_show_tables 显示集群中所有NDB数据库对象的列表。默认情况下,这不仅包括用户创建的表和NDB系统表,还包括NDB特定的索引、内部触发器和 NDB 集群磁盘数据对象。

可与 ndb_show_tables 一起使用的选项显示在下表中。表后面是附加描述。

表 25.48 与程序 ndb_show_tables 一起使用的命令行选项

格式 描述 添加、弃用或移除
--character-sets-dir=path 包含字符集的目录 移除:8.0.31
--connect-retries=# 放弃之前重试连接的次数 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--connect-retry-delay=# 尝试联系管理服务器之间等待的秒数 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--connect-string=connection_string,-c connection_string 与 --ndb-connectstring 相同 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--core-file 在错误时写入核心文件;用于调试 移除:8.0.31
--database=name,-d name 指定表所在的数据库;数据库名称后必须跟表名 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--defaults-extra-file=path 在读取全局文件后读取给定文件 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--defaults-file=path 仅从给定文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-group-suffix=string 还读取具有 concat(group, suffix) 的组 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--login-path=path 从登录文件中读取给定路径 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--loops=#,-l # 重复输出的次数 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--help,-? 显示帮助文本并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-connectstring=connection_string,-c connection_string 设置连接到 ndb_mgmd 的连接字符串。语法:“[nodeid=id;][host=]hostname[:port]”。覆盖 NDB_CONNECTSTRING 和 my.cnf 中的条目 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-mgmd-host=connection_string,-c connection_string 与 --ndb-connectstring 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-nodeid=# 设置此节点的节点 ID,覆盖 --ndb-connectstring 设置的任何 ID (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-optimized-node-selection 启用用于事务节点选择的优化。默认情况下启用;使用 --skip-ndb-optimized-node-selection 来禁用 已移除: 8.0.31
--no-defaults 不从登录文件以外的任何选项文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--parsable,-p 返回适用于 MySQL LOAD DATA 语句的输出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--print-defaults 打印程序参数列表并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--show-temp-status 显示表临时标志 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--type=#,-t # 限制输出到此类型的对象 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--unqualified,-u 不限定表名 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--usage,-? 显示帮助文本并退出;与 --help 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--version,-V 显示版本信息并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
格式 描述 添加、弃用或移除

使用

ndb_show_tables [-c *connection_string*]
  • --character-sets-dir

    命令行格式 --character-sets-dir=path
    已移除 8.0.31

    包含字符集的目录。

  • --connect-retries

    命令行格式 --connect-retries=#
    类型 整数
    默认值 12
    最小值 0
    最大值 12

    在放弃之前重试连接的次数。

  • --connect-retry-delay

    命令行格式 --connect-retry-delay=#
    类型 整数
    默认值 5
    最小值 0
    最大值 5

    尝试联系管理服务器之间等待的秒数。

  • --connect-string

    命令行格式 --connect-string=connection_string
    类型 字符串
    默认值 [无]

    --ndb-connectstring相同。

  • --core-file

    命令行格式 --core-file
    已移除 8.0.31

    在错误时写入核心文件;用于调试。

  • --database, -d

    指定所找到所需表的数据库的名称。如果给定此选项,则表的名称必须跟在数据库名称后面。

    如果未指定此选项,并且TEST_DB数据库中找不到任何表,则ndb_show_tables会发出警告。

  • --defaults-extra-file

    命令行格式 --defaults-extra-file=path
    类型 字符串
    默认值 [无]

    在读取全局文件后读取给定文件。

  • --defaults-file

    命令行格式 --defaults-file=path
    类型 字符串
    默认值 [无]

    仅从给定文件中读取默认选项。

  • --defaults-group-suffix

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [无]

    还读取具有 concat(group, suffix)的组。

  • --help

    命令行格式 --help

    显示帮助文本并退出。

  • --login-path

    命令行格式 --login-path=path
    类型 字符串
    默认值 [无]

    从登录文件中读取给定路径。

  • --loops, -l

    指定实用程序应执行的次数。当未指定此选项时,此值为 1,但如果使用该选项,则必须为其提供整数参数。

  • --ndb-connectstring

    命令行格式 --ndb-connectstring=connection_string
    类型 字符串
    默认值 [无]

    设置用于连接到 ndb_mgmd 的连接字符串。语法:"[nodeid=id;][host=]hostname[:port]"。覆盖 NDB_CONNECTSTRING 和 my.cnf 中的条目。

  • --ndb-mgmd-host

    命令行格式 --ndb-mgmd-host=connection_string
    类型 字符串
    默认值 [无]

    --ndb-connectstring相同。

  • --ndb-nodeid

    命令行格式 --ndb-nodeid=#
    类型 整数
    默认值 [无]

    为此节点设置节点 ID,覆盖--ndb-connectstring设置的任何 ID。

  • --ndb-optimized-node-selection

    命令行格式 --ndb-optimized-node-selection
    已移除 8.0.31

    启用用于事务节点选择的优化。默认情况下启用;使用--skip-ndb-optimized-node-selection来禁用。

  • --no-defaults

    命令行格式 --no-defaults

    不要从除登录文件以外的任何选项文件中读取默认选项。

  • --parsable, -p

    使用此选项会使输出格式适合与LOAD DATA一起使用。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序参数列表并退出。

  • --show-temp-status

    如果指定,将显示临时表。

  • --type, -t

    可用于将输出限制为此处显示的整数类型代码指定的一种对象类型:

    • 1: 系统表

    • 2: 用户创建的表

    • 3: 唯一哈希索引

    任何其他值会导致列出所有NDB数据库对象(默认)。

  • --unqualified, -u

    如果指定,将显示未经限定的对象名称。

  • --usage

    命令行格式 --usage

    显示帮助文本并退出;与--help相同。

  • --version

    命令行格式 --version

    显示版本信息并退出。

注意

只有用户创建的 NDB Cluster 表可以从 MySQL 访问;系统表如SYSTAB_0mysqld不可见。但是,您可以使用NDB API 应用程序(如ndb_select_all)来检查系统表的内容(请参阅 Section 25.5.25, “ndb_select_all — Print Rows from an NDB Table”)。

在 NDB 8.0.20 之前,该程序在运行完成时打印NDBT_ProgramExit - *status*,因为不必要地依赖于NDBT测试库。已删除此依赖项,消除了多余的输出。

25.5.28 ndb_size.pl — NDBCLUSTER 大小需求估算器

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-programs-ndb-size-pl.html

这是一个 Perl 脚本,可用于估算如果将 MySQL 数据库转换为使用NDBCLUSTER存储引擎所需的空间量。与本节讨论的其他实用程序不同,它不需要访问 NDB 集群(实际上,它没有理由这样做)。但是,它确实需要访问要测试的数据库所在的 MySQL 服务器。

要求

  • 运行中的 MySQL 服务器。服务器实例不必提供对 NDB 集群的支持。

  • 需要安装 Perl。

  • DBI 模块,如果它不是您的 Perl 安装的一部分,可以从 CPAN 获取。(许多 Linux 和其他操作系统发行版为此库提供了自己的软件包。)

  • 具有必要权限的 MySQL 用户帐户。如果您不希望使用现有帐户,则使用 GRANT USAGE ON *db_name*.*—其中 db_name 是要检查的数据库的名称—对于此目的已经足够。

ndb_size.pl 也可以在 MySQL 源代码中的 storage/ndb/tools 中找到。

可与ndb_size.pl一起使用的选项显示在以下表中。表后面会有额外的描述。

表 25.49 与程序 ndb_size.pl 一起使用的命令行选项

格式 描述 已添加、已弃用或已移除
--database=string 要检查的数据库或数据库;逗号分隔的列表;默认为 ALL(使用在服务器上找到的所有数据库) (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--hostname=string 指定主机和可选端口的主机[:端口]格式 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--socket=path 指定要连接的套接字 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--user=string 指定 MySQL 用户名 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--password=password 指定 MySQL 用户密码 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--format=string 设置输出格式(文本或 HTML) (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--excludetables=list 跳过逗号分隔列表中的任何表 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--excludedbs=list 跳过逗号分隔列表中的任何数据库 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--savequeries=path 将数据库中的所有查询保存到指定文件中 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--loadqueries=path 从指定文件加载所有查询;不连接到数据库 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--real_table_name=string 指定处理唯一索引大小计算的表 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
格式 描述 添加、弃用或删除

用法

perl ndb_size.pl [--database={*db_name*|ALL}] [--hostname=*host*[:*port*]] [--socket=*socket*] \
      [--user=*user*] [--password=*password*]  \
      [--help|-h] [--format={html|text}] \
      [--loadqueries=*file_name*] [--savequeries=*file_name*]

默认情况下,此实用程序尝试分析服务器上的所有数据库。您可以使用--database选项指定单个数据库;使用ALL作为数据库名称可以明确指定默认行为。您还可以使用逗号分隔的数据库名称列表使用--excludedbs选项排除一个或多个数据库。类似地,您可以通过在可选的--excludetables选项后列出其名称(用逗号分隔)来跳过特定表。可以使用--hostname指定主机名;默认值为localhost。除了主机,还可以使用host:port格式为--hostname的值指定端口。默认端口号为 3306。必要时,还可以指定套接字;默认值为/var/lib/mysql.sock。可以使用相应的选项指定 MySQL 用户名和密码。还可以使用--format选项控制输出的格式;可以使用htmltext中的任一值,text为默认值。这里展示了文本输出的示例:

$> ndb_size.pl --database=test --socket=/tmp/mysql.sock
ndb_size.pl report for database: 'test' (1 tables)
--------------------------------------------------
Connected to: DBI:mysql:host=localhost;mysql_socket=/tmp/mysql.sock

Including information for versions: 4.1, 5.0, 5.1

test.t1
-------

DataMemory for Columns (* means varsized DataMemory):
         Column Name            Type  Varsized   Key  4.1  5.0   5.1
     HIDDEN_NDB_PKEY          bigint             PRI    8    8     8
                  c2     varchar(50)         Y         52   52    4*
                  c1         int(11)                    4    4     4
                                                       --   --    --
Fixed Size Columns DM/Row                              64   64    12
   Varsize Columns DM/Row                               0    0     4

DataMemory for Indexes:
   Index Name                 Type        4.1        5.0        5.1
      PRIMARY                BTREE         16         16         16
                                           --         --         --
       Total Index DM/Row                  16         16         16

IndexMemory for Indexes:
               Index Name        4.1        5.0        5.1
                  PRIMARY         33         16         16
                                  --         --         --
           Indexes IM/Row         33         16         16

Summary (for THIS table):
                                 4.1        5.0        5.1
    Fixed Overhead DM/Row         12         12         16
           NULL Bytes/Row          4          4          4
           DataMemory/Row         96         96         48
                    (Includes overhead, bitmap and indexes)

  Varsize Overhead DM/Row          0          0          8
   Varsize NULL Bytes/Row          0          0          4
       Avg Varside DM/Row          0          0         16

                 No. Rows          0          0          0

        Rows/32kb DM Page        340        340        680
Fixedsize DataMemory (KB)          0          0          0

Rows/32kb Varsize DM Page          0          0       2040
  Varsize DataMemory (KB)          0          0          0

         Rows/8kb IM Page        248        512        512
         IndexMemory (KB)          0          0          0

Parameter Minimum Requirements
------------------------------
* indicates greater than default

                Parameter     Default        4.1         5.0         5.1
          DataMemory (KB)       81920          0           0           0
       NoOfOrderedIndexes         128          1           1           1
               NoOfTables         128          1           1           1
         IndexMemory (KB)       18432          0           0           0
    NoOfUniqueHashIndexes          64          0           0           0
           NoOfAttributes        1000          3           3           3
             NoOfTriggers         768          5           5           5

为了调试目的,可以从指定文件中读取此脚本运行的 Perl 数组包含的查询,并使用--savequeries将其保存到文件中;可以使用--loadqueries指定包含在脚本执行期间读取的数组的文件。这两个选项都没有默认值。

要以 HTML 格式生成输出,请使用--format选项并将输出重定向到文件,如下所示:

$> ndb_size.pl --database=test --socket=/tmp/mysql.sock --format=html > ndb_size.html

(如果没有重定向,则输出将发送到stdout。)

此脚本的输出包括以下信息:

  • 为了容纳分析的表所需的DataMemoryIndexMemoryMaxNoOfTablesMaxNoOfAttributesMaxNoOfOrderedIndexesMaxNoOfTriggers配置参数的最小值。

  • 数据库中定义的所有表、属性、有序索引和唯一哈希索引的内存需求。

  • 每个表和表行所需的IndexMemoryDataMemory

25.5.29 ndb_top — 查看 NDB 线程的 CPU 使用信息

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-programs-ndb-top.html

ndb_top 在终端中显示有关 NDB 线程在 NDB Cluster 数据节点上的 CPU 使用情况的运行信息。每个线程在输出中由两行表示,第一行显示系统统计信息,第二行显示线程的测量统计信息。

ndb_top 从 MySQL NDB Cluster 7.6.3 版本开始提供。

使用方法

ndb_top [-h *hostname*] [-t *port*] [-u *user*] [-p *pass*] [-n *node_id*]

ndb_top 连接到作为集群的 SQL 节点运行的 MySQL Server。默认情况下,它尝试连接到在 localhost 和端口 3306 上运行的 mysqld,作为 MySQL root 用户,未指定密码。您可以使用 --host (-h) 和 --port (-t) 分别覆盖默认主机和端口。要指定 MySQL 用户和密码,请使用 --user (-u) 和 --passwd (-p) 选项。此用户必须能够读取 ndbinfo 数据库中的表(ndb_top 使用来自 ndbinfo.cpustat 和相关表的信息)。

欲了解更多关于 MySQL 用户账户和密码的信息,请参阅 Section 8.2, “访问控制和账户管理”。

输出可作为纯文本或 ASCII 图形获得;您可以使用 --text (-x) 和 --graph (-g) 选项分别指定。这两种显示模式提供相同的信息;它们可以同时使用。至少一个显示模式必须在使用中。

图形的彩色显示受支持并默认启用 (--color-c 选项)。启用彩色支持后,图形显示中显示 OS 用户时间为蓝色,OS 系统时间为绿色,空闲时间为空白。对于测量负载,蓝色用于执行时间,黄色用于发送时间,红色用于在发送缓冲区满等待的时间,空白用于空闲时间。图形显示中显示的百分比是所有非空闲线程的百分比之和。目前无法配置颜色;您可以使用 --skip-color 来使用灰度代替。

排序视图 (--sort, -r) 基于测量负载的最大值和操作系统报告的负载。可以使用 --measured-load (-m) 和 --os-load (-o) 选项启用和禁用这些负载的显示。这些负载中至少一个必须启用显示。

程序尝试从具有由--node-id (-n) 选项给定的节点 ID 的数据节点获取统计信息;如果未指定,则为 1. ndb_top 无法提供关于其他类型节点的信息。

视图会根据终端窗口的高度和宽度自动调整;最小支持宽度为 76 个字符。

一旦启动,ndb_top 将持续运行直到强制退出;您可以使用 Ctrl-C 退出程序。显示每秒更新一次;要设置不同的延迟间隔,请使用 --sleep-time (-s)。

注意

ndb_top 可在 macOS、Linux 和 Solaris 上使用。目前不支持在 Windows 平台上。

以下表格包含所有特定于 NDB 集群程序 ndb_top 的选项。表格后面是附加描述。

表 25.50 与程序 ndb_top 一起使用的命令行选项

格式 描述 添加、弃用或移除
--color,-c 以彩色显示 ASCII 图形;使用 --skip-colors 可以禁用 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-extra-file=path 在读取全局文件后读取给定文件 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-file=path 仅从给定文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-group-suffix=string 还读取具有 concat(group, suffix) 的组 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--graph,-g 使用图表显示数据;使用 --skip-graphs 禁用 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--help 显示程序使用信息 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--host=string,-h string 要连接的 MySQL 服务器的主机名或 IP 地址 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--login-path=path 从登录文件中读取给定路径 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--measured-load,-m 按线程显示测量负载 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--no-defaults 不从登录文件以外的任何选项文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--node-id=#,-n # 查看具有此节点 ID 的节点 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--os-load,-o 操作系统测量的负载显示 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--password=password,-p password 使用此密码连接 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--port=#,-P # (>=7.6.6) 连接到 MySQL 服务器时要使用的端口号 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--print-defaults 打印程序参数列表并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--sleep-time=#,-s # 显示刷新之间等待的时间,以秒为单位 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--socket=path,-S path 用于连接的套接字文件 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--sort,-r 按使用情况对线程进行排序;使用 --skip-sort 来禁用 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--text,-t (>=7.6.6) 使用文本显示数据 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--usage 显示程序使用信息;与 --help 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--user=name,-u name 以此 MySQL 用户连接 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
格式 描述 添加、弃用或移除

附加选项

  • --color, -c

    命令行格式 --color

    以彩色显示 ASCII 图形;使用 --skip-colors 来禁用。

  • --defaults-extra-file

    命令行格式 --defaults-extra-file=path
    类型 字符串
    默认值 [none]

    在读取全局文件后读取给定文件。

  • --defaults-file

    命令行格式 --defaults-file=path
    类型 字符串
    默认值 [none]

    仅从给定文件中读取默认选项。

  • --defaults-group-suffix

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [none]

    还读取带有 concat(group, suffix) 的组。

  • --graph, -g

    命令行格式 --graph

    使用图形显示数据;使用 --skip-graphs 来禁用。此选项或 --text 必须为真;两个选项都可以为真。

  • --help, -?

    命令行格式 --help

    显示程序使用信息。

  • --host[=name], -h

    命令行格式 --host=string
    类型 字符串
    默认值 localhost

    要连接到的 MySQL 服务器的主机名或 IP 地址。

  • --login-path

    命令行格式 --login-path=path
    类型 字符串
    默认值 [none]

    从登录文件中读取给定路径。

  • --measured-load, -m

    命令行格式 --measured-load

    显示线程的测量负载。此选项或--os-load必须为真;这两个选项都可以为真。

  • --no-defaults

    命令行格式 --no-defaults

    不要从登录文件以外的任何选项文件中读取默认选项。

  • --node-id=#], -n

    命令行格式 --node-id=#
    类型 整数
    默认值 1

    观察具有此节点 ID 的数据节点。

  • --os-load, -o

    命令行格式 --os-load

    显示操作系统测量的负载。此选项或--measured-load必须为真;这两个选项都可以为真。

  • --password=password], -p

    命令行格式 --password=password
    类型 字符串
    默认值 NULL

    使用此密码和由--user指定的 MySQL 用户连接到 MySQL 服务器。

    此密码仅与 MySQL 用户帐户关联,与用于加密NDB备份的密码无关。

  • --port=#], -P

    命令行格式 --port=#
    类型 整数
    默认值 3306

    连接到 MySQL 服务器时要使用的端口号。

    (以前,此选项的简短形式是-t,现在已被重新用作--text的简短形式。)

  • --print-defaults

    命令行格式 --print-defaults

    打印程序参数列表并退出。

  • --sleep-time=seconds], -s

    命令行格式 --sleep-time=#
    类型 整数
    默认值 1

    显示刷新之间的等待时间,以秒为单位。

  • --socket=*path/to/file*, -S

    命令行格式 --socket=path
    类型 路径名
    默认值 [none]

    使用指定的套接字文件进行连接。

  • --sort, -r

    命令行格式 --sort

    按使用情况对线程进行排序;使用--skip-sort来禁用。

  • --text, -t

    命令行格式 --text

    使用文本显示数据。此选项或--graph必须为真;两个选项都可以为真。

    (在之前的 NDB Cluster 版本中,此选项的简写形式为-x,但不再支持。)

  • --usage

    命令行格式 --usage

    显示帮助文本并退出;与--help相同。

  • --user[=name], -u

    命令行格式 --user=name
    类型 字符串
    默认值 root

    连接作为这个 MySQL 用户。通常需要由--password选项提供的密码。

示例输出。 下图显示了在 Linux 系统上的终端窗口中运行的ndb_top在中等负载下的ndbmtd数据节点。在这里,程序已经使用ndb_top -n8 -x 被调用以提供文本和图形输出:

图 25.5 ndb_top 在终端中运行

从 ndb_top 显示,在终端窗口中运行。显示每个节点的信息,包括已利用的资源。

从 NDB 8.0.20 开始,ndb_top还显示线程的自旋时间,显示为绿色。

25.5.30 ndb_waiter — 等待 NDB 集群达到给定状态

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-programs-ndb-waiter.html

ndb_waiter 每隔 100 毫秒重复打印出所有集群数据节点的状态,直到集群达到给定状态或超过--timeout限制,然后退出。默认情况下,它等待集群达到STARTED状态,其中所有节点已启动并连接到集群。可以使用--no-contact--not-started选项覆盖此设置。

此实用程序报告的节点状态如下:

  • NO_CONTACT: 无法联系节点。

  • UNKNOWN: 可以联系节点,但其状态尚不清楚。通常,这意味着节点已收到管理服务器的STARTRESTART 命令,但尚未执行。

  • NOT_STARTED: 节点已停止,但仍与集群保持联系。在使用管理客户端的 RESTART 命令重���启动节点时会出现此状态。

  • STARTING: 节点的ndbd 进程已启动,但节点尚未加入集群。

  • STARTED: 节点正在运行,并已加入集群。

  • SHUTTING_DOWN: 节点正在关闭。

  • SINGLE USER MODE: 当集群处于单用户模式时,所有集群数据节点都会显示此状态。

可与ndb_waiter一起使用的选项显示在以下表中。表后面是附加描述。

表 25.51 与程序 ndb_waiter 一起使用的命令行选项

格式 描述 添加、弃用或移除
--character-sets-dir=path 包含字符集的目录 移除:8.0.31
--connect-retries=# 放弃之前重试连接的次数 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--connect-retry-delay=# 尝试联系管理服务器之间等待的秒数 (在基于 MySQL 8.0 的所有 NDB 发行版中支持)
--connect-string=connection_string,-c connection_string 与 --ndb-connectstring 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--core-file 在错误时写入核心文件;用于调试 已移除:8.0.31
--defaults-extra-file=path 在读取全局文件后读取给定文件 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-file=path 仅从给定文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-group-suffix=string 还读取带有 concat(group, suffix) 的组 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--help,-? 显示帮助文本并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--login-path=path 从登录文件中读取给定路径 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-connectstring=connection_string,-c connection_string 设置连接到 ndb_mgmd 的连接字符串。语法:“[nodeid=id;][host=]hostname[:port]”。覆盖 NDB_CONNECTSTRING 和 my.cnf 中的条目 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-mgmd-host=connection_string,-c connection_string 与 --ndb-connectstring 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--ndb-nodeid=# 为此节点设置节点 ID,覆盖 --ndb-connectstring 设置的任何 ID 已移除:8.0.31
--ndb-optimized-node-selection 启用用于事务节点选择的优化。默认启用;使用 --skip-ndb-optimized-node-selection 禁用 已移除:8.0.31
--no-contact,-n 等待集群达到无联系状态 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--no-defaults 不从登录文件以外的任何选项文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--not-started 等待集群达到未启动状态 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--nowait-nodes=list 不等待的节点列表 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--print-defaults 打印程序参数列表并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--single-user 等待集群进入单用户模式 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--timeout=#,-t # 等待这么多秒,然后退出,无论集群是否达到所需状态 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--usage,-? 显示帮助文本并退出;与 --help 相同 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--verbose=#,-v 设置输出详细程度;查看文本以获取输入和返回值 添加: 8.0.37
--version,-V 显示版本信息并退出 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--wait-nodes=list,-w list 等待的节点列表 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
格式 描述 添加、废弃或移除

用法

ndb_waiter [-c *connection_string*]

附加选项

  • --character-sets-dir

    命令行格式 --character-sets-dir=path
    移除 8.0.31

    包含字符集的目录。

  • --connect-retries

    命令行格式 --connect-retries=#
    类型 整数
    默认值 12
    最小值 0
    最大值 12

    连接重试次数上限。

  • --connect-retry-delay

    命令行格式 --connect-retry-delay=#
    类型 整数
    默认值 5
    最小值 0
    最大值 5

    尝试联系管理服务器之间等待的秒数。

  • --connect-string

    命令行格式 --connect-string=connection_string
    类型 字符串
    默认值 [none]

    --ndb-connectstring相同。

  • --core-file

    命令行格式 --core-file
    已移除 8.0.31

    在错误时写入核心文件;用于调试。

  • --defaults-extra-file

    命令行格式 --defaults-extra-file=path
    类型 字符串
    默认值 [none]

    在读取全局文件后读取给定文件。

  • --defaults-file

    命令行格式 --defaults-file=path
    类型 字符串
    默认值 [none]

    仅从给定文件中读取默认选项。

  • --defaults-group-suffix

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [none]

    还读取具有 concat(group, suffix)的组。

  • --login-path

    命令行格式 --login-path=path
    类型 字符串
    默认值 [none]

    从登录文件中读取给定路径。

  • --help

    命令行格式 --help

    显示帮助文本并退出。

  • --ndb-connectstring

    命令行格式 --ndb-connectstring=connection_string
    类型 字符串
    默认值 [none]

    设置用于连接到 ndb_mgmd 的连接字符串。语法:"[nodeid=id;][host=]hostname[:port]"。覆盖 NDB_CONNECTSTRING 和 my.cnf 中的条目。

  • --ndb-mgmd-host

    命令行格式 --ndb-mgmd-host=connection_string
    类型 字符串
    默认值 [none]

    与--ndb-connectstring相同。

  • --ndb-nodeid

    命令行格式 --ndb-nodeid=#
    已移除 8.0.31
    类型 整数
    默认值 [none]

    设置此节点的节点 ID,覆盖由--ndb-connectstring设置的任何 ID。

  • --ndb-optimized-node-selection

    命令行格式 --ndb-optimized-node-selection
    移除 8.0.31

    启用优化以选择事务节点。默认情况下启用;使用--skip-ndb-optimized-node-selection来禁用。

  • --no-contact, -n

    而不是等待STARTED状态,ndb_waiter在退出之前继续运行,直到集群达到NO_CONTACT状态。

  • --no-defaults

    命令行格式 --no-defaults

    不要从登录文件以外的任何选项文件中读取默认选项。

  • --not-started

    而不是等待STARTED状态,ndb_waiter在退出之前继续运行,直到集群达到NOT_STARTED状态。

  • --nowait-nodes=*list*

    当使用此选项时,ndb_waiter不会等待列出的节点 ID。列表以逗号分隔;范围可以用破折号表示,如下所示:

    $> ndb_waiter --nowait-nodes=1,3,7-9
    

    重要

    不要与--wait-nodes选项一起使用。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序参数列表并退出。

  • --timeout=*seconds*, -t *seconds*

    等待时间。如果在此秒数内未达到所需状态,则程序将退出。默认值为 120 秒(1200 个报告周期)。

  • --single-user

    该程序等待集群进入单用户��式。

  • --usage

    命令行格式 --usage

    显示帮助文本并退出;与--help相同。

  • --verbose

    命令行格式 --verbose=#
    引入 8.0.37
    类型 整数
    默认值 2
    最小值 0
    最大值 2

    控制打印输出的详细程度。可能的级别及其效果在此处列出:

    • 0: 仅返回退出代码,不打印(请参阅后续的退出代码)。

    • 1: 仅打印最终连接状态。

    • 2: 每次检查时打印状态。

      这与 8.4 之前的 NDB Cluster 版本的行为相同。

    ndb_waiter 返回的退出代码在此处列出,及其含义:

    • 0: 成功。

    • 1: 等待超时。

    • 2: 参数错误,如无效的节点 ID。

    • 3: 连接到管理服务器失败。

  • --version

    命令行格式 --version

    显示版本信息并退出。

  • --wait-nodes=*list*, -w *list*

    当使用此选项时,ndb_waiter 仅等待列出的节点。列表以逗号分隔;范围可以用破折号表示,如下所示:

    $> ndb_waiter --wait-nodes=2,4-6,10
    

    重要

    不要与--nowait-nodes选项一起使用。

示例输出。 这里显示了对一个 4 节点集群运行ndb_waiter的输出,其中两个节点已手动关闭然后重新启动。重复报告(由...表示)被省略。

$> ./ndb_waiter -c localhost

Connecting to mgmsrv at (localhost)
State node 1 STARTED
State node 2 NO_CONTACT
State node 3 STARTED
State node 4 NO_CONTACT
Waiting for cluster enter state STARTED

...

State node 1 STARTED
State node 2 UNKNOWN
State node 3 STARTED
State node 4 NO_CONTACT
Waiting for cluster enter state STARTED

...

State node 1 STARTED
State node 2 STARTING
State node 3 STARTED
State node 4 NO_CONTACT
Waiting for cluster enter state STARTED

...

State node 1 STARTED
State node 2 STARTING
State node 3 STARTED
State node 4 UNKNOWN
Waiting for cluster enter state STARTED

...

State node 1 STARTED
State node 2 STARTING
State node 3 STARTED
State node 4 STARTING
Waiting for cluster enter state STARTED

...

State node 1 STARTED
State node 2 STARTED
State node 3 STARTED
State node 4 STARTING
Waiting for cluster enter state STARTED

...

State node 1 STARTED
State node 2 STARTED
State node 3 STARTED
State node 4 STARTED
Waiting for cluster enter state STARTED

注意

如果未指定连接字符串,则ndb_waiter 尝试连接到localhost上的管理服务器,并报告Connecting to mgmsrv at (null)

在 NDB 8.0.20 之前,该程序在运行完成后打印NDBT_ProgramExit - *status*,这是由于对NDBT测试库的不必要依赖。已经移除了这种依赖,消除了多余的输出。

25.5.31 ndbxfrm — 压缩、解压、加密和解密由 NDB Cluster 创建的文件

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-programs-ndbxfrm.html

ndbxfrm 实用程序,引入于 NDB 8.0.22,可用于解压、解密和输出由 NDB Cluster 创建的文件的信息,这些文件可能被压缩、加密或两者兼有。它还可用于压缩或加密文件。

表 25.52 与程序 ndbxfrm 一起使用的命令行选项

格式 描述 新增、弃用或移除
--compress,-c 压缩文件 新增:NDB 8.0.22
--decrypt-key=key 提供文件解密密钥 新增:NDB 8.0.31
--decrypt-key-from-stdin 从标准输入中提供文件解密密钥 新增:NDB 8.0.31
--decrypt-password=password 使用此密码解密文件 新增:NDB 8.0.22
--decrypt-password-from-stdin 从标准输入中以安全方式获取解密密码 新增:NDB 8.0.24
--defaults-extra-file=path 在全局文件读取后读取给定文件 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-group-suffix=string 也读取带有 concat(group, suffix) 的组 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--defaults-file=path 仅从给定文件中读取默认选项 (在基于 MySQL 8.0 的所有 NDB 版本中支持)
--encrypt-block-size=# 打印有关文件的信息,包括文件头和尾部 新增:NDB 8.0.31
--encrypt-block-size=# 作为一个单元加密的输入数据块的大小。与 XTS 一起使用,对于 CBC 模式设置为零 新增:NDB 8.0.29
--encrypt-cipher=# 加密密码:1 代表 CBC,2 代表 XTS 新增:NDB 8.0.29
--encrypt-kdf-iter-count=#,-k # 密钥定义中使用的迭代次数 新增:NDB 8.0.22
--encrypt-key=key 使用此密钥加密文件 新增:NDB 8.0.31
--encrypt-key-from-stdin 使用从标准输入提供的密钥加密文件 新增:NDB 8.0.31
--encrypt-password=password 使用此密码加密文件 新增:NDB 8.0.22
--encrypt-password-from-stdin 从标准输入安全获取加密密码 新增:NDB 8.0.24
--help,-? 打印使用信息 新增:NDB 8.0.22
--info,-i 打印文件信息 新增:NDB 8.0.22
--login-path=path 从登录文件中读取给定路径 (支持所有基于 MySQL 8.0 的 NDB 发行版)
--no-defaults 不从除登录文件以外的任何选项文件中读取默认选项 (支持所有基于 MySQL 8.0 的 NDB 发行版)
--print-defaults 打印程序参数列表并退出 (支持所有基于 MySQL 8.0 的 NDB 发行版)
--usage,-? 打印使用信息;--help 的同义词 新增:NDB 8.0.22
--version,-V 输出版本信息 新增:NDB 8.0.22
格式 描述 添加、弃用或移除

用法

ndbxfrm --info *file*[ *file* ...]

ndbxfrm --compress *input_file* *output_file*

ndbxfrm --decrypt-password=*password* *input_file* *output_file*

ndbxfrm [--encrypt-ldf-iter-count=#] --encrypt-password=*password* *input_file* *output_file*

input_fileoutput_file 不能是同一个文件。

选项

  • --compress, -c

    命令行格式 --compress
    引入版本 8.0.22-ndb-8.0.22

    压缩输入文件,使用与压缩 NDB 集群备份相同的压缩方法,并将输出写入输出文件。要解压未加密的压缩 NDB 备份文件,只需调用 ndbxfrm,并提供压缩文件的名称和输出文件的名称(无需任何选项)。

  • --decrypt-key=*key*, -K key

    命令行格式 --decrypt-key=key
    引入版本 8.0.31-ndb-8.0.31

    使用提供的密钥解密由NDB加密的文件。

    注意

    此选项不能与--decrypt-password一起使用。

  • --decrypt-key-from-stdin

    命令行格式 --decrypt-key-from-stdin
    引入版本 8.0.31-ndb-8.0.31

    使用从标准输入提供的密钥解密由NDB加密的文件。

  • --decrypt-password=*password*

    命令行格式 --decrypt-password=password
    引入版本 8.0.22-ndb-8.0.22
    类型 字符串
    默认值 [none]

    使用提供的密码解密由NDB加密的文件。

    注意

    此选项不能与--decrypt-key一起使用。

  • --decrypt-password-from-stdin[=TRUE|FALSE]

    命令行格式 --decrypt-password-from-stdin
    引入版本 8.0.24-ndb-8.0.24

    使用从标准输入提供的密码解密由NDB加密的文件。这类似于在调用mysql --password时不跟随选项后输入密码��

  • --defaults-extra-file

    命令行格式 --defaults-extra-file=path
    类型 字符串
    默认值 [none]

    在全局文件读取后读取给定文件。

  • --defaults-file

    命令行格式 --defaults-file=path
    类型 字符串
    默认值 [none]

    仅从给定文件中读取默认选项。

  • --defaults-group-suffix

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [none]

    还读取带有CONCAT(*group*, *suffix*)的组。

  • --detailed-info

    命令行格式 --encrypt-block-size=#
    引入版本 8.0.31-ndb-8.0.31
    类型 布尔值
    默认值 FALSE

    打印出文件信息,类似于--info,但包括文件的头部和尾部。

    示例:

    $> ndbxfrm --detailed-info S0.sysfile
    File=/var/lib/cluster-data/ndb_7_fs/D1/NDBCNTR/S0.sysfile, compression=no, encryption=yes
    header: {
      fixed_header: {
        magic: {
          magic: { 78, 68, 66, 88, 70, 82, 77, 49 },
          endian: 18364758544493064720,
          header_size: 32768,
          fixed_header_size: 160,
          zeros: { 0, 0 }
        },
        flags: 73728,
        flag_extended: 0,
        flag_zeros: 0,
        flag_file_checksum: 0,
        flag_data_checksum: 0,
        flag_compress: 0,
        flag_compress_method: 0,
        flag_compress_padding: 0,
        flag_encrypt: 18,
        flag_encrypt_cipher: 2,
        flag_encrypt_krm: 1,
        flag_encrypt_padding: 0,
        flag_encrypt_key_selection_mode: 0,
        dbg_writer_ndb_version: 524320,
        octets_size: 32,
        file_block_size: 32768,
        trailer_max_size: 80,
        file_checksum: { 0, 0, 0, 0 },
        data_checksum: { 0, 0, 0, 0 },
        zeros01: { 0 },
        compress_dbg_writer_header_version: { ... },
        compress_dbg_writer_library_version: { ... },
        encrypt_dbg_writer_header_version: { ... },
        encrypt_dbg_writer_library_version: { ... },
        encrypt_key_definition_iterator_count: 100000,
        encrypt_krm_keying_material_size: 32,
        encrypt_krm_keying_material_count: 1,
        encrypt_key_data_unit_size: 32768,
        encrypt_krm_keying_material_position_in_octets: 0,
      },
      octets: {
         102, 68, 56, 125, 78, 217, 110, 94, 145, 121, 203, 234, 26, 164, 137, 180,
         100, 224, 7, 88, 173, 123, 209, 110, 185, 227, 85, 174, 109, 123, 96, 156,
      }
    }
    trailer: {
      fixed_trailer: {
        flags: 48,
        flag_extended: 0,
        flag_zeros: 0,
        flag_file_checksum: 0,
        flag_data_checksum: 3,
        data_size: 512,
        file_checksum: { 0, 0, 0, 0 },
        data_checksum: { 226, 223, 102, 207 },
        magic: {
          zeros: { 0, 0 }
          fixed_trailer_size: 56,
          trailer_size: 32256,
          endian: 18364758544493064720,
          magic: { 78, 68, 66, 88, 70, 82, 77, 49 },
        },
      }
    }
    
  • --encrypt-block-size=*#*

    命令行格式 --encrypt-block-size=#
    引入版本 8.0.29-ndb-8.0.29
    类型 整数
    默认值 0
    最小值 0
    最大值 2147483647

    作为一个单元加密的输入数据块的大小。与 XTS 一起使用;对于 CBC 模式,设置为0(默认值)。

  • --encrypt-cipher=*#*

    命令行格式 --encrypt-cipher=#
    引入版本 8.0.29-ndb-8.0.29
    类型 整数
    默认值 1
    最小值 0
    最大值 2147483647

    用于加密的密码。设置为1表示 CBC 模式(默认),或2表示 XTS。

  • --encrypt-kdf-iter-count=*#*, -k *#*

    命令行格式 --encrypt-kdf-iter-count=#
    引入版本 8.0.22-ndb-8.0.22
    类型 整数
    默认值 0
    最小值 0
    最大值 2147483647

    在加密文件时,指定用于加密密钥的迭代次数。需要--encrypt-password选项。

  • --encrypt-key=*key*

    命令行格式 --encrypt-key=key
    引入版本 8.0.31-ndb-8.0.31

    使用提供的密钥加密文件。

    注意

    此选项不能与--encrypt-password一起使用。

  • --encrypt-key-from-stdin

    命令行格式 --encrypt-key-from-stdin
    引入版本 8.0.31-ndb-8.0.31

    使用从stdin提供的密钥加密文件。

  • --encrypt-password=*password*

    命令行格式 --encrypt-password=password
    引入版本 8.0.22-ndb-8.0.22
    类型 字符串
    默认值 [none]

    使用选项提供的密码加密备份文件。密码必须符合此处列出的要求:

    • 使用除!'"$%\之外的任何可打印 ASCII 字符

    $> ndbxfrm -i BACKUP-10-0.5.Data BACKUP-10.5.ctl BACKUP-10.5.log

    文件=BACKUP-10-0.5.Data,压缩=no,加密=yes

    文件=BACKUP-10.5.ctl,压缩=no,加密=yes

    文件=BACKUP-10.5.log,压缩=no,加密=yes

    
    Beginning with NDB 8.0.31, you can also see the file's header and trailer using the `--detailed-info` option.
    
    
  • --login-path

    | Command-Line Format | --login-path=path |
    | Type | String |
    | Default Value | [none] |

    Read given path from login file.

  • --no-defaults

    | Command-Line Format | --no-defaults |

    Do not read default options from any option file other than login file.

  • --print-defaults

    | Command-Line Format | --print-defaults |

    Print program argument list and exit.

  • --usage, -?

    | Command-Line Format | --usage |
    | Introduced | 8.0.22-ndb-8.0.22 |

    Synonym for --help.

  • --version, -V

    | Command-Line Format | --version |
    | Introduced | 8.0.22-ndb-8.0.22 |

    Prints out version information.

ndbxfrm can encrypt backups created by any version of NDB Cluster. The .Data, .ctl, and .log files comprising the backup must be encrypted separately, and these files must be encrypted separately for each data node. Once encrypted, such backups can be decrypted only by ndbxfrm, ndb_restore, or ndb_print_backup from NDB Cluster 8.0.22 or later.

An encrypted file can be re-encrypted with a new password using the --encrypt-password and --decrypt-password options together, like this:


ndbxfrm --decrypt-password=*old* --encrypt-password=*new* *input_file* *output_file*

在刚才显示的示例中,oldnew分别是旧密码和新密码;这两者都必须用引号括起来。输入文件被解密,然后作为输出文件被加密。输入文件本身不会改变;如果您不希望使用旧密码访问它,必须手动删除输入文件。

25.6 NDB 集群管理

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-management.html

25.6.1 NDB 集群管理客户端中的命令

25.6.2 NDB 集群日志消息

25.6.3 NDB 集群生成的事件报告

25.6.4 NDB 集群启动阶段摘要

25.6.5 对 NDB 集群执行滚动重启

25.6.6 NDB 集群单用户模式

25.6.7 在线添加 NDB 集群数据节点

25.6.8 NDB 集群在线备份

25.6.9 将数据导入 MySQL 集群

25.6.10 用于 NDB 集群的 MySQL 服务器用法

25.6.11 NDB 集群磁盘数据表

25.6.12 在 NDB 集群中使用 ALTER TABLE 进行在线操作

25.6.13 权限同步和 NDB_STORED_USER

25.6.14 NDB 集群的文件系统加密

25.6.15 NDB API 统计计数器和变量

25.6.16 ndbinfo:NDB 集群信息数据库

25.6.17 用于 NDB 集群的 INFORMATION_SCHEMA 表

25.6.18 NDB 集群和性能模式

25.6.19 快速参考:NDB 集群 SQL 语句

25.6.20 NDB 集群安全问题

管理 NDB 集群涉及许多任务,首先是配置和启动 NDB 集群。这在第 25.4 节,“NDB 集群配置”和第 25.5 节,“NDB 集群程序”中有所涵盖。

接下来的几节涵盖了运行 NDB 集群的管理。

有关与 NDB 集群管理和部署相关的安全问题,请参阅第 25.6.20 节,“NDB 集群安全问题”。

实际上有两种主动管理运行中 NDB 集群的方法。其中之一是通过输入到管理客户端的命令来检查集群状态,更改日志级别,启动和停止备份,以及停止和启动节点。第二种方法涉及研究集群日志ndb_*node_id*_cluster.log的内容;通常可以在管理服务器的DataDir目录中找到,但可以使用LogDestination选项覆盖此位置。(请记住node_id代表被记录活动的节点的唯一标识符。)集群日志包含由ndbd生成的事件报告。还可以将集群日志条目发送到 Unix 系统日志。

一些集群操作的方面也可以通过在 SQL 节点上使用SHOW ENGINE NDB STATUS语句来监控。

通过使用ndbinfo数据库,可以实时通过 SQL 接口获取有关 NDB 集群操作的更详细信息。有关更多信息,请参见 Section 25.6.16, “ndbinfo: The NDB Cluster Information Database”。

NDB 统计计数器通过mysql客户端提供了改进的监控。这些计数器,由 NDB 内核实现,涉及由或影响Ndb对象执行的操作,如启动、关闭和中止事务;主键和唯一键操作;表、范围和修剪扫描;等待各种操作完成的阻塞线程;以及 NDB 集群发送和接收的数据和事件。每当进行 NDB API 调用或数据被发送到或接收到数据节点时,NDB 内核都会递增计数器。

mysqld将 NDB API 统计计数器公开为系统状态变量,可以从它们的名称中共同前缀(Ndb_api_)中识别。这些变量的值可以通过SHOW STATUS语句的输出在mysql客户端中读取,或者通过查询 Performance Schema 的session_statusglobal_status表。通过比较执行对NDB表操作的 SQL 语句之前和之后的状态变量的值,您可以观察到与该语句对应的 NDB API 级别的操作,这对于监视和性能调整 NDB Cluster 可能是有益的。

MySQL Cluster Manager 提供了一个高级命令行界面,简化了许多复杂的 NDB Cluster 管理任务,比如启动、停止或重新启动具有大量节点的 NDB Cluster。MySQL Cluster Manager 客户端还支持获取和设置大多数节点配置参数以及与 NDB Cluster 相关的mysqld服务器选项和变量的命令。MySQL Cluster Manager 8.0 支持 NDB 8.0。有关更多信息,请参阅 MySQL Cluster Manager 8.0.36 用户手册。

25.6.1 NDB Cluster 管理客户端中的命令

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-mgm-client-commands.html

除了中央配置文件外,集群还可以通过管理客户端提供的命令行界面进行控制 ndb_mgm。这是运行集群的主要管理界面。

事件日志的命令在 第 25.6.3 节,“NDB Cluster 生成的事件报告” 中给出;创建备份并从中恢复的命令在 第 25.6.8 节,“NDB Cluster 的在线备份” 中提供。

使用 MySQL Cluster Manager 的 ndb_mgm。 MySQL Cluster Manager 1.4.8 提供对 NDB 8.0 的实验性支持。MySQL Cluster Manager 处理启动和停止进程,并在内部跟踪其状态,因此不需要使用 ndb_mgm 来执行这些任务,对于由 MySQL Cluster Manager 控制的 NDB Cluster。建议不要使用随 NDB Cluster 发行版一起提供的 ndb_mgm 命令行客户端执行涉及启动或停止节点的操作。这些操作包括但不限于 STARTSTOPRESTARTSHUTDOWN 命令。更多信息,请参阅 MySQL Cluster Manager 进程命令。

管理客户端具有以下基本命令。在接下来的清单中,node_id 表示数据节点 ID 或关键字 ALL,表示该命令应用于集群的所有数据节点。

  • CONNECT *connection-string*

    连接到连接字符串指示的管理服务器。如果客户端已连接到此服务器,则客户端重新连接。

  • CREATE NODEGROUP *nodeid*[, *nodeid*, ...]

    创建新的 NDB Cluster 节点组,并使数据节点加入其中。

    此命令用于在线添加新数据节点到 NDB 集群后,使它们加入新的节点组,从而开始完全参与集群。该命令的唯一参数是一个逗号分隔的节点 ID 列表—这些是刚刚添加并启动的节点的 ID,它们将加入新的节点组。列表中不能包含重复的 ID;从 NDB 8.0.26 开始,任何重复的存在会导致命令返回错误。列表中节点的数量必须与已经是集群一部分的每个节点组中的节点数量相同(每个 NDB 集群节点组必须有相同数量的节点)。换句话说,如果 NDB 集群由 2 个每个有 2 个数据节点的节点组组成,则新的节点组也必须有 2 个数据节点。

    由此命令创建的新节点组的节点组 ID 是自动确定的,并且始终是集群中未使用的最高的节点组 ID;无法手动设置它。

    欲了解更多信息,请参阅 第 25.6.7 节,“在线添加 NDB 集群数据节点”。

  • DROP NODEGROUP *nodegroup_id*

    删除具有给定 nodegroup_id 的 NDB 集群节点组。

    此命令可用于从 NDB 集群中删除节点组。DROP NODEGROUP 的唯一参数是要删除的节点��的节点组 ID。

    DROP NODEGROUP 仅用于从受影响的节点组中移除数据节点。它不会停止数据节点,也不会将它们分配给不同的节点组,或从集群的配置中移除它们。在管理客户端 SHOW 命令的输出中,不属于任何节点组的数据节点会显示为 no nodegroup,而不是节点组 ID,就像这样(使用粗体文本表示):

    id=3    @10.100.2.67  (8.0.35-ndb-8.0.35, no nodegroup)
    

    DROP NODEGROUP 仅在欲删除的节点组中的所有数据节点完全不包含任何表数据和表定义时才有效。由于目前无法使用 ndb_mgmmysql 客户端从特定数据节点或节点组中删除所有数据,这意味着该命令仅在以下两种情况下成功:

    1. ndb_mgm 客户端中发出 CREATE NODEGROUP 命令之后,但在 mysql 客户端中发出任何 ALTER TABLE ... REORGANIZE PARTITION 命令之前。

    2. 在使用DROP TABLE删除所有NDBCLUSTER表之后。

      TRUNCATE TABLE对此目的无效,因为这只会删除表数据;数据节点将继续存储NDBCLUSTER表的定义,直到发出导致表元数据被删除的DROP TABLE语句。

    有关DROP NODEGROUP的更多信息,请参见 Section 25.6.7, “Adding NDB Cluster Data Nodes Online”。

  • ENTER SINGLE USER MODE *node_id*

    进入单用户模式,只允许由节点 ID node_id 标识的 MySQL 服务器访问数据库。

    ndb_mgm客户端明确确认已发出此命令并已生效,如下所示:

    ndb_mgm> ENTER SINGLE USER MODE 100
    Single user mode entered
    Access is granted for API node 100 only.
    

    此外,在单用户模式下具有独占访问权限的 API 或 SQL 节点在SHOW命令的输出中会被指示,如下所示:

    ndb_mgm> SHOW
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=5    @127.0.0.1  (mysql-8.0.35 ndb-8.0.35, single user mode, Nodegroup: 0, *)
    id=6    @127.0.0.1  (mysql-8.0.35 ndb-8.0.35, single user mode, Nodegroup: 0)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=50   @127.0.0.1  (mysql-8.0.35 ndb-8.0.35)
    
    [mysqld(API)]   2 node(s)
    id=100  @127.0.0.1  (mysql-8.0.35 ndb-8.0.35, allowed single user)
    id=101 (not connected, accepting connect from any host)
    
  • EXIT SINGLE USER MODE

    退出单用户模式,使所有 SQL 节点(即所有运行的mysqld进程)可以访问数据库。

    注意

    即使不在单用户模式下,也可以使用EXIT SINGLE USER MODE,但在这种情况下该命令不起作用。

  • HELP

    显示所有可用命令的信息。

  • *node_id* NODELOG DEBUG {ON|OFF}

    在节点日志中切换调试日志记录,就好像受影响的数据节点已经使用--verbose选项启动一样。NODELOG DEBUG ON开始调试日志记录;NODELOG DEBUG OFF关闭调试日志记录。

  • PROMPT [*prompt*]

    更改ndb_mgm显示的提示为字符串文字 prompt

    prompt 不应该被引用(除非您希望提示包含引号)。与mysql客户端不同,不会识别特殊字符序列和转义。如果没有参数调用,该命令将重置提示为默认值(ndb_mgm>)。

    ��下是一些示例:

    ndb_mgm> PROMPT mgm#1:
    mgm#1: SHOW
    Cluster Configuration
    ...
    mgm#1: PROMPT mymgm >
    mymgm > PROMPT 'mymgm:'
    'mymgm:' PROMPT  mymgm:
    mymgm: PROMPT
    ndb_mgm> EXIT
    $>
    

    请注意,prompt字符串中的前导空格和空格不会被修剪。尾随空格会被移除。

  • QUIT, EXIT

    终止管理客户端。

    此命令不会影响连接到集群的任何节点。

  • *node_id* REPORT *report-type*

    显示标识为node_id的数据节点或使用ALL显示的report-type类型报告。

    目前,report-type有三个可接受的值:

    • BackupStatus 提供正在进行的集群备份的状态报告

    • MemoryUsage 显示每个数据节点使用的数据内存和索引内存量,如下所示:

      ndb_mgm> ALL REPORT MEMORY
      
      Node 1: Data usage is 5%(177 32K pages of total 3200)
      Node 1: Index usage is 0%(108 8K pages of total 12832)
      Node 2: Data usage is 5%(177 32K pages of total 3200)
      Node 2: Index usage is 0%(108 8K pages of total 12832)
      

      这些信息也可以从ndbinfo.memoryusage表中获取。

    • EventLog 报告一个或多个数据节点的事件日志缓冲区中的事件。

    report-type对大小写不敏感且“模糊”;对于MemoryUsage,可以使用MEMORY(如前面的示例中所示),memory,甚至简单地使用MEM(或mem)。类似地,您可以缩写BackupStatus

  • *node_id* RESTART [-n] [-i] [-a] [-f]

    重新启动标识为node_id(或所有数据节点)的数据节点。

    使用RESTART选项与-i一起会导致数据节点执行初始重启;也就是说,节点的文件系统会被删除并重新创建。效果与停止数据节点进程,然后在系统 shell 中使用ndbd --initial重新启动相同。

    注意

    当使用此选项时,备份文件和磁盘数据文件不会被删除。

    使用-n选项会导致数据节点进程重新启动,但数据节点实际上不会上线,直到发出适当的START命令为止。此选项的效果与停止数据节点,然后在系统 shell 中使用ndbd --nostartndbd -n重新启动相同。

    使用-a会导致依赖于此节点的所有当前事务被中止。当节点重新加入集群时,不会执行 GCP 检查。

    通常,如果使节点脱机会导致集群不完整,则RESTART会失败。-f选项会强制节点在不检查此情况下重新启动。如果使用此选项并导致集群不完整,则整个集群会重新启动。

  • SHOW

    显示有关集群和集群节点的基本信息。对于所有节点,输出包括节点的 ID、类型和NDB软件版本。如果节点已连接,还会显示其 IP 地址;否则输出显示not connected, accepting connect from *ip_address*,对于允许从任何地址连接的节点,使用any host

    此外,对于数据节点,如果节点尚未启动,则输出包括starting,并显示节点所属的节点组。如果数据节点充当主节点,则用星号(*)表示。

    考虑一个配置文件包含此处显示的信息的集群(为清晰起见,可能的其他设置被省略):

    [ndbd default]
    DataMemory= 128G
    NoOfReplicas= 2
    
    [ndb_mgmd]
    NodeId=50
    HostName=198.51.100.150
    
    [ndbd]
    NodeId=5
    HostName=198.51.100.10
    DataDir=/var/lib/mysql-cluster
    
    [ndbd]
    NodeId=6
    HostName=198.51.100.20
    DataDir=/var/lib/mysql-cluster
    
    [ndbd]
    NodeId=7
    HostName=198.51.100.30
    DataDir=/var/lib/mysql-cluster
    
    [ndbd]
    NodeId=8
    HostName=198.51.100.40
    DataDir=/var/lib/mysql-cluster
    
    [mysqld]
    NodeId=100
    HostName=198.51.100.100
    
    [api]
    NodeId=101
    

    在启动此集群(包括一个 SQL 节点)后,SHOW显示以下输出:

    ndb_mgm> SHOW
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     4 node(s)
    id=5    @198.51.100.10  (mysql-8.0.35 ndb-8.0.35, Nodegroup: 0, *)
    id=6    @198.51.100.20  (mysql-8.0.35 ndb-8.0.35, Nodegroup: 0)
    id=7    @198.51.100.30  (mysql-8.0.35 ndb-8.0.35, Nodegroup: 1)
    id=8    @198.51.100.40  (mysql-8.0.35 ndb-8.0.35, Nodegroup: 1)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=50   @198.51.100.150  (mysql-8.0.35 ndb-8.0.35)
    
    [mysqld(API)]   2 node(s)
    id=100  @198.51.100.100  (mysql-8.0.35 ndb-8.0.35)
    id=101 (not connected, accepting connect from any host)
    

    此命令的输出还指示集群何时处于单用户模式(请参阅进入单用户模式命令的描述,以及第 25.6.6 节,“NDB 集群单用户模式”)。在 NDB 8.0 中,它还指示在此模式生效时哪个 API 或 SQL 节点具有独占访问权限;这仅在所有连接到集群的数据节点和管理节点运行 NDB 8.0 时有效。

  • SHUTDOWN

    关闭所有集群数据节点和管理节点。在执行此操作后退出管理客户端,请使用EXITQUIT

    此命令不会关闭连接到集群的任何 SQL 节点或 API 节点。

  • *node_id*启动

    将由node_id标识的数据节点(或所有数据节点)在线化。

    ALL START仅对所有数据节点起作用,不影响管理节点。

    重要

    要使用此命令将数据节点在线化,数据节点必须使用--nostart-n启动。

  • *node_id*状态

    显示由node_id标识的数据节点(或所有数据节点)的状态信息。

    可能的节点状态值包括UNKNOWNNO_CONTACTNOT_STARTEDSTARTINGSTARTEDSHUTTING_DOWNRESTARTING

    此命令的输出还指示集群何时处于单用户模式。

  • *node_id* STOP [-a] [-f]

    停止由node_id标识的数据或管理节点。

    注意

    ALL STOP仅用于停止所有数据节点,不影响管理节点。

    受此命令影响的节点会从集群中断开连接,并且其关联的ndbdndb_mgmd进程终止。

    -a选项会导致节点立即停止,而不等待任何待处理事务的完成。

    通常,如果结果导致集群不完整,则STOP会失败。-f选项强制节点关闭而不检查此情况。如果使用此选项且结果是不完整的集群,则集群立即关闭。

    警告

    使用-a选项还会禁用通常在调用STOP时执行的安全检查,以确保停止节点不会导致集群不完整。换句话说,当使用STOP命令时,使用-a选项时应该非常小心,因为该选项使得集群可能会因为不再具有存储在NDB中的所有数据的完整副本而被强制关闭。

附加命令。 ndb_mgm客户端中提供了其他一些命令,如下列表所示:

  • START BACKUP用于在ndb_mgm客户端中执行在线备份;ABORT BACKUP命令用于取消已经进行中的备份。有关更多信息,请参阅第 25.6.8 节,“NDB 集群的在线备份”。

  • CLUSTERLOG命令用于执行各种日志功能。有关更多信息和示例,请参阅第 25.6.3 节,“NDB 集群生成的事件报告”。NODELOG DEBUG激活或停用节点日志中的调试打印输出,如本节先前所述。

  • 用于测试和诊断工作,客户端支持一个DUMP命令,可用于在集群上执行内部命令。除非由 MySQL 支持指示,否则不应在生产环境中使用。有关更多信息,请参阅 NDB 集群管理客户端 DUMP 命令。

25.6.2 NDB 集群日志消息

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-logs-ndb-messages.html

25.6.2.1 NDB 集群:集群日志中的消息

25.6.2.2 NDB 集群日志启动消息

25.6.2.3 集群日志中的事件缓冲区报告

25.6.2.4 NDB 集群:NDB 传输器错误

本节包含有关响应不同集群日志事件而写入集群日志的消息的信息。它提供了有关NDB传输器错误的额外、更具体的信息。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-logs-cluster-log.html

25.6.2.1 NDB 集群:集群日志中的消息

以下表列出了最常见的 NDB 集群日志消息。有关集群日志、日志事件和事件类型的信息,请参阅 第 25.6.3 节 “NDB 集群中生成的事件报告”。这些日志消息还对应于 MGM API 中的日志事件类型;有关集群 API 开发人员感兴趣的相关信息,请参阅 Ndb_logevent_type 类型。

表 25.53 常见 NDB 集群日志消息

日志消息 描述 事件名称 事件类型 优先级 严重性
Node *mgm_node_id*: 节点 *data_node_id* 已连接 具有节点 ID node_id 的数据节点已连接到管理服务器(节点 mgm_node_id)。 已连接 连接 8 信息
Node *mgm_node_id*: 节点 *data_node_id* 已断开连接 具有节点 ID data_node_id 的数据节点已从管理服务器(节点 mgm_node_id)断开连接。 已断开连接 连接 8 警报
Node *data_node_id*: 与节点 *api_node_id* 的通信已关闭 具有节点 ID api_node_id 的 API 节点或 SQL 节点不再与数据节点 data_node_id 进行通信。 通信已关闭 连接 8 信息
Node *data_node_id*: 与节点 *api_node_id* 的通信已打开 具有节点 ID api_node_id 的 API 节点或 SQL 节点现在正在与数据节点 data_node_id 进行通信。 通信已打开 连接 8 信息
Node *mgm_node_id*: 节点 *api_node_id*:API *version* 具有节点 ID api_node_id 的 API 节点已连接到管理节点 mgm_node_id,使用 NDB API 版本 version(通常与 MySQL 版本号相同)。 ConnectedApiVersion 连接 8 信息
Node *node_id*: 全局检查点 *gci* 已启动 具有 ID gci 的全局检查点已启动;节点 node_id 是负责此全局检查点的主节点。 全局检查点已启动 检查点 9 信息
Node *node_id*: 全局检查点 *gci* 已完成 具有 ID gci 的全局检查点已完成;节点 node_id 是负责此全局检查点的主节点。 全局检查点已完成 检查点 10 信息
Node *node_id*: 本地检查点*lcp*已启动。保持 GCI = *current_gci*,最旧可恢复的 GCI = *old_gci* 具有序列 ID lcp 的本地检查点已在节点 node_id 上启动。可以使用的最近的 GCI 具有索引 current_gci,而集群可以恢复的最旧 GCI 具有索引 old_gci LocalCheckpointStarted 检查点 7 信息
Node *node_id*: 本地检查点*lcp*已完成 在节点 node_id 上具有序列 ID lcp 的本地检查点已经完成。 LocalCheckpointCompleted 检查点 8 信息
Node *node_id*: 本地检查点在 CALCULATED_KEEP_GCI 中停止 节点无法确定最近可用的 GCI。 LCPStoppedInCalcKeepGci 检查点 0 警报
Node *node_id*: 表 ID = *table_id*,片段 *ID = fragment_id* 在节点 *node_id* 上完成了 LCP,maxGciStarted: *started_gci* maxGciCompleted: *completed_gci* 一个表片段已经在节点 node_id 上被检查点到磁盘上。正在进行的 GCI 具有索引 started_gci,而最近完成的 GCI 具有索引 completed_gci LCPFragmentCompleted 检查点 11 信息
Node *node_id*: ACC 阻塞了*num_1*次,TUP 阻塞了*num_2*次上一秒 因为日志缓冲区接近溢出,撤销日志记录被阻塞。 UndoLogBlocked 检查点 7 信息
Node *node_id*: 启动初始化*version* 数据节点 node_id,运行NDB版本 version,正在开始启动过程。 NDBStartStarted 启动 1 信息
Node *node_id*: 启动*version*已启动 运行NDB版本 version 的数据节点 node_id 已成功启动。 NDBStartCompleted 启动 1 信息
Node *node_id*: 重启完成后收到 STTORRY 信号 节点收到一个信号,表示集群重启已经完成。 STTORRYRecieved 启动 15 信息
Node *node_id*: 启动阶段*phase*已完成(*type*) 节点已完成type启动的启动阶段phase。有关启动阶段的列表,请参见第 25.6.4 节,“NDB 集群启动阶段总结”。(typeinitialsystemnodeinitial node<未知>之一。) StartPhaseCompleted 启动 4 信息
Node *node_id*: CM_REGCONF 主席 = *president_id*,自己的节点 = *own_id*,我们的动态 ID = *dynamic_id* 节点 president_id 被选为“主席”。own_iddynamic_id 应始终与报告节点的 ID(node_id)相同。 CM_REGCONF 启动 3 信息
Node *node_id*: 来自节点 *president_id* 对我们节点 *node_id* 的 CM_REGREF。原因 = *cause* 报告节点(ID node_id)无法接受节点 president_id 为主席。问题的cause 给出为BusyElection with wait = falseNot presidentElection without selecting new candidateNo such cause之一。 CM_REGREF StartUp 8 INFO
Node *node_id*: 我们是节点 *own_id*,动态 ID 为 *dynamic_id*,左邻节点是节点 *id_1*,右邻节点是节点 *id_2* 节点已发现其在集群中的邻居节点(节点 id_1 和节点 id_2)。node_idown_iddynamic_id 应始终相同;如果它们不同,则表示集群节点配置严重错误。 FIND_NEIGHBOURS StartUp 8 INFO
Node *node_id*: *type* 关闭已启动 节点已接收到关闭信号。关闭的type可以是ClusterNode NDBStopStarted StartUp 1 INFO
Node *node_id*: 节点关闭已完成 [, *action*] [`由信号 `signal` 发起。] 节点已关闭。此报告可能包括一个action,如果存在,则为restartingno startinitial之一。报告还可能包括对NDB协议 signal 的引用;有关可能的信号,请参阅操作和信号。 NDBStopCompleted StartUp 1 INFO
Node *node_id*: 强制节点关闭已完成 [, action]. [发生在启动阶段 *start_phase*。] [signal 发起。] [由错误 *error_code*: '*error_message*(*error_classification*). *error_status*'. [(额外信息 *extra_code*)]] 节点已被强制关闭。随后采取的actionrestartingno startinitial之一)也会报告。如果节点在启动时关闭,报告将包括节点失败的start_phase。如果这是由发送给节点的signal 导致的,还会提供此信息(有关更多信息,请参阅操作和信号)。如果已知导致失败的错误,也会包括在内;有关更多关于NDB错误消息和分类的信息,请参阅 NDB Cluster API 错误。 NDBStopForced StartUp 1 ALERT
Node *node_id*: 节点关闭已中止 用户中止了节点关闭过程。 NDBStopAborted StartUp 1 INFO
节点 *node_id*:StartLog:[GCI 保留:*keep_pos* 最后完成:*last_pos* 最新可恢复:*restore_pos*] 这报告了节点启动期间引用的全局检查点。在 keep_pos 之前的重做日志将被丢弃。last_pos 是数据节点参与的最后一个全局检查点;restore_pos 是实际用于恢复所有数据节点的全局检查点。 StartREDOLog StartUp 4 信息
startup_message [单独列出;请参见下文.] 在不同情况下可能记录的启动消息有很多种。这些将单独列出;请参见第 25.6.2.2 节,“NDB Cluster 日志启动消息”。 StartReport StartUp 4 信息
节点 *node_id*:节点重新启动完成了字典信息的复制 数据字典信息已复制到重新启动的节点 NR_CopyDict NodeRestart 8 信息
节点 *node_id*:节点重新启动完成了分布信息的复制 数据分布信息已复制到重新启动的节点 NR_CopyDistr NodeRestart 8 信息
节点 *node_id*:节点重新启动开始复制片段到节点 *node_id* 开始将片段复制到正在重新启动的数据节点 node_id NR_CopyFragsStarted NodeRestart 8 信息
Node *node_id*:表 ID = *table_id*,片段 ID = *fragment_id* 已复制到节点 *node_id* 来自表 table_id 的片段 fragment_id 已复制到数据节点 node_id NR_CopyFragDone NodeRestart 10 信息
节点 *node_id*:节点重新启动完成了复制片段到节点 *node_id* 将所有表片段复制到重新启动的数据节点 node_id 已完成 NR_CopyFragsCompleted NodeRestart 8 信息
Node *node_id*:节点 *node1_id* 完成了节点 *node2_id* 的故障 数据节点 node1_id 检测到了数据节点 node2_id 的故障 NodeFailCompleted NodeRestart 8 警报
所有节点完成了节点 *node_id* 的故障 所有(剩余)数据节点已检测到数据节点 node_id 的故障 NodeFailCompleted NodeRestart 8 警报
节点 *node_id* 的块故障已完成 NDB内核块中检测到了数据节点 node_id 的故障,其中块是 DBTC 的第 1 块,DBDICTDBDIH,或 DBLQH;更多信息,请参阅 NDB 内核块 NodeFailCompleted NodeRestart 8 警报
节点 *mgm_node_id*: 节点 *data_node_id* 失败。节点在失败时的状态为 *state_code* 一个数据节点失败了。其在失败时的状态由仲裁状态代码 state_code 描述:可能的状态代码值可以在文件include/kernel/signaldata/ArbitSignalData.hpp中找到。 节点失败报告 节点重启 8 警报
主节点重新启动仲裁线程 [状态=*state_code*]准备仲裁节点 *node_id* [票=*ticket_id*]接收仲裁节点 *node_id* [票=*ticket_id*]启动仲裁节点 *node_id* [票=*ticket_id*]丢失仲裁节点 *node_id* - 进程失败 [状态=*state_code*]丢失仲裁节点 *node_id* - 进程退出 [状态=*state_code*]丢失仲裁节点 *node_id* - *error_message* [状态=*state_code*] 这是对集群中仲裁当前状态和进展的报告。node_id是选定为仲裁者的管理节点或 SQL 节点的节点 ID。state_code是一个仲裁状态代码,如include/kernel/signaldata/ArbitSignalData.hpp中所述。当发生错误时,还会提供一个error_message,也在ArbitSignalData.hpp中定义。ticket_id是在选定为仲裁者时由仲裁者分发给所有参与其选择的节点的唯一标识符;这用于确保请求仲裁的每个节点都是参与选择过程的节点之一。 仲裁状态 节点重启 6 信息
仲裁检查失败 - 不到 1/2 节点剩余仲裁检查成功 - 所有节点组和超过 1/2 节点剩余仲裁检查成功 - 节点组多数仲裁检查失败 - 缺少节点组网络分区 - 需要仲裁仲裁成功 - 节点 *node_id*仲裁失败 - 节点 *node_id*网络分区 - 没有仲裁者可用网络分区 - 没有配置仲裁者仲裁失败 - *error_message* [状态=*state_code*] 此消息报告了仲裁的结果。在仲裁失败的情况下,会提供一个error_message和一个仲裁state_code;这两者的定义可以在include/kernel/signaldata/ArbitSignalData.hpp中找到。 仲裁结果 节点重启 2 警报
节点 *node_id*: GCP 接管开始 此节点正在尝试承担下一个全局检查点的责任(即,它正在成为主节点) GCP_ 接管开始 节点重启 7 信息
节点 *node_id*: GCP 接管完成 此节点已成为主节点,并已承担下一个全局检查点的责任 GCP_ 接管完成 节点重启 7 信息
Node *node_id*: LCP 接管已启动 该节点正在尝试承担下一组本地检查点的责任(即成为主节点) LCP_TakeoverStarted NodeRestart 7 INFO
Node *node_id*: LCP 接管已完成 该节点已成为主节点,并已承担下一组本地检查点的责任 LCP_TakeoverCompleted NodeRestart 7 INFO
Node *node_id*: 事务计数 = *transactions*,提交计数 = *commits*,读取计数 = *reads*,简单读取计数 = *simple_reads*,写入计数 = *writes*,AttrInfo 计数 = *AttrInfo_objects*,并发操作 = *concurrent_operations*,中止计数 = *aborts*,扫描 = *scans*,范围扫描 = *range_scans* 大约每 10 秒提供一次的事务活动报告 TransReportCounters Statistic 8 INFO
Node *node_id*: Operations=*operations* 该节点执行的操作数量,大约每 10 秒提供一次 OperationReportCounters Statistic 8 INFO
Node *node_id*: ID 为 *table_id* 的表已创建 已创建具有显示的表 ID 的表 TableCreated Statistic 7 INFO
Node *node_id*: 在 doJob 中最后 8192 次的平均循环计数 = *count* JobStatistic Statistic 9 INFO
平均发送大小到节点 = *node_id* 最后 4096 次发送 = *bytes* 字节 该节点每次发送到节点 node_id 的平均发送 bytes 字节 SendBytesStatistic Statistic 9 INFO
平均接收大小到节点 = *node_id* 最后 4096 次发送 = *bytes* 字节 每次从节点 node_id 接收数据时,该节点平均接收 bytes 字节的数据 ReceiveBytesStatistic Statistic 9 INFO
Node *node_id*: 数据使用率为 *data_memory_percentage*%(*data_pages_used* 32K 页,总共 *data_pages_total*) / Node *node_id*: 索引使用率为 *index_memory_percentage*%(*index_pages_used* 8K 页,总共 *index_pages_total*) 当在集群管理客户端中发出 DUMP 1000 命令时生成此报告 MemoryUsage Statistic 5 INFO
Node *node1_id*: 到节点 *node2_id* 的传输器报告错误 *error_code*: *error_message* 与节点 node2_id 通信时发生传输器错误;有关传输器错误代码和消息的列表,请参阅 NDB 传输器错误,在 MySQL NDB 集群内部手册中 TransporterError Error 2 ERROR
Node *node1_id*: 传输到节点 *node2_id* 报告错误 *error_code*: *error_message* 在与节点 node2_id 通信时出现潜在传输器问题的警告;有关传输器错误代码和消息的列表,请参见 NDB 传输器错误,有关更多信息
Node *node1_id*: 节点 *node2_id* 丢失心跳 *heartbeat_id* 这个节点丢失了来自节点 node2_id 的心跳
Node *node1_id*: 节点 *node2_id* 因丢失心跳而被宣告死亡 这个节点已经至少丢失了来自节点 node2_id 的 3 个心跳,因此宣告该节点“死亡”
Node *node1_id*: 向节点发送心跳 = *node2_id* 这个节点已向节点 node2_id 发送了心跳
Node *node_id*: 事件缓冲区状态 (*object_id*): 已使用=*bytes_used* (*percent_used*% of alloc) 分配=*bytes_allocated* 最大=*bytes_available* 最新消耗的时代=*latest_consumed_epoch* 最新缓冲的时代=*latest_buffered_epoch* 报告原因=*report_reason* 在事件缓冲区使用量较大时出现此报告,例如,在相对较短的时间内应用了许多更新时;报告显示了已使用的事件缓冲区内存的字节数和百分比,仍然可用的字节数和百分比,以及最新的缓冲和消耗时代;有关更多信息,请参见第 25.6.2.3 节,“集群日志中的事件缓冲区报告”
Node *node_id*: 进入单用户模式, Node *node_id*: 进入单用户模式 节点 *API_node_id* 具有独占访问权限, Node *node_id*: 进入单用户模式 当进入和退出单用户模式时,这些报告将被写入集群日志;API_node_id 是具有对集群的独占访问权限的 API 或 SQL 的节点 ID(有关更多信息,请参见第 25.6.6 节,“NDB 集群单用户模式”);消息 未知单用户报告 *API_node_id* 表示发生了错误,正常情况下不应看到
Node *node_id*: 从节点 *mgm_node_id* 开始的备份已启动 使用具有 mgm_node_id 的管理节点启动了备份;当发出START BACKUP命令时,此消息也会显示在集群管理客户端中;有关更多信息,请参阅第 25.6.8.2 节,“使用 NDB 集群管理客户端创建备份” 备份已启动 备份 7 信息
Node *node_id*: 从节点 *mgm_node_id* 开始的备份 *backup_id* 已完成。StartGCP: *start_gcp* StopGCP: *stop_gcp* #记录数:*records* #日志记录数:*log_records* 数据:*data_bytes* 字节 日志:*log_bytes* 字节 具有 ID backup_id 的备份已完成;有关更多信息,请参阅第 25.6.8.2 节,“使用 NDB 集群管理客户端创建备份” 备份已完成 备份 7 信息
Node *node_id*: 来自 *mgm_node_id* 的备份请求启动失败。错误:*error_code* 备份启动失败;有关错误代码,请参阅 MGM API 错误 备份启动失败 备份 7 警报
Node *node_id*: 从 *mgm_node_id* 开始的备份 *backup_id* 已中止。错误:*error_code* 备份在启动后被终止,可能是由于用户干预 备份已中止 备份 7 警报
日志消息 描述 事件名称 事件类型 优先级 严重程度

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-log-startup-messages.html

25.6.2.2 NDB 集群日志启动消息

可能的启动消息及其描述如下列表所示:

  • 初始启动,等待 %s 连接,节点 [ 所有: %s 已连接: %s 无等待: %s ]

  • 等待直到节点 %s 连接,节点 [ 所有: %s 已连接: %s 无等待: %s ]

  • 等待 %u 秒以连接节点 %s,节点 [ 所有: %s 已连接: %s 无等待: %s ]

  • 等待非分区启动,节点 [ 所有: %s 已连接: %s 缺失: %s 无等待: %s ]

  • 等待 %u 秒进行非分区启动,节点 [ 所有: %s 已连接: %s 缺失: %s 无等待: %s ]

  • 初始启动节点为 %s [ 缺失: %s 无等待: %s ]

  • 启动所有节点 %s

  • 启动节点为 %s [ 缺失: %s 无等待: %s ]

  • 启动可能已分区,节点为 %s [ 缺失: %s 无等待: %s ]

  • 未知的启动报告: 0x%x [ %s %s %s %s ]

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-logs-event-buffer.html

25.6.2.3 集群日志中的事件缓冲区报告

NDB使用一个或多个内存缓冲区来存储从数据节点接收的事件。每个订阅表事件的Ndb对象都有一个这样的缓冲区,这意味着每个执行二进制日志记录的mysqld通常有两个缓冲区(一个用于模式事件,一个用于数据事件)。每个缓冲区包含由事件组成的时代。这些事件包括操作类型(插入、更新、删除)和行数据(前后图像加元数据)。

NDB在集群日志中生成消息来描述这些缓冲区的状态。尽管这些报告出现在集群日志中,但它们是指 API 节点上的缓冲区(与大多数其他集群日志消息不同,这些消息是由数据节点生成的)。

集群日志中的事件缓冲区记录使用以下格式:

Node *node_id*: Event buffer status (*object_id*):
used=*bytes_used* (*percent_used*% of alloc)
alloc=*bytes_allocated* (*percent_alloc*% of max) max=*bytes_available*
latest_consumed_epoch=*latest_consumed_epoch*
latest_buffered_epoch=*latest_buffered_epoch*
report_reason=*report_reason*

组成此报告的字段在此处列出,并附有描述:

  • node_id: 报告来源节点的 ID。

  • object_id: 报告来源的Ndb对象的 ID。

  • bytes_used: 缓冲区使用的字节数。

  • percent_used: 使用的分配字节的百分比。

  • bytes_allocated: 分配给此缓冲区的字节数。

  • percent_alloc: 使用的可用字节的百分比;如果ndb_eventbuffer_max_alloc等于 0(无限制),则不打印。

  • bytes_available: 可用字节数;如果ndb_eventbuffer_max_alloc为 0(无限制),则为 0。

  • latest_consumed_epoch: 最近完全消耗的时代。(在 NDB API 应用程序中,通过调用nextEvent()来完成。)

  • latest_buffered_epoch: 最近在事件缓冲区中缓冲的时代。

  • report_reason: 报告原因。可能的原因稍后在本节中显示。

报告原因的可能原因在以下列表中描述:

  • ENOUGH_FREE_EVENTBUFFER:事件缓冲��有足够的空间。

    LOW_FREE_EVENTBUFFER:事件缓冲区的剩余空间不足。

    触发这些报告的阈值空闲百分比水平可以通过设置ndb_report_thresh_binlog_mem_usage服务器变量来调整。

  • BUFFERED_EPOCHS_OVER_THRESHOLD: 缓存的时代数量是否超过了配置的阈值。这个数字是已完整接收的最新时代与最近被消耗的时代之间的差异(在 NDB API 应用程序中,通过调用nextEvent()nextEvent2()来完成)。报告每秒生成一次,直到缓存的时代数量低于阈值,可以通过设置ndb_report_thresh_binlog_epoch_slip服务器变量来调整阈值。您还可以通过调用setEventBufferQueueEmptyEpoch()在 NDB API 应用程序中调整阈值。

  • PARTIALLY_DISCARDING: 事件缓冲内存已经耗尽,即已使用了 100%的ndb_eventbuffer_max_alloc。任何部分缓存的时代都会被完全缓存,即使使用率超过 100%,但任何接收到的新时代都会被丢弃。这意味着事件流中出现了间隙。

  • COMPLETELY_DISCARDING: 不会缓存任何时代。

  • PARTIALLY_BUFFERING: 在间隙之后,缓冲区的空闲百分比已经上升到阈值,在mysql客户端中可以使用ndb_eventbuffer_free_percent服务器系统变量或在 NDB API 应用程序中通过调用set_eventbuffer_free_percent()来设置阈值。新的时代被缓存。由于间隙而无法完成的时代被丢弃。

  • COMPLETELY_BUFFERING: 所有接收到的时代都正在被缓存,这意味着有足够的事件缓冲内存。事件流中的间隙已经被关闭。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-ndb-transporter-errors.html

25.6.2.4 NDB Cluster: NDB Transporter Errors

此部分列出了在传输器错误发生时写入集群日志的错误代码、名称和消息。

0x00

TE_NO_ERROR

无错误

0x01

TE_ERROR_CLOSING_SOCKET

关闭套接字时发现错误

0x02

TE_ERROR_IN_SELECT_BEFORE_ACCEPT

在接受之前发现错误。传输器将重试

0x03

TE_INVALID_MESSAGE_LENGTH

在消息中发现错误(无效的消息长度)

0x04

TE_INVALID_CHECKSUM

在消息中发现错误(校验和)

0x05

TE_COULD_NOT_CREATE_SOCKET

创建套接字时发现错误(无法创建套接字)

0x06

TE_COULD_NOT_BIND_SOCKET

绑定服务器套接字时发现错误

0x07

TE_LISTEN_FAILED

监听服务器套接字时发现错误

0x08

TE_ACCEPT_RETURN_ERROR

在 accept 期间发现错误(接受返回错误)

0x0b

TE_SHM_DISCONNECT

远程节点已断开连接

0x0c

TE_SHM_IPC_STAT

无法检查 shm 段

0x0d

TE_SHM_UNABLE_TO_CREATE_SEGMENT

无法创建 shm 段

0x0e

TE_SHM_UNABLE_TO_ATTACH_SEGMENT

无法附加 shm 段

0x0f

TE_SHM_UNABLE_TO_REMOVE_SEGMENT

无法移除 shm 段

0x10

TE_TOO_SMALL_SIGID

Sig ID 太小

0x11

TE_TOO_LARGE_SIGID

Sig ID 太大

0x12

TE_WAIT_STACK_FULL

等待堆栈已满

0x13

TE_RECEIVE_BUFFER_FULL

接收缓冲区已满

0x14

TE_SIGNAL_LOST_SEND_BUFFER_FULL

发送缓冲区已满,并且尝试强制发送失败

0x15

TE_SIGNAL_LOST

发送失败原因未知(信号丢失)

0x16

TE_SEND_BUFFER_FULL

发送缓冲区已满,但睡一会解决了问题

0x21

TE_SHM_IPC_PERMANENT

Shm ipc Permanent 错误

注意

传输器错误代码 0x17 到 0x20 和 0x22 保留用于 SCI 连接,在此版本的 NDB Cluster 中不支持,因此未包含在此处。

25.6.3 在 NDB Cluster 中生成的事件报告

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-event-reports.html

25.6.3.1 NDB Cluster Logging Management Commands

25.6.3.2 NDB Cluster Log Events

25.6.3.3 在 NDB Cluster 管理客户端中使用 CLUSTERLOG STATISTICS

在本节中,我们讨论 NDB Cluster 提供的事件日志类型,以及记录的事件类型。

NDB Cluster 提供两种类型的事件日志:

  • 集群日志,其中包括所有集群节点生成的事件。集群日志是推荐用于大多数情况的日志,因为它提供了整个集群的日志信息。

    默认情况下,集群日志保存在名为ndb_*node_id*_cluster.log的文件中(其中node_id是管理服务器的节点 ID),位于管理服务器的DataDir中。

    集群日志信息也可以发送到stdoutsyslog设施,而不是或除了保存到文件中,这取决于为DataDirLogDestination配置参数设置的值。有关这些参数的更多信息,请参见 Section 25.4.3.5, “Defining an NDB Cluster Management Server”。

  • 节点日志对每个节点是本地的。

    节点事件日志生成的输出被写入文件ndb_*node_id*_out.log(其中node_id是节点的节点 ID),位于节点的DataDir中。节点事件日志为管理节点和数据节点生成。

    节点日志仅用于应用程序开发或调试应用程序代码。

每个可报告事件可以根据三个不同的标准进行区分:

  • 类别:可以是以下任一值之一:STARTUPSHUTDOWNSTATISTICSCHECKPOINTNODERESTARTCONNECTIONERRORINFO

  • 优先级:表示为从 0 到 15 的数字之一,其中 0 表示“最重要”,15 表示“最不重要”。

  • 严重级别:可以是以下任一值之一:ONDEBUGINFOWARNINGERRORCRITICALALERTALL。(有时也称为日志级别。)

可使用 NDB 管理客户端CLUSTERLOG命令在这些属性上过滤集群日志。此命令仅影响集群日志,并不影响节点日志;可以使用ndb_mgm NODELOG DEBUG 命令打开和关闭一个或多个节点日志中的调试日志记录。

NDB Cluster 生成的日志消息的格式(截至 NDB 8.0.26)如下所示:

*timestamp* [*node_type*] *level* -- Node *node_id*: *message*

日志中的每行,或日志消息,包含以下信息:

  • *YYYY*-*MM*-*DD* *HH*:*MM*:*SS*格式的timestamp。时间戳值目前仅解析到整秒;不支持小数秒。

  • node_type,即执行日志记录的节点或应用程序的类型。在集群日志中,这始终是[MgmSrvr];在数据节点日志中,始终是[ndbd]。在由 NDB API 应用程序和工具生成的日志中可能出现[NdbApi]和其他值。

  • 事件的level,有时也称为其严重级别或日志级别。有关严重级别的更多信息,请参见本节前面以及第 25.6.3.1 节,“NDB Cluster 日志管理命令”。

  • 报告事件的节点的 ID(node_id)。

  • 包含事件描述的message。日志中出现的最常见事件类型是集群中不同节点之间的连接和断开连接,以及发生检查点时。在某些情况下,描述可能包含状态或其他信息。

这里显示了实际集群日志中的示例:

2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Start phase 5 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Start phase 5 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Start phase 6 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Start phase 6 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: President restarts arbitration thread [state=1]
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Start phase 7 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Start phase 7 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Start phase 8 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Start phase 8 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Start phase 9 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Start phase 9 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Start phase 50 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Start phase 50 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Start phase 101 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Start phase 101 completed (system restart)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Started (mysql-8.0.35 ndb-8.0.35)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Started (mysql-8.0.35 ndb-8.0.35)
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 5: Node 50: API mysql-8.0.35 ndb-8.0.35
2021-06-10 10:01:07 [MgmtSrvr] INFO     -- Node 6: Node 50: API mysql-8.0.35 ndb-8.0.35
2021-06-10 10:01:08 [MgmtSrvr] INFO     -- Node 6: Prepare arbitrator node 50 [ticket=75fd00010fa8b608]
2021-06-10 10:01:08 [MgmtSrvr] INFO     -- Node 5: Started arbitrator node 50 [ticket=75fd00010fa8b608]
2021-06-10 10:01:08 [MgmtSrvr] INFO     -- Node 6: Communication to Node 100 opened
2021-06-10 10:01:08 [MgmtSrvr] INFO     -- Node 6: Communication to Node 101 opened
2021-06-10 10:01:08 [MgmtSrvr] INFO     -- Node 5: Communication to Node 100 opened
2021-06-10 10:01:08 [MgmtSrvr] INFO     -- Node 5: Communication to Node 101 opened
2021-06-10 10:01:36 [MgmtSrvr] INFO     -- Alloc node id 100 succeeded
2021-06-10 10:01:36 [MgmtSrvr] INFO     -- Nodeid 100 allocated for API at 127.0.0.1
2021-06-10 10:01:36 [MgmtSrvr] INFO     -- Node 100: mysqld --server-id=1
2021-06-10 10:01:36 [MgmtSrvr] INFO     -- Node 5: Node 100 Connected
2021-06-10 10:01:36 [MgmtSrvr] INFO     -- Node 6: Node 100 Connected
2021-06-10 10:01:36 [MgmtSrvr] INFO     -- Node 5: Node 100: API mysql-8.0.35 ndb-8.0.35
2021-06-10 10:01:36 [MgmtSrvr] INFO     -- Node 6: Node 100: API mysql-8.0.35 ndb-8.0.35

有关更多信息,请参见第 25.6.3.2 节,“NDB Cluster 日志事件”。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-logging-management-commands.html

25.6.3.1 NDB Cluster Logging Management Commands

ndb_mgm支持与集群日志和节点日志相关的许多管理命令。在接下来的列表中,node_id表示存储节点 ID 或关键字ALL,表示该命令应用于所有集群的数据节点。

  • CLUSTERLOG ON

    打开集群日志。

  • CLUSTERLOG OFF

    关闭集群日志。

  • CLUSTERLOG INFO

    提供有关集群日志设置的信息。

  • *node_id* CLUSTERLOG *category*=*threshold*

    在集群日志中记录category事件,其优先级小于或等于threshold

  • CLUSTERLOG FILTER *severity_level*

    切换指定severity_level事件的集群日志记录。

以下表描述了集群日志类别阈值的默认设置(所有数据节点)。如果事件的优先级值低于或等于优先级阈值,则会在集群日志中报告。

注意

事件按数据节点报告,并且阈值可以在不同节点上设置为不同值。

表 25.54 集群日志类别,默认阈值设置

Category 默认阈值(所有数据节点)
STARTUP 7
SHUTDOWN 7
STATISTICS 7
CHECKPOINT 7
NODERESTART 7
CONNECTION 8
ERROR 15
INFO 7
BACKUP 15
CONGESTION 7
SCHEMA 7
Category 默认阈值(所有数据节点)

STATISTICS类别可以提供大量有用的数据。有关更多信息,请参见第 25.6.3.3 节,“在 NDB Cluster 管理客户端中使用 CLUSTERLOG STATISTICS”。

阈值用于过滤每个类别中的事件。例如,具有优先级 3 的STARTUP事件除非STARTUP的阈值设置为 3 或更高,否则不会记录。如果阈值为 3,则只发送优先级为 3 或更低的事件。

以下表显示了事件严重级别。

注意

这些对应于 Unix 的syslog级别,除了未使用或映射的LOG_EMERGLOG_NOTICE

表 25.55 事件严重级别

严重级别值 严重级别 描述
1 ALERT 应立即纠正的条件,比如损坏的系统数据库
2 CRITICAL 临界条件,比如设备错误或资源不足
3 ERROR 需要纠正的条件,比如配置错误
4 WARNING 不是错误的条件,但可能需要特殊处理
5 INFO 信息消息
6 DEBUG 用于NDBCLUSTER开发的调试消息

事件严重级别可以通过CLUSTERLOG FILTER(见上文)打开或关闭。如果打开了一个严重级别,那么所有优先级小于或等于类别阈值的事件都会被记录下来。如果关闭了严重级别,则不会记录属于该严重级别的任何事件。

重要提示

集群日志级别是根据每个ndb_mgmd、每个订阅者的基础进行设置。这意味着,在具有多个管理服务器的 NDB 集群中,使用连接到一个管理服务器的ndb_mgm实例中的CLUSTERLOG命令仅影响由该管理服务器生成的日志,而不影响其他任何管理服务器生成的日志。这也意味着,如果其中一个管理服务器重新启动,那么只有由该管理服务器生成的日志会受到由重新启动引起的日志级别重置的影响。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-log-events.html

25.6.3.2 NDB 集群日志事件

事件日志中报告的事件报告具有以下格式:

*datetime* [*string*] *severity* -- *message*

例如:

09:19:30 2005-07-24 [NDB] INFO -- Node 4 Start phase 4 completed

本节讨论按类别和每个类别内的严重级别排序的所有可报告事件。

在事件描���中,GCP 和 LCP 分别表示“全局检查点”和“本地检查点”。

连接事件

这些事件与集群节点之间的连接相关联。

表 25.56 与集群节点之间连接相关的事件

事件 优先级 严重级别 描述
Connected 8 INFO 数据节点已连接
Disconnected 8 ALERT 数据节点断开连接
CommunicationClosed 8 INFO SQL 节点或数据节点连接已关闭
CommunicationOpened 8 INFO SQL 节点或数据节点连接已打开
ConnectedApiVersion 8 INFO 使用 API 版本连接
检查点事件

此处显示的日志消息与检查点相关。

表 25.57 与检查点相关的事件

事件 优先级 严重级别 描述
GlobalCheckpointStarted 9 INFO GCP 开始:REDO 日志写入磁盘
GlobalCheckpointCompleted 10 INFO GCP 完成
LocalCheckpointStarted 7 INFO LCP 开始:数据写入磁盘
LocalCheckpointCompleted 7 INFO LCP 正常完成
LCPStoppedInCalcKeepGci 0 ALERT LCP 停止
LCPFragmentCompleted 11 INFO 片段上的 LCP 已完成
UndoLogBlocked 7 INFO UNDO 日志记录被阻止;缓冲区接近溢出
RedoStatus 7 INFO 重做状态
启动事件

以下事件是响应节点或集群启动及其成功或失败而生成的。它们还提供与启动过程的进展相关的信息,包括有关日志活动的信息。

表 25.58 与节点或集群启动相关的事件

事件 优先级 严重级别 描述
NDBStartStarted 1 INFO 数据节点启动阶段已启动(所有节点启动)
NDBStartCompleted 1 INFO 启动阶段完成,所有数据节点
STTORRYRecieved 15 INFO 重新启动完成后接收的块
StartPhaseCompleted 4 INFO 数据节点启动阶段 X 完成
CM_REGCONF 3 INFO 节点已成功包含在集群中;显示节点、管理节点和动态 ID
CM_REGREF 8 INFO 节点被拒绝加入集群;由于配置错误、无法建立通信或其他问题,无法加入集群
FIND_NEIGHBOURS 8 INFO 显示相邻数据节点
NDBStopStarted 1 INFO 数据节点关闭已启动
NDBStopCompleted 1 INFO 数据节点关闭完成
NDBStopForced 1 ALERT 强制关闭数据节点
NDBStopAborted 1 INFO 无法正常关闭数据节点
StartREDOLog 4 INFO 新重做日志已开始;GCI 保持 X,最新可恢复的 GCI Y
StartLog 10 INFO 新日志已开始;日志部分 X,起始 MB Y,结束 MB Z
UNDORecordsExecuted 15 INFO 撤销记录已执行
StartReport 4 INFO 报告已开始
LogFileInitStatus 7 INFO 日志文件初始化状态
LogFileInitCompStatus 7 INFO 日志文件完成状态
StartReadLCP 10 INFO 开始读取本地检查点
ReadLCPComplete 10 INFO 读取本地检查点已完成
RunRedo 8 INFO 运行重做日志
RebuildIndex 10 INFO 重建索引
事件 优先级 严重级别 描述
NODERESTART 事件

当重新启动节点并与节点重新启动过程的成功或失败相关时,将生成以下事件。

表 25.59 与重新启动节点相关的事件

事件 优先级 严重级别 描述
NR_CopyDict 7 INFO 完成复制字典信息
NR_CopyDistr 7 INFO 完成复制分布信息
NR_CopyFragsStarted 7 INFO 开始复制片段
NR_CopyFragDone 10 INFO 完成复制片段
NR_CopyFragsCompleted 7 INFO 完成复制所有片段
NodeFailCompleted 8 ALERT 节点故障阶段已完成
NODE_FAILREP 8 ALERT 报告节点故障

| ArbitState | 6 | INFO | 报告是否找到仲裁者;在寻找仲裁者时有七种不同的可能结果,列在此处:

  • 管理服务器重新启动仲裁线程 [状态=X]

  • 准备仲裁节点 X [票=Y]

  • 接收仲裁节点 X [票=Y]

  • 启动仲裁节点 X [票=Y]

  • 丢失仲裁节点 X - 进程失败 [状态=Y]

  • 丢失仲裁节点 X - 进程退出 [状态=Y]

  • 丢失仲裁���点 X <错误消息> [状态=Y]

|

| ArbitResult | 2 | ALERT | 报告仲裁结果;仲裁尝试有八种不同的可能结果,列在此处:

  • 仲裁检查失败:少于 1/2 的节点剩余

  • 仲裁检查成功:节点组多数

  • 仲裁检查失败:缺少节点组

  • 网络分区:需要仲裁

  • 仲裁成功:来自节点 X 的肯定回应

  • 仲裁失败:来自节点 X 的负面回应

  • 网络分区:没有可用的仲裁节点

  • 网络分区:未配置仲裁节点

|

GCP_TakeoverStarted 7 INFO GCP 接管已启动
GCP_TakeoverCompleted 7 INFO GCP 接管已完成
LCP_TakeoverStarted 7 INFO LCP 接管已启动
LCP_TakeoverCompleted 7 INFO LCP 接管完成(状态 = X
ConnectCheckStarted 6 INFO 连接检查已启动
ConnectCheckCompleted 6 INFO 连接检查已完成
NodeFailRejected 6 ALERT 节点故障阶段失败
事件 优先级 严重级别 描述
统计事件

以下事件具有统计性质。它们提供诸如事务数和其他操作数、单个节点发送或接收的数据量以及内存使用情况等信息。

表 25.60 统计性质事件

事件 优先级 严重级别 描述
TransReportCounters 8 INFO 报告事务统计信息,包括事务数、提交数、读取数、简单读取数、写入数、并发操作、属性信息和中止数
OperationReportCounters 8 INFO 操作数
TableCreated 7 INFO 报告创建的表数
JobStatistic 9 INFO 平均内部作业调度统计
ThreadConfigLoop 9 INFO 线程配置循环数
SendBytesStatistic 9 INFO 发送到节点 X 的平均字节数
ReceiveBytesStatistic 9 INFO 从节点 X 接收的平均字节数
MemoryUsage 5 INFO 数据和索引内存使用情况(80%、90%和 100%)
MTSignalStatistics 9 INFO 多线程信号
模式事件

这些事件涉及 NDB 集群模式操作。

表 25.61 与 NDB 集群模式操作相关的事件

事件 优先级 严重级别 描述
CreateSchemaObject 8 INFO 创建模式对象
AlterSchemaObject 8 INFO 模式对象已更新
DropSchemaObject 8 INFO 模式对象已删除
错误事件

这些事件涉及集群错误和警告。其中一个或多个的存在通常表示发生了重大故障或失败。

表 25.62 与集群错误和警告相关的事件

事件 优先级 严重级别 描述
TransporterError 2 ERROR 传输器错误
TransporterWarning 8 WARNING 传输器警告
MissedHeartbeat 8 WARNING 节点 X 错过心跳次数 Y
DeadDueToHeartbeat 8 ALERT 节点 X 因错过心跳被宣布“死亡”
WarningEvent 2 WARNING 一般警告事件
SubscriptionStatus 4 WARNING 订阅状态变更
信息事件

这些事件提供有关集群状态和与集群维护相关活动的一般信息,例如日志记录和心跳传输。

表 25.63 信息事件

事件 优先级 严重级别 描述
SentHeartbeat 12 INFO 发送心跳
CreateLogBytes 11 INFO 创建日志:日志部分、日志文件、大小(MB)
InfoEvent 2 INFO 一般信息事件
EventBufferStatus 7 INFO 事件缓冲区状态
EventBufferStatus2 7 INFO 改进的事件缓冲区状态信息

注意

SentHeartbeat 事件仅在使用 VM_TRACE 编译的 NDB Cluster 中可用。

单用户事件

这些事件与进入和退出单用户模式相关联。

表 25.64 与单用户模式相关的事件

事件 优先级 严重级别 描述
SingleUser 7 INFO 进入或退出单用户模式
备份事件

这些事件提供有关创建或恢复备份的信息。

表 25.65 备份事件

事件 优先级 严重级别 描述
BackupStarted 7 INFO 备份开始
BackupStatus 7 INFO 备份状态
BackupCompleted 7 INFO 备份完成
BackupFailedToStart 7 ALERT 备份启动失败
BackupAborted 7 ALERT 用户中止备份
RestoreStarted 7 INFO 开始从备份恢复
RestoreMetaData 7 INFO 恢复元数据
RestoreData 7 INFO 恢复数据
RestoreLog 7 INFO 恢复日志文件
RestoreCompleted 7 INFO 备份恢复完成
SavedEvent 7 INFO 事件已保存
事件 优先级 严重级别 描述

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-log-statistics.html

25.6.3.3 在 NDB Cluster 管理客户端中使用 CLUSTERLOG STATISTICS

NDB管理客户端的CLUSTERLOG STATISTICS命令可以在其输出中提供许多有用的统计信息。提供有关集群状态的计数器每 5 秒由事务协调器 (TC) 和本地查询处理程序 (LQH) 更新一次,并写入集群日志。

事务协调器统计信息。 每个事务都有一个事务协调器,可以通过以下方法之一选择:

  • 以轮询方式

  • 通过通信接近度

  • 在事务启动时提供数据放置提示

注意

你可以通过ndb_optimized_node_selection系统变量确定从给定 SQL 节点开始的事务使用哪种 TC 选择方法。

同一事务内的所有操作使用相同的事务协调器,报告以下统计信息:

  • 事务计数。 这是在上一个间隔内使用此 TC 作为事务协调器启动的事务数量。这些事务中的任何一个可能已提交、已中止或在报告间隔结束时仍未提交。

    注意

    事务不会在 TC 之间迁移。

  • 提交计数。 这是在上一个报告间隔内使用此 TC 作为事务协调器提交的事务数量。因为一些在此报告间隔内提交的事务可能在之前的报告间隔内启动,所以提交计数可能大于事务计数

  • 读取计数。 这是在上一个报告间隔内使用此 TC 作为事务协调器启动的主键读取操作次数,包括简单读取。此计数还包括作为唯一索引操作的读取。唯一索引读取操作生成 2 个主键读取操作——一个用于隐藏的唯一索引表,一个用于读取发生的表。

  • 简单读取计数。 这是在上一个报告间隔内使用此 TC 作为事务协调器启动的简单读取操作次数。

  • 写入计数。 这是在上一个报告间隔内以此 TC 作为事务协调器启动的主键写入操作次数。这包括所有插入、更新、写入和删除操作,以及作为唯一索引操作的写入。

    注意

    唯一索引更新操作可能在索引表和基表上生成多个主键读取和写入操作。

  • **AttrInfoCount. ** 这是在上一个报告间隔中接收的 32 位数据字的数量,用于使用此 TC 作为事务协调器的主键操作。对于读取操作,这与请求的列数成比例。对于插入和更新操作,这与写入的列数以及它们的数据大小成比例。对于删除操作,这通常为零。

    唯一索引操作会生成多个 PK 操作,因此会增加此计数。但是,用于描述 PK 操作本身的数据字以及发送的关键信息在此处计入。用于描述扫描读取的列或描述 ScanFilters 的属性信息也不计入 AttrInfoCount

  • **Concurrent Operations. ** 这是在上一个报告间隔中启动但未完成的使用此 TC 作为事务协调器的主键或扫描操作的数量。当操作启动时,此计数器会递增,并在操作完成后递减;这发生在事务提交后。脏读和写操作以及失败的操作会递减此计数器。

    Concurrent Operations 可以达到的最大值是 TC 块可以支持的操作数的最大值;目前,这是 (2 * MaxNoOfConcurrentOperations) + 16 + MaxNoOfConcurrentTransactions。(有关这些配置参数的更多信息,请参见 25.4.3.6 节,“定义 NDB 集群数据节点”的事务参数部分。)

  • **Abort count. ** 这是在上一个报告间隔中被中止的使用此 TC 作为事务协调器的事务的数量。因为在上一个报告间隔中被中止的一些事务可能在先前的报告间隔中开始,Abort count 有时可能大于 Trans count

  • **Scans. ** 这是在上一个报告间隔中启动的使用此 TC 作为事务协调器的表扫描的数量。这不包括范围扫描(即,有序索引扫描)。

  • **Range scans. ** 这是在上一个报告间隔中启动的使用此 TC 作为事务协调器的有序索引扫描的数量。

  • **Local reads. ** 这是在一个节点上使用事务协调器执行的主键读取操作的数量,该节点还保存记录的主键片段副本。此计数也可以从ndbinfo.counters表中的 LOCAL_READS 计数器中获取。

  • 本地写入。 这包含使用事务协调器在同时还持有记录主要片段副本的节点上执行的主键读取操作的数量。此计数也可以从ndbinfo.counters表中的LOCAL_WRITES计数器中获取。

本地查询处理程序统计信息(操作)。 每个本地查询处理程序块(即每个数据节点进程)有 1 个集群事件。操作记录在数据所在的 LQH 中。

注意

单个事务可能操作存储在多个 LQH 块中的数据。

Operations统计数据提供了此 LQH 块在上一个报告间隔中执行的本地操作数量,并包括所有类型的读取和写入操作(插入、更新、写入和删除操作)。这还包括用于复制写入的操作。例如,在具有两个片段副本的集群中,对主要片段副本的写入记录在主 LQH 中,对备份的写入记录在备份 LQH 中。唯一键操作可能导致多个本地操作;但是,这包括由于表扫描或有序索引扫描而生成的本地操作,这些操作不计入统计。

进程调度器统计信息。 除了事务协调器和本地查询处理程序报告的统计信息外,每个ndbd进程都有一个调度程序,还提供与 NDB Cluster 性能相关的有用指标。此调度程序在无限循环中运行;在每个循环期间,调度程序执行以下任务:

  1. 从套接字中读取任何传入的消息到作业缓冲区中。

  2. 检查是否有任何定时消息需要执行;如果有,也将这些放入作业缓冲区中。

  3. 执行(循环执行)作业缓冲区中的任何消息。

  4. 发送通过执行作业缓冲区中的消息生成的任何分布式消息。

  5. 等待任何新到来的消息。

进程调度器统计信息包括以下内容:

  • 平均循环计数器。 这是从前述列表的第三步中执行的循环次数。随着 TCP/IP 缓冲区的利用率提高,此统计数据会增加。您可以使用此功能来监视随着添加新数据节点进程而发生的性能变化。

  • 平均发送大小和平均接收大小。 这些统计数据使您能够衡量节点之间的写入和读取的效率。这些值以字节为单位给出。较高的值意味着每个字节发送或接收的成本较低;最大值为 64K。

要导致记录所有集群日志统计信息,您可以在NDB管理客户端中使用以下命令:

ndb_mgm> ALL CLUSTERLOG STATISTICS=15

注意

STATISTICS的阈值设置为 15 会导致集群日志变得非常冗长,并且随着集群节点数量和 NDB 集群中活动量的增加而迅速增长。

有关与日志记录和报告相关的 NDB 集群管理客户端命令的更多信息,请参见第 25.6.3.1 节,“NDB 集群日志管理命令”。

25.6.4 NDB 集群启动阶段摘要

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-start-phases.html

本节提供了 NDB 集群数据节点启动时涉及的步骤的简化概述。更完整的信息可以在 NDB 集群启动阶段中找到,NDB内部指南中。

这些阶段与管理客户端中*node_id* STATUS命令输出中报告的相同(请参见第 25.6.1 节,“NDB 集群管理客户端中的命令”)。这些启动阶段也在ndbinfo.nodes表的start_phase列中报告。

启动类型。 有几种不同的启动类型和模式,如下列表所示:

  • 初始启动。 集群在所有数据节点上都有一个干净的文件系统启动。这要么是当集群第一次启动时发生,要么是当所有数据节点使用--initial选项重新启动时发生。

    注意

    使用--initial重新启动节点时,磁盘数据文件不会被删除。

  • 系统重新启动。 集群启动并读取存储在数据节点中的数据。当集群在使用后关闭后,希望集群从离开的地方恢复操作时发生。

  • 节点重新启动。 这是在集群本身正在运行时对集群节点进行在线重新启动。

  • 初始节点重新启动。 这与节点重新启动相同,只是节点被重新初始化并以干净的文件系统启动。

设置和初始化(阶段-1)。 在启动之前,每个数据节点(ndbd进程)必须被初始化。初始化包括以下步骤:

  1. 获取节点 ID

  2. 获取配置数据

  3. 为节点间通信分配端口

  4. 根据配置文件中的设置分配内存

当数据节点或 SQL 节点首次连接到管理节点时,它会保留一个集群节点 ID。为了确保没有其他节点分配相同的节点 ID,此 ID 将保留,直到节点成功连接到集群并至少一个ndbd报告此节点已连接。此节点 ID 的保留由问题节点与ndb_mgmd之间的连接保护。

在每个数据节点初始化后,集群启动过程可以继续进行。集群在此过程中经历的阶段如下:

  • 第 0 阶段。 NDBFSNDBCNTR 块启动。对于使用 --initial 选项启动的数据节点,这些数据节点的文件系统会被清除。

  • 第 1 阶段。 在此阶段,所有剩余的 NDB 内核块启动。建立 NDB 集群连接,建立块间通信,并启动心跳。在节点重新启动的情况下,还会检查 API 节点连接。

    注意

    当一个或多个节点在第 1 阶段挂起,而其余节点在第 2 阶段挂起时,通常表示存在网络问题。造成此类问题的一个可能原因是一个或多个集群主机具有多个网络接口。导致此条件的问题的另一个常见来源是阻止集群节点之间通信所需的 TCP/IP 端口。在后一种情况下,这通常是由于防火墙配置错误造成的。

  • 第 2 阶段。 NDBCNTR 内核块检查所有现有节点的状态。选择主节点,并初始化集群模式文件。

  • 第 3 阶段。 DBLQHDBTC 内核块之间建立通信。确定启动类型;如果这是一个重新启动,DBDIH 块获得执行重新启动的权限。

  • 第 4 阶段。 对于初始启动或初始节点重新启动,会创建重做日志文件。这些文件的数量等于 NoOfFragmentLogFiles

    对于系统重新启动:

    • 读取模式或模式。

    • 从本地检查点读取数据。

    • 应用所有重做信息,直到达到最新可恢复的全局检查点。

    对于节点重新启动,找到重做日志的尾部。

  • 第 5 阶段。 数据节点启动的大部分与数据库相关的工作在此阶段完成。对于初始启动或系统重新启动,会执行本地检查点,然后是全局检查点。在此阶段开始定期检查内存使用情况,并执行任何必要的节点接管。

  • 第 6 阶段。 在此阶段,定义并设置节点组。

  • 第 7 阶段。 选择仲裁节点并开始运行。设置下一个备份 ID,以及备份磁盘写入速度。达到此启动阶段���节点被标记为已启动。现在 API 节点(包括 SQL 节点)可以连接到集群。

  • 第 8 阶段。 如果这是系统重新启动,所有索引都将被重建(由DBDIH)。

  • 第 9 阶段。 节点内部启动变量被重置。

  • 第 100 阶段(已过时)。 以前,在节点重新启动或初始节点重新启动期间,API 节点可以连接到节点并开始接收事件。目前,此阶段为空。

  • 第 101 阶段。 在节点重新启动或初始节点重新启动期间,事件传递被移交给加入集群的节点。新加入的节点负责将其主要数据传递给订阅者。这个阶段也被称为SUMA移交阶段。

初始启动或系统重新启动完成后,事务处理被启用。对于节点重新启动或初始节点重新启动,启动过程的完成意味着节点现在可以充当事务协调器。

25.6.5 执行 NDB Cluster 的滚动重启

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-rolling-restart.html

本节讨论如何执行 NDB Cluster 安装的滚动重启,因为它涉及逐个停止和启动(或重启)每个节点,以确保集群本身保持运行。这通常作为滚动升级或滚动降级的一部分进行,其中集群的高可用性是必需的,整个集群不允许停机。在我们提到升级时,这里提供的信息通常也适用于降级。

有许多原因可能希望进行滚动重启。这些原因在接下来的几段中描述。

配置更改。 对集群的配置进行更改,例如向集群添加 SQL 节点,或将配置参数设置为新值。

NDB Cluster 软件升级或降级。 将集群升级到 NDB Cluster 软件的新版本(或将其降级到旧版本)。这通常被称为“滚动升级”(或“滚动降级”,当恢复到 NDB Cluster 的旧版本时)。

节点主机更改。 对运行一个或多个 NDB Cluster 节点进程的硬件或操作系统进行更改。

系统重置(集群重置)。 重置集群,因为它已经达到一个不良状态。在这种情况下,通常希望重新加载一个或多个数据节点的数据和元数据。这可以通过以下三种方式之一完成:

  • 使用--initial选项启动每个数据节点进程(ndbd或可能是ndbmtd),该选项强制数据节点清除其文件系统,并从其他数据节点重新加载所有 NDB Cluster 数据和元数据。

    从 NDB 8.0.21 开始,这还会强制删除与这些对象相关的所有磁盘数据对象和文件。

  • 使用ndb_mgm客户端的START BACKUP命令创建备份,然后执行重启操作。升级后,使用ndb_restore来恢复节点或节点。

    查看 Section 25.6.8, “Online Backup of NDB Cluster”和 Section 25.5.23, “ndb_restore — Restore an NDB Cluster Backup”获取更多信息。

  • 使用mysqldump在升级之前创建备份;之后,使用LOAD DATA来恢复备份。

资源回收。 通过连续的INSERTDELETE操作释放先前分配给表的内存,以便其他 NDB Cluster 表重复使用。

执行滚动重启的过程可以概括如下:

  1. 停止所有集群管理节点(ndb_mgmd进程),重新配置它们,然后重新启动它们。 (参见使用多个管理服务器进行滚动重启.)

  2. 依次停止、重新配置,然后重新启动每个集群数据节点(ndbd进程)。

    通过在前一步骤之后在ndb_mgm客户端为每个数据节点发出RESTART来更新一些节点配置参数。其他参数要求使用管理客户端STOP命令完全停止数据节点,然后通过在系统 shell 中调用适当的ndbdndbmtd")可执行文件来重新启动。 (在大多数 Unix 系统上,也可以使用类似kill的 shell 命令来停止数据节点进程,但通常更倾向于使用STOP命令,通常更简单。)

    注意

    在 Windows 上,您还可以使用SC STOPSC START命令,NET STOPNET START命令,或 Windows 服务管理器来停止和启动已安装为 Windows 服务的节点(参见 Section 25.3.2.4, “Installing NDB Cluster Processes as Windows Services”)。

    所需的重启类型在��个节点配置参数的文档中指示。请参阅 Section 25.4.3, “NDB Cluster Configuration Files”。

  3. 依次停止、重新配置,然后重新启动每个集群 SQL 节点(mysqld进程)。

NDB Cluster 支持一种相对灵活的节点升级顺序。在升级 NDB Cluster 时,您可以在升级管理节点、数据节点或两者之前先升级 API 节点(包括 SQL 节点)。换句话说,您可以按任意顺序升级 API 和 SQL 节点。但需遵守以下规定:

  • 此功能仅用于在线升级。不打算也不支持在生产环境中连续长期使用来自不同 NDB Cluster 版本的节点二进制文件的混合。

  • 必须在升级任何不同类型节点(管理、数据或 API 节点)之前先升级所有相同类型的节点。无论节点升级顺序如何,这一点始终成立。

  • 必须在升级任何数据节点之前升级所有管理节点。无论您以何种顺序升级集群的 API 和 SQL 节点,这一点始终成立。

  • 在升级所有管理节点和数据节点之前,不能使用“新”版本特有的功能。

    这也适用于可能适用的任何 MySQL Server 版本更改,除了 NDB 引擎版本更改,因此在规划升级时不要忘记考虑这一点。(这对于一般 NDB Cluster 的在线升级也是适用的。)

任何 API 节点在节点重新启动期间都无法执行模式操作(如数据定义语句)。部分由于此限制,模式操作在在线升级或降级期间也不受支持。此外,在升级或降级进行时也无法执行本地备份。

使用多个管理服务器进行滚动重启。 在对具有多个管理节点的 NDB Cluster 执行滚动重启时,应注意ndb_mgmd会检查是否有其他管理节点正在运行,并尝试使用该节点的配置数据。为防止这种情况发生,并强制ndb_mgmd重新读取其配置文件,请执行以下步骤:

  1. 停止所有 NDB Cluster 的ndb_mgmd进程。

  2. 更新所有config.ini文件。

  3. 启动一个单独的ndb_mgmd,使用所需的--reload--initial或两个选项。

  4. 如果您使用--initial选项启动了第一个ndb_mgmd,您还必须使用--initial启动任何剩余的ndb_mgmd进程。

    无论在启动第一个ndb_mgmd时使用了哪些其他选项,您都不应该在第一个使用--reload之后启动任何剩余的ndb_mgmd进程。

  5. 按照正常流程完成数据节点和 API 节点的滚动重启。

在执行滚动重启以更新集群配置时,您可以使用ndbinfo.nodes表的config_generation列来跟踪哪些数据节点已成功使用新配置重新启动。请参阅 Section 25.6.16.47, “The ndbinfo nodes Table”。

25.6.6 NDB 集群单用户模式

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-single-user-mode.html

单用户模式使数据库管理员能够将对数据库系统的访问限制为单个 API 节点,例如 MySQL 服务器(SQL 节点)或一个 ndb_restore 实例。进入单用户模式时,所有其他 API 节点的连接将被优雅地关闭,所有正在运行的事务都将被中止。不允许启动新事务。

一旦集群进入单用户模式,只有指定的 API 节点被授予对数据库的访问权限。

您可以使用 ndb_mgm 客户端中的 ALL STATUS 命令来查看集群何时进入单用户模式。您还可以检查 ndbinfo.nodes 表的 status 列(有关更多信息,请参见 第 25.6.16.47 节,“ndbinfo nodes 表”)。

示例:

ndb_mgm> ENTER SINGLE USER MODE 5

执行此命令后,集群进入单用户模式,其节点 ID 为 5 的 API 节点成为集群唯一允许的用户。

在上述命令中指定的节点必须是 API 节点;尝试指定任何其他类型的节点都将被拒绝。

注意

当调用上述命令时,运行在指定节点上的所有事务都将被中止,连接将被关闭,服务器必须重新启动。

命令 EXIT SINGLE USER MODE 将集群的数据节点从单用户模式更改为正常模式。等待连接的 API 节点(例如 MySQL 服务器)再次被允许连接(即等待集群准备就绪并可用)。在状态更改期间和之后,被指定为单用户节点的 API 节点继续运行(如果仍然连接)。

示例:

ndb_mgm> EXIT SINGLE USER MODE

在单用户模式下运行时,有两种推荐的处理节点故障的方法:

  • 方法 1:

    1. 完成所有单用户模式事务

    2. 发出 EXIT SINGLE USER MODE 命令

    3. 重新启动集群的数据节点

  • 方法 2:

    在进入单用户模式之前重新启动存储节点。

25.6.7 添加 NDB 集群数据节点在线

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-online-add-node.html

25.6.7.1 添加 NDB 集群数据节点在线:一般问题

25.6.7.2 添加 NDB 集群数据节点在线:基本过程

25.6.7.3 添加 NDB 集群数据节点在线:详细示例

本节描述了如何“在线”添加 NDB 集群数据节点,即在不需要完全关闭集群并重新启动的情况下进行该过程。

重要提示

目前,您必须将新数据节点添加到 NDB 集群作为新节点组的一部分。此外,无法在线更改片段副本数(或节点组中的节点数)。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-online-add-node-remarks.html

25.6.7.1 添加 NDB 集群数据节点在线:一般问题

本节提供关于在线添加 NDB 集群节点的行为和当前限制的一般信息。

数据重新分布。 添加新节点的在线功能包括通过ALTER TABLE ... REORGANIZE PARTITION语句重新组织NDBCLUSTER表数据和索引,使其分布在所有数据节点上,包括新节点。支持内存和磁盘数据表的表重组。此重新分布目前不包括唯一索引(只重新分布有序索引)。

在添加新数据节点之前已存在的NDBCLUSTER表的重新分布不是自动的,但可以通过mysql或其他 MySQL 客户端应用程序中的简单 SQL 语句来完成。但是,在添加新节点组后创建的表中添加的所有数据和索引会自动分布在所有集群数据节点中,包括作为新节点组的一部分添加的节点。

部分启动。 可以添加一个新节点组,而不是所有新数据节点都已启动。也可以将新节点组添加到降级集群中,即只部分启动的集群,或其中一个或多个数据节点未运行。在后一种情况下,必须有足够的节点运行以使集群可行,然后才能添加新节点组。

对正在进行的操作的影响。 使用 NDB 集群数据的正常 DML 操作不会受到新节点组的创建或添加,或表重组的影响。但是,在表重组期间无法同时执行 DDL,也就是说,在执行ALTER TABLE ... REORGANIZE PARTITION语句时无法发出其他 DDL 语句。此外,在执行ALTER TABLE ... REORGANIZE PARTITION(或执行任何其他 DDL 语句)期间,无法重新启动集群数据节点。

故障处理。 在节点组创建和表重组期间数据节点的故障处理如下表所示:

表 25.66 节点组创建和表重组期间数据节点故障处理

在期间发生故障 在“旧”数据节点中发生故障 在“新”数据节点中发生故障 系统故障
节点组创建
  • 如果非主节点失败: 节点组的创建总是向前滚动。

  • 如果主节点失败:

    • 如果内部提交点已经达到: 节点组的创建将被前滚。

    • 如果内部提交点尚未达到。 节点组的创建将被回滚。

|

  • 如果除主节点之外的节点失败: 节点组的创建总是被前滚。

  • 如果主节点失败:

    • 如果内部提交点已经达到: 节点组的创建将被前滚。

    • 如果内部提交点尚未达到。 节点组的创建将被回滚。

|

  • 如果执行 CREATE NODEGROUP 已经达到内部提交点: 当重新启动时,集群将包括新的节点组。否则不包括。

  • 如果执行 CREATE NODEGROUP 尚未达到内部提交点: 当重新启动时,集群不包括新的节点组。

|

表重新组织
  • 如果除主节点之外的节点失败: 表重新组织总是被前滚。

  • 如果主节点失败:

    • 如果内部提交点已经达到: 表重新组织将被前滚。

    • 如果内部提交点尚未达到。 表重新组织将被回滚。

|

  • 如果除主节点之外的节点失败: 表重新组织总是被前滚。

  • 如果主节点失败:

    • 如果内部提交点已经达到: 表重新组织将被前滚。

    • 如果内部提交点尚未达到。 表重新组织将被回滚。

|

  • 如果执行 ALTER TABLE ... REORGANIZE PARTITION 语句已经达到内部提交点: 当集群重新启动时,属于table的数据和索引将使用“新”数据节点进行分发。

  • 如果执行 ALTER TABLE ... REORGANIZE PARTITION 语句尚未达到内部提交点: 当集群重新启动时,属于table的数据和索引将仅使用“旧”数据节点进行分发。

|

删除节点组。 ndb_mgm客户端支持DROP NODEGROUP命令,但只有当节点组中的数据节点不包含任何数据时才能删除节点组。由于目前没有办法“清空”特定数据节点或节点组,此命令仅适用于以下两种情况:

  1. ndb_mgm客户端中发出CREATE NODEGROUP命令之后,在mysql客户端中发出任何ALTER TABLE ... REORGANIZE PARTITION语句之前。

  2. 在使用 DROP TABLE 删除所有 NDBCLUSTER 表之后。

    TRUNCATE TABLE 不适用于此目的,因为数据节点继续存储表定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-online-add-node-basics.html

25.6.7.2 在线添加 NDB Cluster 数据节点:基本过程

在本节中,我们列出了向 NDB Cluster 添加新数据节点所需的基本步骤。此过程适用于数据节点进程使用 ndbdndbmtd") 二进制文件。有关更详细的示例,请参见 第 25.6.7.3 节,“在线添加 NDB Cluster 数据节点:详细示例”。

假设您已经有一个运行中的 NDB Cluster,添加在线数据节点需要以下步骤:

  1. 编辑集群配置 config.ini 文件,添加新的与要添加的节点对应的 [ndbd] 部分。如果集群使用多个管理服务器,则需要对所有管理服务器使用的 config.ini 文件进行更改。

    您必须小心,确保在 config.ini 文件中添加的任何新数据节点的节点 ID 不重叠使用现有节点的节点 ID。如果您有使用动态分配的节点 ID 的 API 节点,并且这些 ID 与您要用于新数据节点的节点 ID 匹配,那么可以强制任何此类 API 节点“迁移”,如本过程后面所述。

  2. 对所有 NDB Cluster 管理服务器执行滚动重启。

    重要提示

    所有管理服务器必须使用 --reload--initial 选项重新启动,以强制读取新配置。

  3. 对所有现有的 NDB Cluster 数据节点执行滚动重启。在重新启动现有数据节点时,通常不需要(甚至不建议)使用--initial

    如果您正在使用具有动态分配的 ID 的 API 节点,这些 ID 与您希望分配给新数据节点的任何节点 ID 匹配,那么在重新启动此步骤中的任何数据节点进程之前,必须重新启动所有 API 节点(包括 SQL 节点)。这将导致任何具有先前未明确分配的节点 ID 的 API 节点放弃这些节点 ID 并获取新的节点 ID。

  4. 对连接到 NDB Cluster 的任何 SQL 或 API 节点执行滚动重启。

  5. 启动新数据节点。

    新数据节点可以以任何顺序启动。只要在所有现有数据节点的滚动重启完成后启动它们,并在进行下一步之前启动它们即可。

  6. 在 NDB Cluster 管理客户端中执行一个或多个CREATE NODEGROUP命令,以创建新数据节点所属的新节点组或节点组。

  7. 重新分配集群的数据到所有数据节点,包括新节点。通常通过在mysql客户端中为每个NDBCLUSTER表发出一个ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION语句来完成此操作。

    异常:对于使用MAX_ROWS选项创建的表,此语句不起作用;而是使用ALTER TABLE ... ALGORITHM=INPLACE MAX_ROWS=...来重新组织这些表。您还应该记住,以这种方式使用MAX_ROWS设置分区数量已被弃用,应该使用PARTITION_BALANCE代替;有关更多信息,请参见第 15.1.20.12 节,“设置 NDB 注释选项”。

    注意

    这仅适用于在添加新节点组时已经存在的表。在添加新节点组后创建的表中的数据会自动分布;但是,在添加新节点之前存在的表tbl中添加的数据直到重新组织该表后才会使用新节点进行分布。

  8. ALTER TABLE ... REORGANIZE PARTITION ALGORITHM=INPLACE重新组织分区但不会回收“旧”节点上释放的空间。您可以通过为每个NDBCLUSTER表在mysql客户端中发出一个OPTIMIZE TABLE语句来执行此操作。

    这适用于内存中NDB表的可变宽度列使用的空间。OPTIMIZE TABLE不支持内存表的固定宽度列;也不支持磁盘数据表。

您可以添加所有所需的节点,然后连续发出几个CREATE NODEGROUP命令来将新节点组添加到集群中。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-online-add-node-example.html

25.6.7.3 在线添加 NDB 集群数据节点:详细示例

在本节中,我们提供了一个详细的示例,说明如何在线添加新的 NDB 集群数据节点,从一个单节点组中有 2 个数据节点的 NDB 集群开始,最终形成一个有 2 个节点组中有 4 个数据节点的集群。

开始配置。 为了说明,我们假设一个最小配置,并且集群使用一个只包含以下信息的config.ini文件:

[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster

[ndbd]
Id = 1
HostName = 198.51.100.1

[ndbd]
Id = 2
HostName = 198.51.100.2

[mgm]
HostName = 198.51.100.10
Id = 10

[api]
Id=20
HostName = 198.51.100.20

[api]
Id=21
HostName = 198.51.100.21

注意

我们在数据节点 ID 和其他节点之间的序列中留下了一个间隔。这样可以更容易地在以后为新添加的数据节点分配尚未使用的��点 ID。

我们还假设您已经使用适当的命令行或my.cnf选项启动了集群,并且在管理客户端中运行SHOW会产生类似于这里显示的输出:

-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @198.51.100.1  (8.0.35-ndb-8.0.35, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.0.35-ndb-8.0.35, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=10   @198.51.100.10  (8.0.35-ndb-8.0.35)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.0.35-ndb-8.0.35)
id=21   @198.51.100.21  (8.0.35-ndb-8.0.35)

最后,我们假设集群包含一个单NDBCLUSTER表,如下所示创建:

USE n;

CREATE TABLE ips (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    country_code CHAR(2) NOT NULL,
    type CHAR(4) NOT NULL,
    ip_address VARCHAR(15) NOT NULL,
    addresses BIGINT UNSIGNED DEFAULT NULL,
    date BIGINT UNSIGNED DEFAULT NULL
)   ENGINE NDBCLUSTER;

后面显示的内存使用情况和相关信息是在将大约 50000 行插入到这个表后生成的。

注意

在这个示例中,我们展示了单线程的ndbd用于数据节点进程。如果您使用多线程的ndbmtd"),则可以通过在后续步骤中出现的地方用ndbmtd")替换ndbd来应用此示例。

步骤 1:更新配置文件。 在文本编辑器中打开集群全局配置文件,并添加与 2 个新数据节点对应的[ndbd]部分。(我们给这些数据节点分配 ID 3 和 4,并假设它们分别在地址 198.51.100.3 和 198.51.100.4 的主机上运行。)添加新部分后,config.ini文件的内容应该如下所示,文件的添加部分以粗体显示:

[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster

[ndbd]
Id = 1
HostName = 198.51.100.1

[ndbd]
Id = 2
HostName = 198.51.100.2

[ndbd]
Id = 3
HostName = 198.51.100.3

[ndbd]
Id = 4
HostName = 198.51.100.4

[mgm]
HostName = 198.51.100.10
Id = 10

[api]
Id=20
HostName = 198.51.100.20

[api]
Id=21
HostName = 198.51.100.21

一旦您做出必要的更改,请保存文件。

步骤 2:重新启动管理服务器。 重新启动集群管理服务器需要您发出停止管理服务器和然后再次启动的单独命令,如下所示:

  1. 使用管理客户端STOP命令停止管理服务器,如下所示:

    ndb_mgm> 10 STOP
    Node 10 has shut down.
    Disconnecting to allow Management Server to shutdown
    
    $>
    
  2. 由于关闭管理服务器会导致管理客户端终止,您必须从系统 shell 中启动管理服务器。为简单起见,我们假设config.ini与管理服务器二进制文件位于同一目录中,但实际上,您必须提供正确的配置文件路径。您还必须提供--reload--initial选项,以便管理服务器从文件而不是其配置缓存中读取新配置。如果您的 shell 当前目录也与管理服务器二进制文件所在的目录相同,则可以按照以下方式调用管理服务器:

    $> ndb_mgmd -f config.ini --reload
    2008-12-08 17:29:23 [MgmSrvr] INFO     -- NDB Cluster Management Server. 8.0.35-ndb-8.0.35
    2008-12-08 17:29:23 [MgmSrvr] INFO     -- Reading cluster configuration from 'config.ini'
    

在重新启动ndb_mgm进程后,在管理客户端中检查SHOW的输出,您现在应该看到类似于以下内容:

-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @198.51.100.1  (8.0.35-ndb-8.0.35, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.0.35-ndb-8.0.35, Nodegroup: 0)
id=3 (not connected, accepting connect from 198.51.100.3)
id=4 (not connected, accepting connect from 198.51.100.4)

[ndb_mgmd(MGM)] 1 node(s)
id=10   @198.51.100.10  (8.0.35-ndb-8.0.35)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.0.35-ndb-8.0.35)
id=21   @198.51.100.21  (8.0.35-ndb-8.0.35)

步骤 3:对现有数据节点执行滚动重启。 可以在集群管理客户端中完全通过使用RESTART命令来完成此步骤,如下所示:

ndb_mgm> 1 RESTART
Node 1: Node shutdown initiated
Node 1: Node shutdown completed, restarting, no start.
Node 1 is being restarted

ndb_mgm> Node 1: Start initiated (version 8.0.35)
Node 1: Started (version 8.0.35)

ndb_mgm> 2 RESTART
Node 2: Node shutdown initiated
Node 2: Node shutdown completed, restarting, no start.
Node 2 is being restarted

ndb_mgm> Node 2: Start initiated (version 8.0.35)

ndb_mgm> Node 2: Started (version 8.0.35)

重要

在发出每个*X* RESTART命令后,请等待管理客户端报告Node *X*: Started (version ...) 之后 再继续进行任何操作。

通过检查mysql客户端中的ndbinfo.nodes表,您可以验证所有现有数据节点是否使用更新的配置重新启动。

步骤 4:对所有集群 API 节点执行滚动重启。 关闭并重新启动充当集群中 SQL 节点的每个 MySQL 服务器,使用mysqladmin shutdown后跟mysqld_safe(或另一个启动脚本)。这应该类似于下面显示的内容,其中password是给定 MySQL 服务器实例的 MySQL root密码:

$> mysqladmin -uroot -p*password* shutdown
081208 20:19:56 mysqld_safe mysqld from pid file
/usr/local/mysql/var/tonfisk.pid ended
$> mysqld_safe --ndbcluster --ndb-connectstring=198.51.100.10 &
081208 20:20:06 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
081208 20:20:06 mysqld_safe Starting mysqld daemon with databases
from /usr/local/mysql/var

当然,确切的输入和输出取决于 MySQL 在系统上的安装方式和位置,以及您选择以何种选项启动它(以及是否在my.cnf文件中指定了一些或所有这些选项)。

步骤 5:执行新数据节点的初始启动。 在每个新数据节点的主机上的系统 shell 中,按照这里显示的方式启动数据节点,使用--initial选项:

$> ndbd -c 198.51.100.10 --initial

注意

与重新启动现有数据节点的情况不同,您可以同时启动新数据节点;您无需等待一个启动完成后再启动另一个。

在继续下一步之前,请等待新的数据节点都已启动。一旦新的数据节点启动,您可以在管理客户端SHOW命令的输出中看到它们尚未属于任何节点组(如此处以粗体显示):

ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @198.51.100.1  (8.0.35-ndb-8.0.35, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.0.35-ndb-8.0.35, Nodegroup: 0)
id=3    @198.51.100.3  (8.0.35-ndb-8.0.35, no nodegroup)
id=4    @198.51.100.4  (8.0.35-ndb-8.0.35, no nodegroup)

[ndb_mgmd(MGM)] 1 node(s)
id=10   @198.51.100.10  (8.0.35-ndb-8.0.35)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.0.35-ndb-8.0.35)
id=21   @198.51.100.21  (8.0.35-ndb-8.0.35)

步骤 6:创建新的节点组。 您可以通过在集群管理客户端中发出CREATE NODEGROUP命令来执行此操作。此命令以逗号分隔的数据节点的节点 ID 列表作为参数,如下所示:

ndb_mgm> CREATE NODEGROUP 3,4
Nodegroup 1 created

再次执行SHOW,您可以验证数据节点 3 和 4 已加入新的节点组(再次以粗体显示):

ndb_mgm> SHOW
Connected to Management Server at: 198.51.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=1    @198.51.100.1  (8.0.35-ndb-8.0.35, Nodegroup: 0, *)
id=2    @198.51.100.2  (8.0.35-ndb-8.0.35, Nodegroup: 0)
id=3    @198.51.100.3  (8.0.35-ndb-8.0.35, Nodegroup: 1)
id=4    @198.51.100.4  (8.0.35-ndb-8.0.35, Nodegroup: 1)

[ndb_mgmd(MGM)] 1 node(s)
id=10   @198.51.100.10  (8.0.35-ndb-8.0.35)

[mysqld(API)]   2 node(s)
id=20   @198.51.100.20  (8.0.35-ndb-8.0.35)
id=21   @198.51.100.21  (8.0.35-ndb-8.0.35)

步骤 7:重新分配集群数据。 创建节点组时,现有数据和索引不会自动分配给新节点组的数据节点,您可以通过在管理客户端中发出适当的REPORT命令来查看:

ndb_mgm> ALL REPORT MEMORY

Node 1: Data usage is 5%(177 32K pages of total 3200)
Node 1: Index usage is 0%(108 8K pages of total 12832)
Node 2: Data usage is 5%(177 32K pages of total 3200)
Node 2: Index usage is 0%(108 8K pages of total 12832)
Node 3: Data usage is 0%(0 32K pages of total 3200)
Node 3: Index usage is 0%(0 8K pages of total 12832)
Node 4: Data usage is 0%(0 32K pages of total 3200)
Node 4: Index usage is 0%(0 8K pages of total 12832)

通过使用ndb_desc-p选项,使输出包含分区信息,您可以看到该表仍然仅使用 2 个分区(在输出的Per partition info部分中以粗体显示):

$> ndb_desc -c 198.51.100.10 -d n ips -p
-- ips --
Version: 1
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 340
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY

-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex

-- Per partition info --
Partition   Row count   Commit count  Frag fixed memory   Frag varsized memory
0           26086       26086         1572864             557056
1           26329       26329         1605632             557056

您可以通过为每个NDB表执行ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION语句在mysql客户端中使数据重新分布到所有数据节点。

重要提示

ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION不适用于使用MAX_ROWS选项创建的表。相反,使用ALTER TABLE ... ALGORITHM=INPLACE, MAX_ROWS=...来重新组织这些表。

请注意,使用MAX_ROWS设置每个表的分区数已被弃用,您应该使用PARTITION_BALANCE代替;有关更多信息,请参阅 Section 15.1.20.12, “Setting NDB Comment Options”。

执行语句ALTER TABLE ips ALGORITHM=INPLACE, REORGANIZE PARTITION后,您可以使用ndb_desc查看该表的数据现在使用 4 个分区存储,如下所示(相关部分以粗体显示):

$> ndb_desc -c 198.51.100.10 -d n ips -p
-- ips --
Version: 16777217
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 341
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 4
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY

-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex

-- Per partition info --
Partition   Row count   Commit count  Frag fixed memory   Frag varsized memory
0           12981       52296         1572864             557056
1           13236       52515         1605632             557056
2           13105       13105         819200              294912
3           13093       13093         819200              294912

注意

通常,ALTER TABLE *table_name* [ALGORITHM=INPLACE,] REORGANIZE PARTITION用于具有显式分区的表创建新的分区方案时会使用分区标识符列表和一组分区定义。在这种情况下,将数据重新分布到新的 NDB Cluster 节点组是一个例外;在这种情况下使用时,REORGANIZE PARTITION后不跟随其他关键字或标识符。

更多信息,请参见第 15.1.9 节,“ALTER TABLE Statement”。

另外,对于每个表,ALTER TABLE语句后应该跟着一个OPTIMIZE TABLE来回收浪费的空间。您可以通过以下查询在信息模式TABLES表中获取所有NDBCLUSTER表的列表:

SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE ENGINE = 'NDBCLUSTER';

注意

对于 NDB Cluster 表,INFORMATION_SCHEMA.TABLES.ENGINE值始终为NDBCLUSTER,无论用于创建表的CREATE TABLE语句(或用于将现有表从不同存储引擎转换为 NDB Cluster 的ALTER TABLE语句)中是否在ENGINE选项中使用了NDBNDBCLUSTER

在执行这些语句后,您可以在ALL REPORT MEMORY的输出中看到数据和索引现在在所有集群数据节点之间重新分布,如下所示:

ndb_mgm> ALL REPORT MEMORY

Node 1: Data usage is 5%(176 32K pages of total 3200)
Node 1: Index usage is 0%(76 8K pages of total 12832)
Node 2: Data usage is 5%(176 32K pages of total 3200)
Node 2: Index usage is 0%(76 8K pages of total 12832)
Node 3: Data usage is 2%(80 32K pages of total 3200)
Node 3: Index usage is 0%(51 8K pages of total 12832)
Node 4: Data usage is 2%(80 32K pages of total 3200)
Node 4: Index usage is 0%(50 8K pages of total 12832)

注意

由于在NDBCLUSTER表上只能执行一个 DDL 操作,您必须等待每个ALTER TABLE ... REORGANIZE PARTITION语句完成后再发出下一个。

对于在添加新数据节点之后创建的NDBCLUSTER表,不需要发出ALTER TABLE ... REORGANIZE PARTITION语句;添加到这些表中的数据会自动分布在所有数据节点之间。然而,在添加新节点之前存在的NDBCLUSTER表中,无论是现有数据还是新数据都不会使用新节点进行分布,直到使用ALTER TABLE ... REORGANIZE PARTITION重新组织这些表。

另一种过程,无需滚动重启。 可以通过在首次启动集群时配置额外的数据节点(但不启动它们)来避免需要滚动重启的需要。我们假设,与之前一样,您希望从两个数据节点(节点 1 和 2)开始,然后通过添加由节点 3 和 4 组成的第二个节点组来将集群扩展到四个数据节点:

[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster

[ndbd]
Id = 1
HostName = 198.51.100.1

[ndbd]
Id = 2
HostName = 198.51.100.2

[ndbd]
Id = 3
HostName = 198.51.100.3
Nodegroup = 65536

[ndbd]
Id = 4
HostName = 198.51.100.4
Nodegroup = 65536

[mgm]
HostName = 198.51.100.10
Id = 10

[api]
Id=20
HostName = 198.51.100.20

[api]
Id=21
HostName = 198.51.100.21

要稍后上线的数据节点(节点 3 和 4)可以配置为NodeGroup = 65536,在这种情况下,节点 1 和 2 可以按照这里所示启动:

$> ndbd -c 198.51.100.10 --initial

配置为NodeGroup = 65536的数据节点被管理服务器视为在等待由StartNoNodeGroupTimeout数据节点配置参数设置确定的一段时间后,使用--nowait-nodes=3,4启动节点 1 和 2。默认情况下,这是 15 秒(15000 毫秒)。

注意

StartNoNodegroupTimeout 必须对集群中的所有数据节点保持一致;因此,您应该始终在config.ini文件的[ndbd default]部分中设置它,而不是为单独的数据节点设置。

当您准备添加第二个节点组时,只需执行以下额外步骤:

  1. 启动数据节点 3 和 4,为每个新节点调用一次数据节点进程:

    $> ndbd -c 198.51.100.10 --initial
    
  2. 在管理客户端中发出适当的CREATE NODEGROUP命令:

    ndb_mgm> CREATE NODEGROUP 3,4
    
  3. mysql客户端中,为每个现有的NDBCLUSTER表发出ALTER TABLE ... REORGANIZE PARTITIONOPTIMIZE TABLE语句。(正如本节其他地方所述,现有的 NDB Cluster 表在执行此操作之前无法使用新节点进行数据分发。)

25.6.8 NDB 集群在线备份

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-backup.html

25.6.8.1 NDB 集群备份概念

25.6.8.2 使用 NDB 集群管理客户端创建备份

25.6.8.3 NDB 集群备份配置

25.6.8.4 NDB 集群备份故障排除

25.6.8.5 使用并行数据节点进行 NDB 备份

接下来的几节描述了如何准备并创建 NDB 集群备份,使用专门用于此目的的 ndb_mgm 管理客户端的功能。为了区分这种类型的备份与使用 mysqldump 创建的备份,我们有时将其称为“本地” NDB 集群备份。(有关使用 mysqldump 创建备份的信息,请参见 第 6.5.4 节,“mysqldump — 数据库备份程序”。)NDB 集群备份的恢复使用 NDB 集群分发提供的 ndb_restore 实用程序完成;有关 ndb_restore 及其在恢复 NDB 集群备份中的使用的信息,请参见 第 25.5.23 节,“ndb_restore — 恢复 NDB 集群备份”。

NDB 8.0 可以使用多个 LDM 来创建备份,以实现数据节点的并行性。参见 第 25.6.8.5 节,“使用并行数据节点进行 NDB 备份”。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-backup-concepts.html

25.6.8.1 NDB Cluster 备份概念

备份是数据库在特定时间的快照。备份由三个主要部分组成:

  • 元数据。 所有数据库表的名称和定义

  • 表记录。 实际存储在数据库表中的数据,在备份时

  • 事务日志。 顺序记录了数据是如何以及何时存储在数据库中的

每个部分都保存在参与备份的所有节点上。在备份过程中,每个节点将这三个部分保存到磁盘上的三个文件中:

  • BACKUP-*backup_id*.*node_id*.ctl

    包含控制信息和元数据的控制文件。每个节点将相同的表定义(对于集群中的所有表)保存到自己版本的此文件中。

  • BACKUP-*backup_id*-0.*node_id*.data

    包含表记录的数据文件,按片段保存。也就是说,在备份过程中,不同的节点保存不同的片段。每个节点保存的文件以表明记录所属表的标题开头。在记录列表之后,有一个包含所有记录校验和的页脚。

  • BACKUP-*backup_id*.*node_id*.log

    包含已提交事务记录的日志文件。只有备份中存储的表上的事务才会存储在日志中。参与备份的节点保存不同的记录,因为不同的节点托管不同的数据库片段。

在刚才显示的列表中,backup_id代表备份标识符,node_id是创建文件的节点的唯一标识符。

备份文件的位置由BackupDataDir参数确定。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-backup-using-management-client.html

25.6.8.2 使用 NDB 集群管理客户端创建备份

在开始备份之前,请确保集群已正确配置以执行备份。(参见第 25.6.8.3 节,“NDB 集群备份配置”.)

START BACKUP 命令用于创建备份,其语法如下所示:

START BACKUP [*backup_id*]
    [*encryption_option*]
    [*wait_option*]
    [*snapshot_option*]

*encryption_option*:
ENCRYPT [PASSWORD=*password*]

*password*:
{'*password_string*' | "*password_string*"}

*wait_option*:
WAIT {STARTED | COMPLETED} | NOWAIT

*snapshot_option*:
SNAPSHOTSTART | SNAPSHOTEND

连续备份会自动按顺序识别,因此backup_id,一个大于或等于 1 的整数,是可选的;如果省略,则使用下一个可用值。如果使用现有的backup_id值,则备份将失败,并显示错误消息备份失败:文件已存在。如果使用backup_id,则必须紧跟在START BACKUP关键字之后,在使用任何其他选项之前。

在 NDB 8.0.22 及更高版本中,START BACKUP 支持使用 ENCRYPT PASSWORD=*password* 创建加密备份。password 必须满足以下所有要求:

  • 使用除 !'"$%\^ 之外的任何可打印 ASCII 字符。

  • 长度不超过 256 个字符

  • 用单引号或双引号括起来

当使用 ENCRYPT PASSWORD='*password*' 时,由每个数据节点写入的备份数据记录和日志文件会使用从用户提供的password和随机生成的盐派生的密钥进行加密,使用 PBKDF2-SHA256 算法的密钥派生函数(KDF)生成用于该文件的对称加密密钥。此函数的形式如下所示:

key = KDF(*random_salt*, *password*)

然后使用生成的密钥使用 AES 256 CBC 内联加密备份数据,并对备份文件集(使用生成的密钥)使用对称加密。

注意

NDB 集群永远不会保存用户提供的密码或生成的加密密钥。

从 NDB 8.0.24 开始,可以从encryption_option中省略 PASSWORD 选项。在这种情况下,管理客户端会提示用户输入密码。

可以使用 PASSWORD 设置空密码(''""),但不建议这样做。

可以使用以下任一命令解密加密备份:

  • ndb_restore --decrypt --backup-password=*password*

  • ndbxfrm --decrypt-password=*password* input_file output_file

  • ndb_print_backup_file -P password file_name

NDB 8.0.24 及更高版本支持以下附加命令:

  • ndb_restore --decrypt --backup-password-from-stdin

  • ndbxfrm --decrypt-password-from-stdin input_file output_file

  • ndb_print_backup_file --backup-password=*password* file_name

  • ndb_print_backup_file --backup-password-from-stdin file_name

  • ndb_mgm --backup-password-from-stdin --execute "START BACKUP ..."

查看这些程序的描述以获取更多信息,例如可能需要的其他选项。

wait_option 可用于确定在发出 START BACKUP 命令后何时将控制权返回给管理客户端,如下列表所示:

  • 如果指定了 NOWAIT,管理客户端会立即显示提示,如下所示:

    ndb_mgm> START BACKUP NOWAIT
    ndb_mgm>
    

    在这种情况下,管理客户端可以在打印备份过程的进度信息的同时使用。

  • 使用 WAIT STARTED,管理客户端会等到备份开始后再将控制权返回给用户,如下所示:

    ndb_mgm> START BACKUP WAIT STARTED
    Waiting for started, this may take several minutes
    Node 2: Backup 3 started from node 1
    ndb_mgm>
    
  • WAIT COMPLETED 导致管理客户端在备份过程完成之前等待,然后将控制权返回给用户。

WAIT COMPLETED 是默认选项。

snapshot_option可用于确定备份是否与发出START BACKUP命令时的集群状态匹配,或者与备份完成时的状态匹配。SNAPSHOTSTART导致备份与备份开始时的集群状态匹配;SNAPSHOTEND导致备份反映备份完成时的集群状态。SNAPSHOTEND是默认值,并与以前的 NDB Cluster 版本中找到的行为相匹配。

注意

如果在START BACKUP中使用SNAPSHOTSTART选项,并且启用了CompressedBackup参数,则只有数据和控制文件会被压缩,日志文件不会被压缩。

如果同时使用wait_optionsnapshot_option,它们可以以任何顺序指定。例如,假设不存在 ID 为 4 的现有备份,则以下所有命令都是有效的:

START BACKUP WAIT STARTED SNAPSHOTSTART
START BACKUP SNAPSHOTSTART WAIT STARTED
START BACKUP 4 WAIT COMPLETED SNAPSHOTSTART
START BACKUP SNAPSHOTEND WAIT COMPLETED
START BACKUP 4 NOWAIT SNAPSHOTSTART

创建备份的过程包括以下步骤:

  1. 启动管理客户端(ndb_mgm),如果尚未运行。

  2. 执行START BACKUP命令。这将产生几行输出,指示备份的进度,如下所示:

    ndb_mgm> START BACKUP
    Waiting for completed, this may take several minutes
    Node 2: Backup 1 started from node 1
    Node 2: Backup 1 started from node 1 completed
     StartGCP: 177 StopGCP: 180
     #Records: 7362 #LogRecords: 0
     Data: 453648 bytes Log: 0 bytes
    ndb_mgm>
    
  3. 当备份开始时,管理客户端显示此消息:

    Backup *backup_id* started from node *node_id*
    

    backup_id是此特定备份的唯一标识符。如果未配置其他方式保存此标识符,则将其保存在集群日志中。node_id是协调备份与数据节点的管理服务器的标识符。在备份过程的这一点上,集群已经接收并处理了备份请求。这并不意味着备份已经完成。这种情况的示例如下:

    Node 2: Backup 1 started from node 1
    
  4. 管理客户端通过类似于这样的消息指示备份已经开始:

    Backup *backup_id* started from node *node_id* completed
    

    与指示备份已经开始的通知一样,backup_id是此特定备份的唯一标识符,而node_id是协调备份与数据节点的管理服务器的节点 ID。此输出还附带其他信息,包括相关的全局检查点、备份的记录数以及数据的大小,如下所示:

    Node 2: Backup 1 started from node 1 completed
     StartGCP: 177 StopGCP: 180
     #Records: 7362 #LogRecords: 0
     Data: 453648 bytes Log: 0 bytes
    

也可以通过在系统 shell 中调用ndb_mgm并使用-e--execute选项来执行备份,如下例所示:

$> ndb_mgm -e "START BACKUP 6 WAIT COMPLETED SNAPSHOTSTART"

在这种方式下使用START BACKUP时,必须指定备份 ID。

集群备份默认创建在每个数据节点的BACKUP子目录中。这可以通过DataDir中的一个或多个数据节点,或者在config.ini文件中使用BackupDataDir配置参数来覆盖。为具有给定backup_id的备份创建的备份文件存储在备份目录中名为BACKUP-*backup_id*的子目录中。

取消备份。 要取消或中止已经进行中的备份,请执行以下步骤:

  1. 启动管理客户端。

  2. 执行此命令:

    ndb_mgm> ABORT BACKUP *backup_id*
    

    数字backup_id是在备份启动时管理客户端的响应中包含的备份标识符(在消息Backup *backup_id* started from node *management_node_id*中)。

  3. 管理客户端使用Abort of backup *backup_id* ordered确认中止请求。

    注意

    此时,管理客户端尚未收到集群数据节点对此请求的响应,备份实际上尚未被中止。

  4. 备份被中止后,管理客户端以类似于以下所示的方式报告此事实:

    Node 1: Backup 3 started from 5 has been aborted.
      Error: 1321 - Backup aborted by user request: Permanent error: User defined error
    Node 3: Backup 3 started from 5 has been aborted.
      Error: 1323 - 1323: Permanent error: Internal error
    Node 2: Backup 3 started from 5 has been aborted.
      Error: 1323 - 1323: Permanent error: Internal error
    Node 4: Backup 3 started from 5 has been aborted.
      Error: 1323 - 1323: Permanent error: Internal error
    

    在此示例中,我们展示了一个具有 4 个数据节点的集群的示例输出,要中止的备份的序列号为3,并且集群管理客户端连接的管理节点具有节点 ID5。完成中止备份的第一个节点报告中止的原因是由于用户的请求。(其余节点报告备份由于未指定的内部错误而中止。)

    注意

    不能保证集群节点以任何特定顺序响应ABORT BACKUP命令。

    备份 *backup_id* 从节点 *management_node_id* 开始已中止消息意味着备份已终止,并且与此备份相关的所有文件已从集群文件系统中删除。

也可以使用以下命令从系统 shell 中中止正在进行的备份:

$> ndb_mgm -e "ABORT BACKUP *backup_id*"

注意

如果在发出ABORT BACKUP时没有正在运行 ID 为backup_id的备份,管理客户端不会做出响应,也不会在集群日志中指示发送了无效的中止命令。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-backup-configuration.html

25.6.8.3 NDB 集群备份配置

备份需要五个配置参数:

  • 备份数据缓冲区大小

    在数据写入磁盘之前用于缓冲数据的内存量。

  • 备份日志缓冲区大小

    在将日志记录写入磁盘之前用于缓冲日志记录的内存量。

  • 备份内存

    为备份在数据节点中分配的总内存。这应该是为备份数据缓冲区和备份日志缓冲区分配的内存总和。

  • 备份写入大小

    写入磁盘的块的默认大小。这适用于备份数据缓冲区和备份日志缓冲区。

  • 备份最大写入大小

    写入磁盘的块的最大大小。这适用于备份数据缓冲区和备份日志缓冲区。

此外,压缩备份使NDB在创建和写入备份文件时使用压缩。

关于这些参数的更详细信息可以在备份参数中找到。

您还可以使用备份数据目录配置参数为备份文件设置位置。默认值为文件系统路径``/BACKUP/BACKUP-*backup_id*

在 NDB 8.0.22 及更高版本中,您可以通过启用要求加密备份来强制备份文件加密。当此参数设置为 1 时,备份不能在未指定ENCRYPT PASSWORD=*password*作为START BACKUP命令的一部分时创建。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-backup-troubleshooting.html

25.6.8.4 NDB 集群备份故障排除

如果在发出备份请求时返回错误代码,最有可能的原因是内存或磁盘空间不足。你应该检查备份所需的内存是否足够。

重要提示

如果你已经设置了BackupDataBufferSizeBackupLogBufferSize,它们的总和大于 4MB,那么你还必须设置BackupMemory

你还应确保备份目标的硬盘分区有足够的空间。

NDB 不支持可重复读,这可能会导致恢复过程中出现问题。尽管备份过程是“热”进行的,但从备份中恢复 NDB 集群并非完全“热”过程。这是因为在恢复过程中,正在运行的事务从恢复的数据中获得不可重复读。这意味着在恢复过程中数据的状态是不一致的。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-backup-parallel-data-nodes.html

25.6.8.5 使用并行数据节点进行 NDB 备份

在 NDB 8.0 中,可以使用多个本地数据管理器(LDM)并行在数据节点上进行备份。为了使其工作,集群中的所有数据节点必须使用多个 LDM,并且每个数据节点必须使用相同数量的 LDM。这意味着所有数据节点必须运行ndbmtdndbd是单线程的,因此始终只有一个 LDM)并且在进行备份之前必须配置为使用多个 LDM;ndbmtd默认以单线程模式运行。您可以通过选择多线程数据节点配置参数MaxNoOfExecutionThreadsThreadConfig的适当设置来使它们使用多个 LDM。请记住,更改这些参数需要重新启动集群;这可以是滚动重启。此外,每个数据节点的EnableMultithreadedBackup参数必须设置为 1(这是默认值)。

根据 LDM 的数量和其他因素,您可能还需要增加NoOfFragmentLogParts。如果您正在使用大型磁盘数据表,您可能还需要增加DiskPageBufferMemory。与单线程备份一样,您可能还希望或需要调整BackupDataBufferSizeBackupMemory和其他与备份相关的配置参数(参见备份参数)。

一旦所有数据节点都使用多个 LDM,您可以使用 NDB 管理客户端中的START BACKUP命令进行并行备份,就像数据节点正在运行ndbd(或单线程模式下的ndbmtd"))一样;不需要额外或特殊的语法,您可以根据需要或愿望指定备份 ID、等待选项或快照选项的任意组合。

使用多个 LDM 进行备份会在每个数据节点的目录BACKUP/BACKUP-*backup_id*/(该目录位于BackupDataDir下)下创建子目录,这些子目录分别命名为BACKUP-*backup_id*-PART-1-OF-*N*/BACKUP-*backup_id*-PART-2-OF-*N*/,依此类推,直到BACKUP-*backup_id*-PART-*N*-OF-*N*/,其中backup_id是此备份使用的备份 ID,N是每个数据节点的 LDM 数。每个子目录包含常规备份文件BACKUP-*backup_id*-0.*node_id*.DataBACKUP-*backup_id*.*node_id*.ctlBACKUP-backup_id.node_id.log,其中node_id是此数据节点的节点 ID。

ndb_restore会自动检查刚才描述的子目录是否存在;如果找到它们,它将尝试并行恢复备份。有关使用多个 LDM 进行备份的恢复信息,请参阅第 25.5.23.3 节,“从并行备份中恢复”。

要强制创建一个单线程备份,以便可以轻松地由 NDB 8.0 之前的版本的ndb_restore导入,您可以为所有数据节点设置EnableMultithreadedBackup = 0(您可以通过在config.ini全局配置文件的[ndbd default]部分中设置该参数来执行此操作)。还可以将并行备份恢复到运行较旧版本NDB的集群中。有关更多信息,请参阅第 25.5.23.1.1 节,“将 NDB 备份恢复到较旧版本的 NDB 集群”。

25.6.9 将数据导入到 MySQL 集群

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-importing-data.html

在设置新的 NDB 集群实例时,通常需要从现有 NDB 集群、MySQL 实例或其他来源导入数据。这些数据通常以以下一种或多种格式提供:

  • mysqldumpmysqlpump生成的 SQL 转储文件。可以使用mysql客户端导入此文件,如本节后面所示。

  • mysqldump或其他导出程序生成的 CSV 文件。这些文件可以使用mysql客户端中的LOAD DATA INFILE导入到NDB中,或者使用 NDB 集群分发的ndb_import实用程序。有关后者的更多信息,请参见第 25.5.13 节,“ndb_import — 将 CSV 数据导入 NDB”。

  • 使用START BACKUPNDB管理客户端中生成的本机NDB备份。要导入本机备份,必须使用作为 NDB 集群一部分提供的ndb_restore程序。有关使用此程序的更多信息,请参见第 25.5.23 节,“ndb_restore — 恢复 NDB 集群备份”。

从 SQL 文件导入数据时,通常不需要强制执行事务或外键,并临时禁用这些功能可以极大加快导入过程。可以使用mysql客户端来执行此操作,可以从客户端会话中执行,也可以在命令行上调用。在mysql客户端会话中,可以使用以下 SQL 语句执行导入:

SET ndb_use_transactions=0;
SET foreign_key_checks=0;

source *path/to/dumpfile*;

SET ndb_use_transactions=1;
SET foreign_key_checks=1;

以这种方式执行导入时,必须在执行mysql客户端的source命令后再次启用ndb_use_transactionforeign_key_checks。否则,同一会话中后续语句可能也会在不执行事务或外键约束的情况下执行,这可能导致数据不一致。

从系统 shell 中,您可以使用 mysql 客户端的 --init-command 选项,在禁用事务和外键强制执行的情况下导入 SQL 文件,就像这样:

$> mysql --init-command='SET ndb_use_transactions=0; SET foreign_key_checks=0' < *path/to/dumpfile*

还可以将数据加载到一个 InnoDB 表中,然后使用 ALTER TABLE ... ENGINE NDB) 将其转换为使用 NDB 存储引擎。特别是对于许多表,您应该考虑到这可能需要多次操作;此外,如果使用外键,您必须仔细注意 ALTER TABLE 语句的顺序,因为外键在使用不同 MySQL 存储引擎的表之间不起作用。

您应该意识到,在本节中之前描述的方法并不针对非常大的数据集或大型事务进行优化。如果一个应用程序确实需要大型事务或许多并发事务作为正常操作的一部分,您可能希望增加 MaxNoOfConcurrentOperations 数据节点配置参数的值,这将保留更多内存以允许数据节点在其事务协调器意外停止时接管事务。

在执行 NDB Cluster 表的批量 DELETEUPDATE 操作时,您可能也希望这样做。如果可能的话,尝试让应用程序以块的方式执行这些操作,例如,通过在这些语句中添加 LIMIT

如果数据导入操作由于任何原因未能成功完成,您应该准备好执行任何必要的清理工作,包括可能一个或多个 DROP TABLE 语句,DROP DATABASE 语句,或两者都有。如果不这样做,可能会导致数据库处于不一致状态。

25.6.10 NDB Cluster 的 MySQL 服务器用法

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-mysqld.html

mysqld是传统的 MySQL 服务器进程。要与 NDB Cluster 一起使用,mysqld需要构建支持NDB存储引擎,就像在dev.mysql.com/downloads/提供的预编译二进制文件中一样。如果您从源代码构建 MySQL,您必须使用-DWITH_NDB=1或(已弃用)-DWITH_NDBCLUSTER=1选项调用CMake以包含对NDB的支持。

有关从源代码编译 NDB Cluster 的更多信息,请参阅 Section 25.3.1.4, “Building NDB Cluster from Source on Linux”,以及 Section 25.3.2.2, “Compiling and Installing NDB Cluster from Source on Windows”。

(有关mysqld选项和变量的信息,除了本节讨论的内容外,与 NDB Cluster 相关的内容,请参阅 Section 25.4.3.9, “MySQL Server Options and Variables for NDB Cluster”。)

如果mysqld二进制文件已经构建支持集群,NDBCLUSTER存储引擎仍然默认禁用。您可以使用以下两种选项之一来启用此引擎:

  • 在启动mysqld时,在命令行上使用--ndbcluster作为启动选项。

  • 在您的my.cnf文件的[mysqld]部分中插入一行包含ndbcluster

通过在 MySQL Monitor(mysql)中发出 SHOW ENGINES 语句,您可以轻松验证服务器是否启用了 NDBCLUSTER 存储引擎。您应该在 NDBCLUSTER 的行中看到 Support 值为 YES。如果在此行中看到 NO 或者输出中没有显示这样的行,则表示您没有运行启用了 NDB 的 MySQL 版本。如果在此行中看到 DISABLED,则需要按照刚才描述的两种方式之一启用它。

要读取集群配置数据,MySQL 服务器至少需要三个信息:

  • MySQL 服务器自身的集群节点 ID

  • 管理服务器的主机名或 IP 地址

  • 它可以连接到管理服务器的 TCP/IP 端口号

节点 ID 可以动态分配,因此不一定需要显式指定。

mysqld 参数 ndb-connectstring 用于在启动 mysqld 时的命令行或在 my.cnf 中指定连接字符串。连接字符串包含管理服务器的主机名或 IP 地址,以及其使用的 TCP/IP 端口。

在下面的示例中,ndb_mgmd.mysql.com 是管理服务器所在的主机,管理服务器在端口 1186 上监听集群消息:

$> mysqld --ndbcluster --ndb-connectstring=ndb_mgmd.mysql.com:1186

更多关于连接字符串的信息,请参阅 Section 25.4.3.3, “NDB Cluster Connection Strings”。

有了这些信息,MySQL 服务器可以作为集群中的完整参与者。在这种方式下运行的 mysqld 进程通常被称为 SQL 节点。它完全了解所有集群数据节点及其状态,并与所有数据节点建立连接。在这种情况下,它能够使用任何数据节点作为事务协调器,并读取和更新节点数据。

您可以在 mysql 客户端中使用 SHOW PROCESSLIST 查看 MySQL 服务器是否连接到集群。如果 MySQL 服务器连接到集群,并且您具有 PROCESS 权限,则输出的第一行如下所示:

mysql> SHOW PROCESSLIST \G
*************************** 1\. row ***************************
     Id: 1
   User: system user
   Host:
     db:
Command: Daemon
   Time: 1
  State: Waiting for event from ndbcluster
   Info: NULL

重要提示

要参与 NDB Cluster,必须使用both选项--ndbcluster--ndb-connectstring(或它们在my.cnf中的等效选项)启动mysqld进程。如果只使用--ndbcluster选项启动mysqld,或者无法联系到集群,就无法使用NDB表,也无法创建任何新表,无论存储引擎如何。后一限制是一项安全措施,旨在防止在 SQL 节点未连接到集群时创建与NDB表同名的表。如果希望在mysqld进程未参与 NDB Cluster 时使用不同的存储引擎创建表,必须在不使用--ndbcluster选项的情况下重新启动服务器。

25.6.11 NDB Cluster 磁盘数据表

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-disk-data.html

25.6.11.1 NDB Cluster 磁盘数据对象

25.6.11.2 NDB Cluster 磁盘数据存储要求

NDB Cluster 支持将NDB表的非索引列存储在磁盘上,而不是在 RAM 中。列数据和日志元数据保存在数据文件和撤销日志文件中,概念化为表空间和日志文件组,如下一节所述—参见第 25.6.11.1 节,“NDB Cluster 磁盘数据对象”。

NDB Cluster 磁盘数据性能可能受多个配置参数的影响。有关这些参数及其影响的信息,请参见磁盘数据配置参数,以及磁盘数据和 GCP 停止错误。

当使用单独的磁盘存储磁盘数据文件时,您还应将DiskDataUsingSameDisk数据节点配置参数设置为false

参见磁盘数据文件系统参数。

NDB 8.0 在使用固态硬盘的磁盘数据表时提供了改进的支持,特别是使用 NVMe 的硬盘。有关更多信息,请参阅以下文档:

  • 磁盘数据延迟参数

  • 第 25.6.16.31 节,“ndbinfo diskstat 表”

  • 第 25.6.16.32 节,“ndbinfo diskstats_1sec 表”

  • 第 25.6.16.49 节,“ndbinfo pgman_time_track_stats 表”

译文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-disk-data-objects.html

25.6.11.1 NDB Cluster 磁盘数据对象

NDB Cluster 磁盘数据存储是使用以下对象实现的:

  • 表空间:作为其他磁盘数据对象的容器。一个表空间包含一个或多个数据文件和一个或多个撤销日志文件组。

  • 数据文件:存储列数据。数据文件直接分配给表空间。

  • 撤销日志文件:包含用于回滚事务所需的撤销信息。分配给一个撤销日志文件组。

  • 日志文件组:包含一个或多个撤销日志文件。分配给一个表空间。

撤销日志文件和数据文件是每个数据节点文件系统中的实际文件;默认情况下,它们放置在ndb_*node_id*_fs中,在 NDB Cluster config.ini文件中指定的DataDir中,其中node_id是数据节点的节点 ID。可以通过在创建撤销日志或数据文件时指定绝对或相对路径的方式将其放置在其他位置。创建这些文件的语句稍后在本节中显示。

撤销日志文件仅用于磁盘数据表,并且不需要或不用于仅存储在内存中的NDB表。

NDB Cluster 表空间和日志文件组并非实现为文件。

尽管并非所有磁盘数据对象都实现为文件,但它们都共享相同的命名空间。这意味着每个磁盘数据对象必须具有唯一的名称(而不仅仅是给定类型的每个磁盘数据对象)。例如,您不能同时命名一个表空间和一个日志文件组为dd1

假设您已经设置好了包括管理节点和 SQL 节点在内的 NDB Cluster,创建 NDB Cluster 磁盘上的表的基本步骤如下:

  1. 创建一个日志文件组,并将一个或多个撤销日志文件分配给它(有时也称为撤销日志文件)。

  2. 创建一个表空间;将日志文件组以及一个或多个数据文件分配给表空间。

  3. 创建一个使用此表空间进行数据存储的磁盘数据表。

可以使用 SQL 语句在mysql客户端或其他 MySQL 客户端应用程序中完成这些任务,如下面的示例所示。

  1. 我们使用CREATE LOGFILE GROUP创建一个名为lg_1的日志文件组。该日志文件组由两个撤销日志文件组成,我们将它们命名为undo_1.logundo_2.log,它们的初始大小分别为 16 MB 和 12 MB。(撤销日志文件的默认初始大小为 128 MB。)可选地,您还可以为日志文件组的撤销缓冲区指定大小,或允许其采用默认值 8 MB。在本例中,我们将 UNDO 缓冲区的大小设置为 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 集群中最多只能存在一个日志文件组。

    • 当您使用ADD UNDOFILE '*filename*'将撤销日志文件添加到日志文件组时,将在集群中每个数据节点的ndb_*node_id*_fs目录中创建一个名为filename的文件,其中node_id是数据节点的节点 ID。每个撤销日志文件的大小与 SQL 语句中指定的大小相同。例如,如果一个 NDB 集群有 4 个数据节点,则刚刚显示的ALTER LOGFILE GROUP语句将创建 4 个撤销日志文件,每个数据节点的数据目录中各有一个;每个文件的名称为undo_2.log,大小为 12 MB。

    • UNDO_BUFFER_SIZE受系统可用内存量的限制。

    • 有关这些语句的更多信息,请参见 Section 15.1.16, “CREATE LOGFILE GROUP Statement”和 Section 15.1.6, “ALTER LOGFILE GROUP Statement”。

  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语句创建一个名为ts_1的表空间,其中包含数据文件data_1.dat,并将ts_1与日志文件组lg_1关联。ALTER TABLESPACE添加了第二个数据文件(data_2.dat)。

    一些需要注意的事项:

    • 就像在此示例中用于撤销日志文件的.log文件扩展名一样,在.dat文件扩展名中没有特殊意义;它仅用于便于识别。

    • 当您使用ADD DATAFILE '*filename*'向表空间添加数据文件时,将在集群中每个数据节点的ndb_*node_id*_fs目录中创建一个名为filename的文件,其中node_id是数据节点的节点 ID。每个数据文件的大小与 SQL 语句中指定的大小相同。例如,如果一个 NDB 集群有 4 个数据节点,则刚刚显示的ALTER TABLESPACE语句将创建 4 个数据文件,每个数据节点的数据目录中各有一个;每个文件的名称为data_2.dat,每个文件的大小为 48 MB。

    • NDB为每个表空间保留 4%的空间,用于在数据节点重新启动期间使用。此空间不可用于存储数据。

    • CREATE TABLESPACE语句必须包含一个ENGINE子句;只有使用与表空间相同存储引擎的表才能在表空间中创建。对于ALTER TABLESPACEENGINE子句被接受但已被弃用,并可能在将来的版本中被移除。对于NDB表空间,此选项的唯一允许值为NDBCLUSTERNDB

    • 在 NDB 8.0.20 及更高版本中,对于给定表空间使用的所有数据文件,范围的分配是以循环方式进行的。

    • 有关CREATE TABLESPACEALTER TABLESPACE语句的更多信息,请参见第 15.1.21 节,“CREATE TABLESPACE Statement”和第 15.1.10 节,“ALTER TABLESPACE Statement”。

  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 Statement”。

您可以通过查询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 节,“The INFORMATION_SCHEMA FILES Table”。

隐式存储在磁盘上的列的索引。 对于刚刚显示的示例中定义的表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,所以可以对它们进行索引。在这里,我们分别对c2c3添加索引,使用CREATE INDEXALTER TABLE

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'
 -> ENGINE NDBCLUSTER;

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

mysql> DROP TABLESPACE ts_1
 -> ENGINE NDBCLUSTER;

mysql> DROP LOGFILE GROUP lg_1
 -> ENGINE NDBCLUSTER;

这些语句必须按照显示的顺序执行,除了两个ALTER TABLESPACE ... DROP DATAFILE语句可以以任意顺序执行。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-disk-data-storage-requirements.html

25.6.11.2 NDB 集群磁盘数据存储要求

以下项目适用于磁盘数据存储要求:

  • 变长列的磁盘数据表占据固定的空间。对于每一行,这等于存储该列可能的最大值所需的空间。

    有关计算这些值的一般信息,请参阅第 13.7 节,“数据类型存储要求”。

    您可以通过查询信息模式FILES表来估算数据文件和撤销日志文件中可用空间的数量。有关更多信息和示例,请参阅第 28.3.15 节,“INFORMATION_SCHEMA FILES 表”。

    注意

    OPTIMIZE TABLE语句对磁盘数据表没有任何影响。

  • 在磁盘数据表中,TEXTBLOB列的前 256 个字节存储在内存中;只有剩余部分存储在磁盘上。

  • 磁盘数据表中的每一行在内存中使用 8 个字节指向存储在磁盘上的数据。这意味着,在某些情况下,将内存列转换为基于磁盘的格式实际上可能导致更大的内存使用量。例如,将CHAR(4)列从基于内存的格式转换为基于磁盘的格式会将每行使用的DataMemory从 4 字节增加到 8 字节。

重要提示

使用--initial选项启动集群不会删除磁盘数据文件。在执行集群的初始重新启动之前,您必须手动删除这些文件。

通过确保DiskPageBufferMemory的大小足够,可以通过最小化磁盘寻址次数来提高磁盘数据表的性能。您可以查询diskpagebuffer表来帮助确定是否需要增加此参数的值。

posted @ 2024-06-23 16:27  绝不原创的飞龙  阅读(1)  评论(0编辑  收藏  举报