MySQL NDB Cluster 8.0 发行说明  /  MySQL NDB Cluster 8.0.27 的变化(2021-10-19,全面上市)

MySQL NDB Cluster 8.0.27 的变化(2021-10-19,全面上市)

MySQL NDB Cluster 8.0.27 是 NDB 8.0 的新版本,它基于 MySQL Server 8.0,包括 NDB存储引擎 8.0 版中的功能,并修复了最近在之前的 NDB Cluster 版本中发现的错误。

获取 NDB Cluster 8.0。  NDB Cluster 8.0 源代码和二进制文件可以从 https://mysql.net.cn/downloads/cluster/获得。

有关 NDB Cluster 8.0 中所做更改的概述,请参阅 NDB Cluster 中的新增功能

此版本还包含了在以前的 NDB Cluster 版本中所做的所有错误修复和更改,以及通过 MySQL 8.0.27 在主线 MySQL 8.0 中添加的所有错误修复和功能更改(请参阅MySQL 8.0.27 中的更改(2021-10- 19,一般可用性))。

添加或更改的功能

  • 重要变化: 旧的MaxAllocate数据节点配置参数在任何当前版本的NDB. 从此版本开始,它已被弃用,并会在未来的版本中删除。(漏洞 #52980,漏洞 #11760559)

  • NDB Cluster API: 作为推送查询的一部分推送的条件现在可以引用同一推送查询中祖先表中的列。

    例如,给定一个使用 创建的表 CREATE TABLE t (x INT PRIMARY KEY, y INT) ENGINE=NDB,此处所示的查询现在可以使用条件下推:

    SELECT * FROM t AS a
    LEFT JOIN t AS b
    ON a.x=0 AND b.y>5,

    推送条件 可能包括任何常见的 比较运算符、、、、、 <和。<=>>==<>

    比较的值必须属于同一类型,包括长度、精度和小数位数。

    NULL处理是根据 ISO SQL 标准规定的比较语义进行的;NULL与returns 的任何比较NULL

    有关详细信息,请参阅 发动机状况下推优化

    作为这项工作的一部分, NdbInterpretedCode在 NDB API 中实现了以下方法,用于将列值与参数值进行比较:

    此外,新的 NdbScanFilter::cmp_param()API 方法可以定义列值和参数值之间的比较。

  • 在监控和断开空闲 TCP 连接的环境中,空闲集群可能会遭受不必要的数据节点故障,并且多个数据节点的故障可能会导致集群意外关闭。

    为了解决这个问题,我们引入了一个新的保持活动信号 ( GSN_TRP_KEEP_ALIVE),它会定期在数据节点之间的所有连接上发送,默认情况下每 6000 毫秒(一分钟)发送一次。这些信号之间的间隔长度可以通过设置 KeepAliveSendInterval 此版本中引入的数据节点参数来调整,可以将其设置为 0 以禁用保持活动信号。您应该知道, NDB不执行检查是否收到这些信号,也不对他们的帐户执行断开连接(这仍然是心跳协议的责任)。(缺陷号 32776593)

  • 复制ALTER TABLE现在会在执行复制之前和之后检查源表的片段提交计数。这允许执行 SQL 节点的 SQL 节点 ALTER TABLE确定是否有对正在更改的表的任何并发写入活动,如果有,则终止操作,这有助于避免静默丢失或数据损坏。发生这种情况时,该 ALTER TABLE语句现在被拒绝,并显示在复制 ALTER TABLE 期间检测到对源表中数据的更改错误。更改中止以避免不一致。(错误#24511580,错误#25694856)

  • NDB现在默认启用索引统计信息 的创建和更新。此外,在恢复元数据时,ndb_restore现在创建索引统计表(如果它们尚不存在)。

修正错误

  • 重要变更;NDB Cluster APIs: 由于 MySQL 8.0 使用数据字典来存储表元数据,因此 现在不推荐使用以下与文件 Table相关的 NDB API 方法 .FRM

    NDB 8.0 使用 getExtraMetadata()setExtraMetadata()读写存储在 MySQL 数据字典中的表元数据;您应该期望在*Frm*() NDB Cluster 的未来版本中删除前面列出的方法。(漏洞#28248575)

  • 重要更改: 两个mysqld 选项--ndb-wait-connected--ndb-wait-setup已从 30 秒增加到 120 秒。(缺陷号 32850056)

  • Microsoft Windows: 删除了使用 Visual Studio 16.9.5 构建 NDB Cluster 和 NDB 实用程序时生成的许多警告。(缺陷号 32881961)

  • Microsoft Windows: 在 Windows 上,当集群配置为使用超过 64 个数据节点时,无法成功启动数据节点。(错误#104682,错误#33262452)

  • NDB Cluster API: 许多 MGM API 函数(包括 ndb_mgm_create_logevent_handle())未正确释放内存。(漏洞#32751506)

  • NDB Cluster API: 尝试使用 NdbDictionary启用索引统计信息创建索引并且索引统计表丢失导致NDB错误 723 No such table existed,此上下文中丢失的表是统计表之一,这对用户来说并不明显. 现在在这种情况下,NDB 而是返回错误 4714 Index stats system tables do not exist,这是在此版本中添加的。(缺陷号 32739080)

  • NDB Cluster API: NDB Cluster 中包含的适用于 JavaScript 的 MySQL NoSQL 连接器现在使用 Node.js 版本 12.2.6 构建。

  • 内核块中使用的缓冲区SUMA 并不总是容纳多个信号。(缺陷号 33246047)

  • DbtupBuffer.cpp优先级中调整到当前在一条路径中执行的内容,但它不用于短信号。这导致 TRANSID_AI信号、 SCAN_FRAGCONF信号或两种信号无序到达的风险。(缺陷号 33206293)

  • 在以下条件下,存储引擎作为推送连接执行的查询NDB 返回的行数少于预期:

    • 该查询包含使用该算法 作为推送连接执行的INor 子查询。EXISTSfirstMatch

    • 子查询本身还包含一个使用至少 2 个表的外部连接,其中至少一个使用 eq_ref访问类型。

    (缺陷号 33181964)

  • NDB 8.0.23 中为向 ThreadConfig参数添加查询线程所做的部分工作包括添加TUX扫描上下文,用于优化扫描,但在某些情况下,这在扫描结束后没有正确设置。(错误#33161080,错误#32794719)

    参考资料:另请参阅:Bug #33379702。

  • 在查找列以添加链接值时,在 推送连接时返回 未找到属性错误。NDB

    该问题是由于对列名称使用了错误的字母大小写引起的,并且通过确保我们在执行查找时使用未修改的原始列名称来解决。(缺陷号 33104337)

  • 在某些情况下,数组索引可能会超过 NO_OF_BUCKETS. (缺陷号 33019959)

  • 当事务操作所需的资源不适合分配给事务协调器的资源时,NDB 8.0 中的更改导致返回永久错误(NDB 错误 261),而不是像以前版本中那样返回临时错误(错误 233)。这在 NDB Replication 中很重要,其中重试临时错误,但不会重试永久错误;当事务本身太大而无法在不重新配置的情况下容纳在事务协调器中时,永久错误是合适的,但是当事务由于其他事务消耗资源而无法容纳时,错误应该是暂时的,因为事务可能能够容纳稍后,或在其他TC情况下。

    在这种情况下返回的临时错误(NDB 错误 233)现在的含义略有不同;也就是说,没有足够的池内存来分配另一个操作。(以前,这个错误意味着 MaxNoOfConcurrentOperations 已经达到了设置的限制。)

    我们没有混淆这些含义(动态分配和配置的限制),而是添加了一个新的临时错误(错误 234),当达到配置的限制时返回该错误。有关这些错误的更多信息,请参阅临时资源错误应用程序错误。(缺陷号 32997832)

    参考资料:另请参阅:Bug #33092571。

  • 添加了一个ndbrequire()in QMGR来检查从信号中接收到的节点 ID 是否CM_REGREF小于MAX_NDB_NODES. (缺陷号 32983311)

  • 据报告处理 GET_TABLEID_REQ信号的代码中缺少检查。为了解决这个问题,所有与所有GET_TABLEID_* 信号相关的代码都已从NDB 源代码中删除,因为 NDB Cluster 不再使用或支持这些信号。(缺陷号 32983249)

  • 添加了一个ndbrequire()in QMGR以确保来自信号数据的过程报告使用适当的节点 ID。(缺陷号 32983240)

  • 在某些情况下,使用内部管理 API 时可能会指定无效的节点类型。现在 API 明确禁止无效节点类型,并定义了一个 未知节点类型 ( NDB_MGM_NODE_TYPE_UNKNOWN) 来涵盖此类情况。(缺陷号 32957364)

  • NdbReceiver并不总是BIT正确地初始化 MySQL 列的存储。(缺陷号 32920099)

  • 从未注册为当前模式操作参与者的节点接收虚假模式操作回复导致 SQL 节点意外关闭。

    现在在这种情况下,我们会丢弃来自任何未注册为参与者的节点的回复。(漏洞#32891206)

    参考资料:另请参阅:Bug #30930132、Bug #32509544。

  • 在文件中设置时 ,布尔参数 的值true和 如未正确处理 。(此问题不影响文件中此类值的处理。)(漏洞 #32871875)falseAutomaticThreadConfig.cnf.ini

  • storage/ndb/src/common/util/version.cpp. (缺陷号 32763321)

  • 索引统计实现支持的最大索引大小NDB 为 3056 字节。当表包含足够的数据以触发统计更新时,尝试创建更大的索引导致 CREATE INDEX被拒绝并收到错误 911 'Index stat scan requested on index with unsupported key size' 来自 NDBCLUSTER

    此错误起源于 TUX扫描期间的内核块,导致模式事务失败。当表包含非零行数时,在创建索引期间触发此扫描;这也会发生在自动更新索引统计信息或执行 ANALYZE TABLE.

    创建索引作为表的一部分CREATE TABLE或当表不包含任何行时不会返回任何错误。在这种情况下没有生成统计信息,同时 ANALYZE TABLE返回与上述类似的错误。

    我们通过允许创建索引同时从在处理程序级别引入的新检查返回适当的警告来解决此问题。此外,TUX扫描现在通过抑制错误来处理这种情况,而是返回成功,有效地将表视为空片段。否则,这种情况下的行为保持不变,向客户端返回警告并且不生成索引统计信息,无论表是否包含任何行。(缺陷号 32749829)

    参考:这个问题是 Bug #28714864 的回归。

  • 当设置为且所有 SQL 节点都以 启动时,使用有序索引 的CREATE TABLE语句返回错误 ,因为当设置为 时,该选项阻止创建索引统计表。现在这些表总是在mysqld 启动时创建,而不管 . (缺陷号 32649528)IndexStatAutoCreate1--ndb-index-stat-enable=OFFOFF--ndb-index-stat-enable

  • 如果NDB模式操作在协调器可以处理之前丢失,则记录该操作的客户端会无限期地等待协调器完成或中止它。(缺陷号 32593352)

    参考资料:另请参阅:Bug #32579148。

  • 当使用一个或多个无效选项调用时, ndb_mgmd现在会向集群日志写入一条描述性错误消息。(缺陷号 32554492)

  • 用作NDB 连接字符串的一部分并且在第一个冒号后只有十进制数字的 IPv6 地址被错误地解析,并且无法用于连接到管理服务器。(缺陷号 32532157)

  • 同时创建用户然后授予该用户 NDB_STORED_USER在不同 MySQL 服务器上的权限有时会导致这些服务器挂起。

    这是因为当NDB 启用存储引擎时,所有涉及用户和授权的 SQL 语句都会被评估以确定它们是否影响任何拥有NDB_STORED_USER特权的用户,之后一些语句被忽略,一些被分发到所有 SQL 节点作为语句,有些作为请求分发到所有 SQL 节点以读取和应用用户权限快照。这些快照存储在 mysql.ndb_sql_metadata表中。与仅限于一个 SQL 语句的语句更新不同,快照更新最多可为每个用户包含七个 SQL 语句。等待任何锁定NDB当线程正在等待本地 ACL 缓存上的独占锁时,二进制日志线程在管理分布式用户时很容易导致死锁。

    NDB_STORED_USER我们通过在快照更新 周围实现显式锁定来解决这个问题 ;ndb_sql_metadata现在在对表的一行持有全局读锁的同时执行快照分发。(以前,语句和快照分发都是异步执行的,没有锁定。)现在,当线程在第一次尝试时没有获得此锁时,会发出警告,并防止死锁。

    有关更多信息,请参阅 权限同步和 NDB_STORED_USER。(缺陷号 32424653)

    参考资料:另请参阅:Bug #32832676。

  • 当集群处于单用户模式时,无法创建或更新索引统计信息,因为除了指定的 API 节点授予访问权限之外,任何节点都不允许事务,无论类型如何。这阻止了负责启动与索引统计相关的事务的数据节点这样做。

    我们通过放宽单用户模式下的约束并允许源自数据节点(但不是来自其他 API 节点)的事务来解决此问题。(缺陷号 32407897)

  • 当启动多个管理节点时,第一个这样的节点在提交配置之前等待其他节点启动,但这并没有明确地传达给用户。此外,当数据节点在未启动所有管理节点的情况下启动时,由于尚未提交任何配置,因此不会向用户提供未分配其节点 ID 的指示。现在在这种情况下,管理节点会打印一条消息,告知用户集群已配置为使用多个管理节点,并确保所有此类节点都已启动。(缺陷号 32339789)

  • 为了处理在 MySQL 服务器(SQL 节点)保持运行时重新启动集群的情况,在初始集群启动或重新启动发生时通知索引统计线程。索引统计线程强制创建新 Ndb对象并检查各种系统对象,当 MySQL 服务器与初始集群启动同时启动时,这是不必要的,导致不必要地重新创建 Ndb对象。

    在这种情况下,我们通过仅重新启动侦听器来解决此问题,而不是强制Ndb重新创建对象。(错误#29610555,错误#33130864)

  • 删除了节点日志中因错误写入的某些条目中出现的无关空格。(漏洞#29540486)

  • ndb_restore--disable-indexes元数据已经用 --disable-indexes.

    --disable-indexes用于在恢复数据之前恢复元数据时,目标架构中的表没有索引。我们现在在使用此选项恢复数据时检查以确保目标表上没有索引,并且仅当表已经有索引时才打印警告。(漏洞#28749799)

  • 二进制日志注入器NDB线程现在可以在处理从存储引擎接收到的数据更改事件时检测到错误。如果检测到错误,线程会记录错误消息并自行重启,作为重启的一部分,异常、事件或LOST_EVENTS条目将写入二进制日志。此特殊条目向复制应用程序指示二进制日志不完整。(缺陷号 27150740)

  • 当使用 完成元数据的恢复时 --disable-indexes,没有尝试创建依赖于这些索引的索引或外键,但是当在没有选项的情况下使用ndb_restore时,创建了索引和外键。--disable-indexes稍后在恢复数据时 使用 when,NDB尝试删除在上一步中创建的任何索引,但由于依赖于未删除的外键索引而忽略了删除索引操作的失败。当试图创建已经存在的外键时,这随后导致重建索引时出现问题。

    我们修复ndb_restore如下:

    • 使用时--disable-indexesndb_restore现在会删除从备份中恢复的任何外键。

    • ndb_restore现在在尝试删除索引之前检查索引是否存在。

    (漏洞#26974491)

  • ndb_restore--ndb-nodegroup-map 选项未按预期运行,支持它的代码已被删除。该选项现在什么都不做,为它设置的任何值都将被忽略。(漏洞 #25449055)

  • 事件记录器显示的事件缓冲区状态消息已得到改进。现在仅在需要时才显示百分比。此外,如果未定义最大尺寸,则打印输出显示max=unlimited. (缺陷号 21276857)

  • 中创建的文件句柄和FileLogHandler对象MgmtSrvr::configure_eventloggerBufferedLogHandler. 这意味着,每次在运行的 ndb_mgmd中更改集群配置时,都会重新打开集群日志并泄漏文件句柄,这可能会导致测试程序出现问题,并可能导致其他问题。(漏洞 #18192573)

  • --configdir指定为.,但当前工作目录不是DataDir时,二进制配置是在当前目录中创建的,DataDir 而不是在当前目录中创建的。此外 ,DataDir.

    我们通过让ndb_mgmd检查路径并在为 指定相对路径时拒绝启动来 解决此问题--configdir。(漏洞 #11755867)

  • NDBCLUSTER无法创建用于接收集群事件的订阅 时发生内存泄漏。提供的事件数据的所有权应该被接管,但实际上只有在创建成功时才会发生,在其他情况下,提供的事件数据只是丢失了。(错误#102794,错误#32579459)

  • 如果还指定了ndb_mgmd ,则忽略该 --ndb-connectstring选项 --config-file如果同时使用这两个选项,现在会发出警告。(错误#102738,错误#32554759)

  • 数据节点配置参数 在任何当前支持的 NDB Cluster 版本UndoDataBufferUndoIndexBuffer都没有影响。这两个参数现在都已弃用,并且在集群配置文件中出现任何一个都会引发警告;您应该期望它们会在未来的版本中被删除。(漏洞 #84184,漏洞 #26448357)

  • UPDATE 使用LIMIT子句 执行批量语句会在NDB. 我们通过放宽对NDB 表的断言来解决此问题,因为我们预计在某些情况下此时会返回错误。