MySQL NDB Cluster 8.0.28 是 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.28 在主线 MySQL 8.0 中添加的所有错误修复和功能更改(请参阅MySQL 8.0.28 中的更改(2022-01- 18, 一般可用性) )。
添加了
ndbinfo
index_stats
表格,它提供了有关NDB
索引统计信息的非常基本的信息。它主要用于我们的内部测试,但与 ndb_index_stat和其他工具结合使用可能会有所帮助。(缺陷号 32906654)以前,ndb_import总是尝试将数据导入到一个表中,该表的名称来源于正在读取的 CSV 文件的名称。此版本 为此程序添加了一个
--table
选项(简称:) ,它会覆盖此行为并直接指定目标表的名称。-t
(缺陷号 30832382)
-
重要更改: 已弃用的数据节点选项
--connect-delay
已被删除。此选项是 的同义词--connect-retry-delay
,并非在所有情况下都适用;此问题已得到修复,该选项现在可以正常工作。此外,-r
此选项的缩写形式已被弃用,您应该期望在未来的版本中将其删除。(错误号 31565810)参考资料:另请参阅:Bug #33362935。
Microsoft Windows: 在 Windows 上,为 MySQL Server(商业)和 MySQL NDB Cluster(商业和社区)添加了缺少的调试和测试套件二进制文件。(缺陷号 32713189)
-
NDB 复制: mysqld选项可
--slave-skip-errors
用于允许复制应用程序 SQL 线程自动跳过某些编号的错误。在生产中不推荐这样做,因为它允许副本发散,因为二进制日志中的整个事务都没有应用;对于NDBCLUSTER
它的时代交易,这会导致整个时代的变化都没有被应用,可能导致数据不一致。Ndb 还检查应用的纪元序列,如果存在序列问题,则停止副本应用程序并报错。where
--slave-skip-errors
is in use, and an error is skipped, 这导致整个epoch事务被跳过;这会在任何后续尝试应用纪元事务时检测到,这会导致副本应用程序 SQL 线程停止。此版本中添加了一个新选项
--ndb-applier-allow-skip-epoch
,允许用户忽略完全跳过的纪元事务,以便他们可以--slave-skip-errors
像其他 MySQL 存储引擎一样使用该选项。这旨在用于测试,而不是用于生产环境。使用这些选项的风险完全由您自己承担。当mysqld使用新选项(连同
--slave-skip-errors
)启动时,检测到丢失的纪元会生成警告,但副本应用程序 SQL 线程会继续应用。(缺陷号 33398973) -
NDB 复制:表 的
log_name
列ndb_apply_status
创建为VARBINARY
,尽管被定义为VARCHAR
,使用latin1
字符集,在使用某些工具查询表时导致十六进制解码输出。当mysqld检查此表的布局时, 我们通过检测中的错误列类型
ndb_apply_status
并在连接到时将表定义重新安装到数据字典中来 解决此问题。(缺陷号 33380726)NDB
NDB Cluster APIs: 几个新的基本示例 C++ NDB API 程序已添加到分发中,
storage/ndb/ndbapi-examples/ndbapi_basic/
在源代码树下。这些比现有的 API 示例更短,对于 NDB API 的新手来说应该更容易理解。它们还遵循最近的 C++ 标准和实践。这些示例也已添加到 NDB API 文档中;有关详细信息,请参阅基本 NDB API 示例。(错误#33378579,错误#33517296)NDB Cluster API: 不再可能
DIVERIFYREQ
异步使用信号。(缺陷号 33161562)wait for scans
联机重组期间日志输出 的时间安排不正确。作为此修复的一部分,我们将时间更改为每 10 秒生成一条消息,而不是无限扩展,以便提供定期更新。(缺陷号 35523977)-
联机表重组增加了表的碎片数,并在它们之间移动行。这是通过以下步骤完成的:
将行复制到新片段
更新分布信息(hashmap 计数和总碎片)
等待使用旧分发的扫描活动停止
删除已移出现有分区的行
删除对旧哈希图的引用
等待从第 2 步开始的扫描活动停止
由于计数错误,重组有可能在第 6 步挂起;扫描引用计数没有减少,因此从未像预期的那样达到零。(缺陷号 33523991)
使用创建的
UNIQUE
索引USING HASH
不支持有序或范围访问操作,而是仅支持指定完整键的那些操作,最多返回一行。即便如此,对于 NDB 表上的此类索引,仍对索引使用范围访问。(错误#33466554,错误#33474345)-
当启用优化器开关 时,表 上的相同推送连接
NDB
返回不正确的结果 。batched_key_access
这个问题产生如下:当使用批量密钥访问(BKA)算法连接两个表时,首先从其中一个表中收集一组批量密钥;多范围读取 (MRR) 操作是针对另一个构建的。在 MRR 上指定了一组边界(范围),使用批处理的键来构造每个边界。
当返回结果行时,有必要确定每个返回行来自哪个范围。这用于标识执行 BKA 连接的外表行。当有问题的 MRR 操作是推送连接操作的根时,
SPJ
无法检索此标识符 (RANGE_NO
)。我们通过实现缺少的SPJ
API 功能来解决此问题,以便RANGE_NO
从推送的连接查询中返回此类。(缺陷号 33416308) 针对该表的每个查询都
ndinfo.index_stats
泄露了一个NdbRecord
. 我们通过更改上下文来解决此问题,以便它拥有NdbRecord
它创建的对象,然后NdbRecord
在超出范围时释放对象,并支持为每个上下文创建一个且仅一个记录。(缺陷号 33408123)-
使用更改的行更新缓存的表统计信息时会出现并发问题,当多个线程更新同一个表时,线程会竞争
NDB_SHARE
互斥锁以更新缓存的行计数。我们通过使用原子计数器重新实现已更改行的存储来解决此问题,而不是尝试获取互斥锁并更新实际共享值,这减少了序列化线程的需要。此外,我们现在仅在从缓存中删除统计信息时才将更改的行数附加到行计数中,并提供一个单独的互斥锁,仅保护缓存的统计信息。(缺陷号 33384978)
参考资料:另请参阅:Bug #32169848。
-
如果模式分发客户端在协调器收到模式事件时在释放模式对象之前检测到超时,则协调器会处理陈旧的模式事件而不是返回。
协调器不知道客户端是否检测到架构分发超时,并在架构对象有效后立即开始处理架构事件。为了解决这个问题,我们指示模式对象的状态,并在客户端检测到模式分发超时以及协调器接收到模式事件时更改其状态,以便协调器和客户端都知道这一点,并保持同步。(缺陷号 33318201)
MySQL 优化器使用两种不同的方法,
handler::read_cost()
和Cost_model::page_read_cost()
,来估计不同访问方法的成本,但这些方法返回的成本值并不总是可比较的;在某些情况下,这会导致选择了错误的索引,并导致受影响查询的执行时间更长。为了解决这个问题,我们用一个特定于 的方法NDB
覆盖了优化器的 方法。在处理此问题时还发现处理程序未实现该方法,由 ; 此方法现在由 实施,因此优化器现在可以正确地考虑成本差异page_read_cost()
NDBCLUSTER
NDB
read_time()
read_cost()
ha_ndbcluster
NDB
当使用唯一键而不是有序索引(范围扫描)时。(缺陷号 33317872)-
打开
NDB
表进行查询时,检索索引统计信息以帮助优化器选择最佳查询计划。每个访问统计信息的客户端在访问统计信息之前和之后都会获取全局索引统计信息互斥体。这会导致影响查询性能的互斥争用,无论是否有查询对相同的表或不同的表进行操作。我们通过使用原子计数器保护索引统计引用的计数来解决此问题。当对超过 32 个客户端进行基准测试时,当吞吐量没有随着客户端的增加而增加时,这个问题就很明显了。通过此修复,吞吐量继续扩展至最多 64 个客户端。(缺陷号 33317320)
在某些情况下,未正确检测到事件的类别。(缺陷号 33304814)
对于授予
NDB_STORED_USER
权限 的用户,每次重新启动 SQL 节点时都会更新表中的password_last_changed
列 。mysql.user
(缺陷号 33172887)DBDICT
并不总是正确地执行表名检查。(缺陷号 33161548)SET_LOGLEVELORD
信号并不总是被正确处理。(缺陷号 33161246)DUMP 11001
并不总是正确处理它的所有参数。(缺陷号 33157513)文件名并不总是被正确验证。(缺陷号 33157475)
在数据节点中添加了一些缺失的检查。(错误#32983723、错误#33157488、错误#33161451、错误#33161477、错误#33162082)
在ndbd和ndbmtd 中添加了一些缺失的 ID 和其他值检查 。(错误#32983700,错误#32893708,错误#32957478,错误#32983256,错误#32983339,错误#32983489,错误#32983517,错误#33157527,错误#33157531,错误#33161271,错误16Bug1394,Bug16Bug1393, #33161331, Bug #33161372, Bug #33161462, Bug #33161511, Bug #33161519, Bug #33161537, Bug #33161570, Bug #33162059, Bug #33162065, Bug #33162074, Bug #33162082, Bug #33162092, Bug #33162098 ,漏洞#33304819)
管理服务器并不总是正确处理错误大小的事件。(缺陷号 32957547)
-
当ndb_mgmd在没有
--config-file
选项的情况下启动时,用户需要为同一集群中的另一个管理服务器提供连接字符串,以便正在启动的管理服务器可以从另一个获取配置信息。如果无法解析连接字符串中的主机地址,则正在启动的ndb_mgmd在尝试建立连接时会无限期挂起。发生此问题是因为连接失败被视为临时错误,这导致ndb_mgmd 重试连接,随后失败,依此类推。我们通过将ndb_mgmd的主机名解析失败视为永久错误并立即退出来解决此问题。(缺陷号 32901321)
ndb_import 的参数中使用的参数 顺序
--csvopt
现在得到一致处理,最右边的参数始终优先。这也适用于参数的重复实例。(缺陷号 32822757)-
在某些情况下,恢复备份时重做日志的问题会导致数据节点意外关闭。为了解决这个问题,当重做日志文件不可用于写入时,我们现在
CONTINUEB
在发送之前在信号中包含正确的等待代码和等待日志部分。(缺陷号 32733659)参考资料:另请参阅:Bug #31585833。
二进制日志记录线程有时会在所有数据节点准备就绪之前尝试启动,这会导致过多记录不必要的警告和错误。(缺陷号 32019919)
在内部
Ndb_table_guard::getTable()
方法中设置了一些值检查。这修复了一个已知问题,即 SQL 节点在ALTER TABLE
表上执行时经历了计划外关闭NDB
,以及潜在的其他问题。(缺陷号 30232826)替换了误导性错误消息,并在无法解决时 改进了ndb_mgmd的行为。
HostName
(漏洞 #28960182)-
随着表数量的增加,MySQL Enterprise Monitor 用于监视 NDB Cluster 中内存使用情况的查询的性能明显下降
NDB
。我们解决这个问题如下:ndbinfo
MySQL 优化器可以使用 虚拟表的行数现在为所有
ndbinfo
表格 提供大小估计主键已添加到大多数内部
ndbinfo
表
在这些改进之后,针对
ndbinfo
表的查询性能应该与针对等效MyISAM
表的查询相当。(漏洞#28658625) -
在 NDB 8.0.23 中对 LDM 性能进行改进之后,
UPDATE_FRAG_DIST_KEY_ORD
在需要时从未使用节点 ID 向数据节点发送信号1
。当运行具有 3 或 4 个副本的集群并且重启同一节点组中的另一个节点时,这可能会导致 SQL 语句被拒绝并出现错误 MySQL 1297ER_GET_TEMPORARY_ERRMSG
并随后SHOW WARNINGS
报告错误 NDB error1204
。笔记在升级到此版本之前,您可以通过在同一节点组中的任何其他节点重新启动时重新启动数据节点 1 来解决此问题。
(错误#105098,错误#33460188)
在作为从 NDB 7.6 升级到 NDB 8.0 的一部分执行的数据节点滚动重启之后,数据节点经历了强制关闭。我们通过允许 向内核块和 内核块
LQHKEYREQ
发送信号来 解决这个问题。(错误#105010,错误#33387443)DBLQH
DBSPJ
AutomaticThreadConfig
启用 该 参数后,NumCPUs
始终显示0
在数据节点日志中。此外,当使用此参数时,现在可以正确进行线程 CPU 绑定,并且数据节点日志显示每个线程的实际 CPU 绑定。(错误#102503,错误#32474961)ndb_blob_tool
--help
没有返回预期的输出。(缺陷 #98158,缺陷 #30733508)NDB
当从内部系统表创建和删除函数返回错误时,没有关闭任何挂起的模式事务。