MySQL NDB Cluster 8.0.14 是 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.14 在主线 MySQL 8.0 中添加的所有错误修复和功能更改(请参阅MySQL 8.0.14 中的更改(2019-01- 21,一般可用性))。
-
性能: 此版本在扫描性能方面引入了许多重大改进;这些列在这里:
行校验和有助于检测硬件问题,但这样做会牺牲性能。现在提供了通过将新服务器系统变量设置为 0
NDB
来禁用这些功能的可能性 ;ndb_row_checksum
这样做意味着行校验和不用于新的或更改的表。这会对所有类型的查询的性能产生重大影响(在某些情况下为 5% 到 10%)。此变量默认设置为 1,以提供与以前行为的兼容性。当队列不忙时,包含扫描的查询可以在 LDM 线程中执行更长时间。
以前,在检查推送条件之前读取列;现在在读取任何列之前检查推送条件。
当使用范围扫描作为连接执行的一部分时,推送连接的性能应该会得到显着改善。
NDB 磁盘数据:
NDB
现在通过 SQL 节点在连接到集群时实现磁盘数据对象的模式分布,包括表空间和日志文件组,就像它对NDB
数据库和内存表所做的那样。这消除了 MySQL 数据字典与本NDB
机备份和还原后的字典之间可能出现的不匹配,当磁盘数据表空间和撤消日志文件组还原到NDB
字典而不是 MySQL 服务器的数据字典时可能会出现这种情况。NDB 磁盘数据:
NDB
现在使用 MySQL 数据字典来确保在连接到集群时跨所有集群 SQL 节点正确分配表空间和日志文件组。-
表的额外元数据属性
NDB
现在用于存储来自 MySQL 数据字典的信息。由于此信息明显大于以前存储在此处的二进制表示(一个.frm
文件,不再使用),因此增加了此额外元数据的硬编码大小限制。此更改可能会影响降级:尝试读取
NDB
在 NDB 8.0.14 及更高版本中创建的表可能会导致运行 NDB 8.0.13 或更早版本的数据节点在启动时失败,NDB
错误代码为 2355 Failure to restore schema: Permanent error, external action需要:资源配置错误。如果表的元数据大小超过 6K(这是旧限制),就会发生这种情况。在 NDB 8.0.13 及更早版本中创建的表可以被更高版本读取而不会出现任何问题。有关更多信息,请参阅 NDB 表额外元数据的更改,另请参阅MySQL 数据字典。(缺陷号 27230681)
打包: 预期的 NDB 头文件位于
devel
RPM 包中,而不是libndbclient-devel
. (缺陷 #84580,缺陷 #26448330)-
ndbmemcache:
libndbclient.so
无法找到和加载libssl.so
,这可能会导致ndbmemcache
使用NDB
. (漏洞#26824659)参考资料:另请参阅:Bug #27882088、Bug #28410275。
MySQL NDB ClusterJ:
ndb.clusterj
多次运行 NDB 8.0.13 测试失败 。这是针对 NDB 8.0.13 的一条新的、更严格的规则,该规则不允许将临时文件留在mysql-test-run (mtr)
. 通过此修复,在执行测试之前删除临时文件。(缺陷号 28279038)MySQL NDB ClusterJ: 当
NullPointerException
使用 ClusterJ 对包含 BLOB 或 TEXT 字段的表执行全表扫描时抛出 A。这是因为省略了适当的对象初始化,现在已通过此修复程序添加了它们。(缺陷 #28199372,缺陷 #91242)系统
version_comment
变量未在 mysqld二进制文件中正确配置,并返回了通用模式而不是正确的值。这影响了除.deb
包外的所有 NDB Cluster 二进制版本。(漏洞 #29054235)尝试使用 GCC 8 从源代码构建
-DWITH_NDBCLUSTER
并-Werror
失败。(缺陷 #28707282)将已删除的行从活动节点复制到刚开始的节点时,这些行中的一个或多个可能具有等于零的全局检查点索引。如果由于撤消日志变满而在启动完整本地检查点的同时发生这种情况,
LCP_SKIP
则会为 GCI = 0 的行设置该位,从而导致数据节点意外关闭。(缺陷号 28372628)由于日志线程关闭, ndbmtd在退出时有时会挂起。(漏洞 #28027150)
-
NDB
完全限定表名的上限为 128 个字符。由于 mysqldNDB
使用格式 命名表,其中始终是 ,因此 尽管表名和数据库名都没有超过 . 在这种情况下引发的错误具有误导性,已被替换。(漏洞#27769521)database_name
/catalog_name
/table_name
catalog_name
def
CREATE TABLE
NDB
参考资料:另请参阅:Bug #27769801。
-
当
SUMA
内核块接收到SUB_STOP_REQ
信号时,它会执行信号然后回复SUB_STOP_CONF
。(此响应被中继回 API 后,API 将打开以发送更多SUB_STOP_REQ
信号。)发送 后SUB_STOP_CONF
,如果没有订阅者,SUMA 将删除订阅,这涉及向 发送多DROP_TRIG_IMPL_REQ
条消息DBTUP
。LocalProxy 最多可以并行处理其中的 21 个请求;多于此的都在短时间队列中排队。当 a 的执行DROP_TRIG_IMPL_REQ
被延迟时,队列有可能变得过载,导致数据节点关闭并出现Error in short time queue。SUB_STOP_REQ
如果DBTUP
已经DROP_TRIG_IMPL_REQ
满负荷处理信号,而不是排队信号, 则通过延迟信号的执行来解决此问题DROP_TRIG_IMPL_REQ
。(漏洞 #26574003) 在索引重建失败的情况下, ndb_restore返回 -1 而不是预期的退出代码。(漏洞#25112726)
启动时,数据节点复制元数据,而本地检查点更新元数据。为避免任何冲突,在复制元数据时暂停任何正在进行的 LCP 活动。当本地检查点在给定节点上暂停时出现问题,并且另一个节点也在重新启动检查该节点上的完整 LCP;检查实际上导致 LCP 在元数据复制完成之前完成,因此过早地结束了暂停。现在在这种情况下,LCP 完成检查会等待完成暂停的 LCP,直到元数据复制完成并且暂停按预期结束,在它开始的 LCP 内。(漏洞 #24827685)
ndbout
在ndb_mgmd服务重启期间ndberr
,从 退出并在下一次调用导致分段错误之前重定向到它们后变得mgmd_run()
无效mgmd_run()
。此修复可 确保始终有效。(错误#17732772,错误#28536919)ndbout
ndberr
-
NdbScanFilter
并不总是NULL
根据 SQL 标准处理,这可能导致发送不合格的行以被 MySQL 服务器过滤(否则不需要)。(缺陷 #92407,缺陷 #28643463)参考资料:另请参阅:Bug #93977、Bug #29231709。
-
内部函数
ndb_my_error()
用于ndbcluster_get_tablespace_statistics()
和prepare_inplace_alter_table()
,当函数无法与 交互时报告错误NDB
。该函数预期将 NDB 错误作为警告推送到堆栈上,然后通过将 NDB 错误转换为 MySQL 错误来设置错误,最后调用my_error()
转换后的错误。调用时my_error()
,该函数会提取可能包含占位符的格式字符串,并在类似于 的函数中使用格式字符串sprintf()
,在这种情况下,由于my_error()
调用时没有任何参数,该函数可能会读取任意内存,从而导致分段错误。修复总是将 NDB 错误作为警告推送,然后使用提供的消息设置错误。添加了一个新的辅助函数来
Thd_ndb
代替ndb_my_error()
. (漏洞 #92244,漏洞 #28575934) -
使用错误 921 Out of transaction memory ... (increase SharedGlobalMemory)报告撤消日志缓冲区内存不足。
此问题已通过引入新的错误代码 923 Out of undo buffer memory (increase UNDO_BUFFER_SIZE) 得到修复。(缺陷 #92125,缺陷 #28537319)
将 an
OperationRec
从串行队列移动到并行队列时,Dbacc::startNext()
无法更新 反映并行队列中所有先前操作Operationrec::OP_ACC_LOCK_MODE
的累积所需的标志 。OP_LOCK_MODE
ACC 锁队列中的这种不一致导致扫描锁接管机制失败,因为它错误地断定没有持有要接管的锁。在中止作为此类不一致并行锁队列成员的操作时,同样的故障导致断言。(缺陷 #92100,缺陷 #28530928)ndb_restore没有释放被调用以恢复已存在的表后使用的所有内存。(缺陷 #92085,缺陷 #28525898)
SCAN_FRAGREQ
由于恢复阶段信号 到达,数据节点在启动期间失败 。该信号源自在节点先前发生故障之前开始的扫描,并且由于故障节点的参与而应该中止。(缺陷 #92059,缺陷 #28518448)-
DBTUP
当读取操作试图读取同一事务中插入的元组的值时,发送了检测到的错误元组损坏。(缺陷 #92009,缺陷 #28500861)参考资料:另请参阅:Bug #28893633。
-
对自引用外键执行更新时,可能会发生错误约束违规错误。(漏洞 #91965,漏洞 #28486390)
参考资料:另请参阅:Bug #90644、Bug #27930382。
通过尝试
NDB
查找已释放的触发器的定义,可以删除内部触发器定义,同时触发器的挂起实例仍未执行。这导致了不可预测的不安全行为,可能导致数据节点故障。问题的根本原因在于代码中与确定给定触发器是否已被释放相关的无效假设;NDB
当触发器定义被确定为已发布时,通过确保 的行为 是一致的并且符合预期来解决此问题。(缺陷 #91894,缺陷 #28451957)在某些情况下,包含大量并发插入的工作负载会在使用调试构建时导致数据节点故障。(错误#91764、错误#28387450、错误#29055038)
在存在并
TwoPassInitialNodeRestartCopy
启用磁盘数据表的初始节点重启期间,DBTUP
按磁盘顺序使用不安全扫描。在这种情况下不再使用此类扫描。(缺陷 #91724,缺陷 #28378227)检查旧的 LCP 文件测试了表版本,但这并不总是可靠的。现在,检查不再依赖于表版本,而是将任何
maxGCI
小于其createGci
. (缺陷 #91637,缺陷 #28346565)在某些情况下,级联更新触发器在同一记录上重复触发,最终消耗所有可用的并发操作,导致事务协调器中的错误 233 Out of operation records(增加 MaxNoOfConcurrentOperations)。如果
MaxNoOfConcurrentOperations
将值设置得足够高以避免这种情况,则问题表现为数据节点消耗大量 CPU,很可能最终导致超时。(缺陷 #91472,缺陷 #28262259)