Documentation Home
MySQL 8.0 参考手册  / 第 23 章 MySQL NDB Cluster 8.0  / 23.3 NDB Cluster 安装  /  23.3.7 升级和降级 NDB Cluster

23.3.7 升级和降级 NDB Cluster

本节提供有关 NDB Cluster 软件和不同 NDB Cluster 8.0 版本之间在执行升级和降级方面的兼容性的信息。在尝试升级或降级之前,您应该已经熟悉安装和配置 NDB Cluster。请参阅 第 23.4 节,“NDB Cluster 的配置”

重要的

NDBNDB 8.0 支持存储引擎 次要版本之间的在线升级和降级 。还支持对包含的 MySQL 服务器(SQL 节点mysqld )进行就地升级 ;对于多个 SQL 节点,可以在重新启动各个mysqld进程时保持 SQL 应用程序在线。支持就地降级包含的 MySQL 服务器 (请参阅 第 2.12 节,“降级 MySQL”)。

在某些情况下,可以将最近从一个 NDB 8.0 次要版本的升级恢复到更高版本,并恢复作为 SQL 节点运行的任何 MySQL 服务器实例的所需状态。如果这变得可取或必要,强烈建议您在升级 NDB Cluster 之前对每个 SQL 节点进行完整备份。出于同样的原因,您还应该使用 启动新版本的mysqld 二进制文件 --ndb-schema-dist-upgrade-allowed=0,并且不允许将其设置回 1,直到您确定恢复到旧版本的可能性已经过去。有关更多信息,请参阅恢复 NDB Cluster 8.0 升级

有关从 8.0 之前的版本升级到 NDB 8.0 的信息,请参阅支持升级到 NDB 8.0 的版本

有关升级或降级 NDB 8.0 时遇到的已知问题和问题的信息,请参阅 已知问题

支持升级到 NDB 8.0 的版本

NDB Cluster 的以下版本支持升级到 NDB Cluster 8.0(8.0.19 及更高版本)的 GA 版本:

  • NDB Cluster 7.6:NDB 7.6.4 及更高版本

  • NDB Cluster 7.5:NDB 7.5.4 及更高版本

  • NDB Cluster 7.4:NDB 7.4.6 及更高版本

要从 NDB 7.4 之前的版本系列升级,您必须分阶段升级,首先升级到刚刚列出的版本之一,然后从该版本升级到最新的 NDB 8.0 版本。在这种情况下,建议第一步升级到最新的 NDB 7.6 版本。有关从以前版本升级到 NDB 7.6 的信息,请参阅 升级和降级 NDB 7.6

恢复 NDB Cluster 8.0 升级

在最近将 NDB Cluster 软件升级到 NDB 8.0 版本之后,可以将NDB 软件恢复到早期版本,前提是在升级之前满足某些条件,在集群运行较新版本期间,以及之后NDB Cluster 软件恢复到早期版本。具体视当地情况而定;本节提供有关在刚刚描述的升级和回滚过程中的每个点应该做什么的一般信息。

在大多数情况下,升级和降级数据节点可以毫无问题地完成,如其他地方所述;参见 第 23.6.5 节,“执行 NDB Cluster 的滚动重启”。(在执行升级或降级之前,您应该执行 NDB备份; 有关如何执行此操作的信息,请参阅第 23.6.8 节,“NDB Cluster 的在线备份” 。)由于以下原因,不支持在线降级 SQL 节点问题:

  • 如果 8.0 版本的mysqld检测到来自更高版本 MySQL 的文件系统,则它无法启动。

  • 在许多情况下,mysqld无法打开由较新版本的 MySQL 创建或修改的表。

  • 在大多数(如果不是全部)情况下,mysqld无法读取在更高版本的 MySQL 中创建或修改的二进制日志文件。

接下来概述的过程提供了将集群从一个版本升级到另一个版本所需的基本步骤,X 同时Y允许将来可能回滚到X. (将升级后的集群恢复到版本的过程 X在本节后面。)为此,版本X是任何 NDB 8.0 GA 版本,或支持升级到 NDB 8.0 的任何以前的 NDB 版本(请参阅 支持升级到 NDB 8.0 的版本) , 版本 Y是 NDB 8.0 版本,晚于X.

  • 升级之前:备份 NDB XSQL 节点状态。这可以通过以下一项或多项来完成:

    建议在任何升级之前备份 SQL 节点,无论您以后是否打算将集群恢复到以前的NDB版本。

  • 升级到 NDB Y : 必须启动 所有 NDB mysqld二进制文件, 以防止任何自动模式升级。(一旦降级的任何可能性都过去了,您可以 在mysql客户端中安全地将相应的系统变量改回默认值 1。)当每个 NDBSQL 节点启动时,它连接到集群并同步其 表模式。之后,您可以从备份中恢复 MySQL 表和状态数据。 Y --ndb-schema-dist-upgrade-allowed=0ndb_schema_dist_upgrade_allowedYNDB

    为了确保 NDB 复制的连续性,有必要升级集群的 SQL 节点,以便在升级期间的任何给定时间点至少有一个mysqld作为复制源。使用两个 SQL 节点AB,您可以这样做:

    1. 在使用 SQL 节点B作为复制通道时,将 SQL 节点 A从 NDB 版本 升级X到 version Y。这导致在Aepoch 上的二进制日志中出现间隙E1

    2. 在所有复制应用程序都使用了 SQL 节点B过去时期的二进制日志后E1,将复制通道切换为使用 SQL 节点 A

    3. 将SQL 节点升级B到 NDB 版本Y。这导致在Bepoch上的二进制日志中出现间隙E2

    4. 在所有复制应用程序都使用了A过去 epoch的 SQL 节点的二进制日志之后E2,您可以再次切换复制通道以根据需要使用任一 SQL 节点。

    不要ALTER TABLE在任何现有的NDB桌子上使用;不要创建任何NDB在降级之前无法安全删除的新表。

以下过程显示了在如刚才所述执行升级后将 NDB Cluster 从一个版本回滚到另一个版本所需的基本步骤 XY这里,versionX是任何 NDB 8.0 GA 版本,或支持升级到 NDB 8.0 的任何以前的 NDB 版本(请参阅 支持升级到 NDB 8.0 的版本);版本 Y是 NDB 8.0 版本,晚于X.

  • 回滚之前:从应该保留的 NDB 收集任何 mysqld状态信息。Y在大多数情况下,您可以使用 mysqldump执行此操作。

    备份状态数据后,删除 NDB自升级发生以来创建或更改的所有表。

    在任何 NDB Cluster 软件版本更改之前,始终建议备份 SQL 节点。

    X您必须为每个 mysqld(SQL 节点) 提供与 MySQL 兼容的文件系统 。您可以使用以下两种方法之一:

  • NDB 降级后:将数据节点降级为 NDBX后,启动版本 XSQL 节点( mysqld的实例)。恢复或修复每个 SQL 节点所需的任何其他本地状态信息。MySQLD 状态可以根据需要与以下操作的某些组合(0 或更多)对齐:

    • 初始化命令,例如 mysqld --initialize

    • X 恢复从版本SQL 节点 捕获的任何所需或必需的状态信息。

    • Y 恢复从版本SQL 节点 捕获的任何所需或必需的状态信息。

    • 执行清理,例如删除陈旧日志(如二进制日志或中继日志),并删除任何不再有效的时间相关状态。

    与升级时一样,降级时有必要保持 NDB 复制的连续性,以降级集群的 SQL 节点,以便在降级过程中的任何给定时间点至少有一个 mysqld作为复制源。这可以通过与之前描述的升级 SQL 节点的方式非常相似的方式来完成。使用两个 SQL 节点AB,您可以在降级期间保持二进制日志记录没有任何间隙,如下所示:

    1. 使用 SQL 节点B作为复制通道,将 SQL 节点 A从 NDB 版本 降级Y到 version X。这导致在Aepoch 上的二进制日志中出现间隙F1

    2. 在所有复制应用程序都使用了 SQL 节点B过去时期的二进制日志后F1,将复制通道切换为使用 SQL 节点 A

    3. 将SQL 节点降级B到 NDB 版本X。这导致在Bepoch上的二进制日志中出现间隙F2

    4. 在所有复制应用程序都使用了A过去 epoch的 SQL 节点F2的二进制日志后,二进制日志的冗余将恢复,您可以根据需要再次使用任何一个 SQL 节点作为复制通道。

    另请参阅 第 23.7.7 节,“为 NDB Cluster 复制使用两个复制通道”

已知的问题

在本节中,提供有关升级或降级到 NDB 8.0 版本、从 NDB 8.0 版本或在 NDB 8.0 版本之间升级或降级时发生的已知问题的信息。

我们建议您在任何 NDB Cluster 软件升级或降级期间不要尝试任何模式更改。此处列出了一些原因:

  • 在数据节点启动的某些阶段,表上的DDL 语句NDB是不可能的。

  • NDB如果在执行期间任何数据节点停止,表 上的 DDL 语句可能会被拒绝;作为升级或降级过程的一部分,需要停止每个数据节点二进制文件(以便它可以被目标版本的二进制文件替换)。

  • NDB当同一集群中的数据节点运行不同版本的 NDB Cluster 软件时,不允许 在表上使用 DDL 语句。

有关用于执行数据节点在线升级或降级的滚动重启过程的其他信息,请参阅第 23.6.5 节,“执行 NDB Cluster 的滚动重启”

当您在 NDB 8.0 的次要版本之间执行在线升级时,您应该了解以下列表中的问题。从以前的 NDB Cluster 主要版本升级到任何规定的 NDB 8.0 版本时,这些问题也适用。

  • NDB 8.0.22 添加了对文件中管理节点和数据节点的 IPv6 寻址的支持config.ini 。要开始使用 IPv6 地址作为升级的一部分,请执行以下步骤:

    1. 以通常的方式将集群升级到版本 8.0.22 或更高版本的 NDB Cluster 软件。

    2. 将文件中使用的地址更改 config.ini为 IPv6 地址。

    3. 执行集群的系统重启。

  • 由于内部 mysql.ndb_schema表的更改,如果您升级到 8.0.24 之前的 NDB 8.0 版本,建议您使用它--ndb-schema-dist-upgrade-allowed = 0来避免意外中断(Bug #30876990,Bug #31016905)。

    此外,如果您有任何可能在升级到较新版本后恢复到以前版本的 NDB Cluster,则必须从较新版本启动所有 mysqld进程,--ndb-schema-dist-upgrade-allowed = 0 以防止与旧版本不兼容的更改被更改为ndb_schema桌子。有关如何执行此操作的信息, 请参阅 恢复 NDB Cluster 8.0 升级。

  • NDB 8.0.29 中引入的 EncryptedFileSystem 配置参数在某些情况下可能会导致撤消日志文件被加密,即使明确设置为0,这可能会导致在使用磁盘数据表并尝试升级或降级到 NDB 8.0.29 时出现问题. 在这种情况下,您可以通过在滚动重启过程中执行数据节点的初始重启来解决该问题。

  • 如果您使用的是多线程数据节点 ( ndbmtd ) 和 配置参数,则在 从以前的版本升级到 NDB 8.0.30 或更高版本时ThreadConfig ,您可能需要更改文件中为此设置的值。config.ini从 NDB 8.0.23 或更早版本升级时,必须显式设置早期版本中隐含的 、 、 或线程mainrep任何 recv用法。ldm从 NDB 8.0.23 或更高版本升级到 NDB 8.0.30 或更高版本时,recv必须在ThreadConfig 字符串中明确设置线程的任何使用。此外,为避免使用main, rep,或ldmNDB 8.0.30 或更高版本中的线程,您必须将给定类型的线程计数0显式设置为。

    下面是一个例子。

    NDB 8.0.22 及更早版本

    • config.ini文件包含 ThreadConfig=ldm.

    • 这由 as 的这些版本 NDB解释 ThreadConfig=main,ldm,recv,rep

    • config.ini在 NDB 8.0.30 或更高版本 中需要匹配效果: ThreadConfig=main,ldm,recv,rep

    NDB 8.0.23—8.0.29

    • config.ini文件包含 ThreadConfig=ldm.

    • 这由 as 的这些版本 NDB解释 ThreadConfig=ldm,recv

    • config.ini在 NDB 8.0.30 或更高版本 中需要匹配效果: ThreadConfig=main={count=0},ldm,recv,rep={count=0}

    有关详细信息,请参阅 ThreadConfig 配置参数的说明。

支持从以前的 NDB Cluster 主要版本(7.4、7.5、7.6)升级到 NDB 8.0;有关特定版本,请参阅 支持升级到 NDB 8.0的版本。此类升级受此处列出的问题的影响:

  • 在 NDB 8.0 中,默认值更改为 log_bin(从 0 到 1)和 ndb_log_bin(从 1 到 0)。这意味着您现在必须显式设置 ndb_log_bin为 1 才能启用二进制日志记录。

  • NDB Cluster 8.0 不支持在 先前版本系列中实现的在 MySQL 服务器之间共享的 分布式权限(请参阅使用共享授权表的分布式权限)。启动时,随 NDB 8.0 提供的 mysqld及更高版本检查是否存在任何使用 NDB存储引擎的授权表;如果找到任何内容,它会使用 . 创建这些内容的本地副本(影子表InnoDB。对于连接到 NDB Cluster 的每个 MySQL 服务器都是如此。在所有充当 NDB Cluster SQL 节点的 MySQL 服务器上执行此操作后,NDB可以使用NDB Cluster 发行版提供 的ndb_drop_table实用程序安全地删除授权表,如下所示:

    ndb_drop_table -d mysql user db columns_priv tables_priv proxies_priv procs_priv

    保留NDB授权表是安全的,但它们不用于访问控制并且实际上被忽略了。

    有关 NDB 8.0 中使用的 MySQL 权限系统的更多信息,请参阅 第 23.6.12 节,“权限同步和 NDB_STORED_USER”,以及第 6.2.3 节,“授予表”

  • --initial将 NDB 7.6 之前的任何版本升级到任何 NDB 8.0 版本时 ,有必要重新启动所有数据节点 。这是由于在 NDB 8.0 中增加了对增加节点数的支持。

尝试从 NDB 8.0 降级到以前的主要版本时遇到的问题可以在以下列表中找到:

  • 在 NDB 8.0 中创建的表不向后兼容 NDB 7.6 和早期版本,因为 NDB表实现的额外元数据属性的使用发生了变化,以提供对 MySQL 数据字典的完全支持。这意味着有必要采取额外的步骤在降级之前从集群的 SQL 节点保留任何所需的状态信息,然后在降级之后恢复它。

    更具体地说, NDBCLUSTER支持在线降级存储引擎(即数据节点),但不能在线降级 SQL 节点。这是因为给定 MySQL 8.0 或更早版本的 MySQL 服务器 ( mysqld ) 无法使用(更高版本)8.0 版本的系统文件,并且无法打开在更高版本中创建的表。可以回滚最近从以前的 NDB 版本升级的集群;有关何时以及如何完成此操作的信息, 请参阅 恢复 NDB Cluster 8.0 升级。

    有关这些问题的其他信息,请参阅 NDB 表额外元数据的更改;另见第 14 章,MySQL 数据字典

  • 在 NDB 8.0 中,二进制配置文件格式得到了增强,可以支持比以前版本更多的节点。运行旧版本 的节点无法访问新格式NDB,尽管较新的管理服务器可以检测到旧节点并使用适当的格式与它们通信。

    虽然升级到 NDB 8.0 在这方面应该没有问题,但旧的管理服务器无法读取更新的二进制配置文件格式,因此在从 NDB 8.0 降级到以前的主要版本时需要一些手动干预。执行此类降级时,有必要在使用旧软件版本开始管理之前删除所有缓存的二进制配置文件 NDB,并让管理服务器可以读取明文配置文件。或者,您可以使用该选项启动旧的管理服务器 --initial(同样,必须有config.ini 可用的)。如果集群使用多个管理服务器,则必须为每个管理服务器二进制文件完成这两件事之一。

    同样与支持增加的节点数量有关,并且由于 NDB 8.0 中数据节点 LCP 中实现的不兼容更改Sysfile,在执行从 NDB 8.0 到先前主要版本的在线降级时,有必要使用重新启动所有数据节点--initial选项 。

  • 不支持将运行超过 48 个数据节点的集群或使用节点 ID 大于 48 的数据节点在线降级到 NDB 8.0 的早期 NDB Cluster 版本。在这种情况下,有必要减少数据节点的数量,更改所有数据节点的配置,以便它们使用小于或等于 48 的节点 ID,或两者同时使用,以不超过旧的最大值。

  • 如果要从 NDB 8.0 降级到 NDB 7.5 或 NDB 7.4,则必须 IndexMemory在集群配置文件中设置一个显式值(如果尚不存在)。这是因为 NDB 8.0 不使用此参数(在 NDB 7.6 中已删除)并默认将其设置为 0,而在 NDB 7.5 和 NDB 7.4 中则需要此参数,在这两个版本中,集群都拒绝以收到的无效配置启动来自 Management Server... 如果IndexMemory未设置为非零值。

    从 NDB 8.0 降级到 NDB 7.6 不需要 设置IndexMemory