MySQL NDB集群8.0.16是NDB 8.0的新开发版本,基于MySQL Server 8.0,包含了MySQL Server 8.0的一些特性NDB
存储引擎,以及修复最近在以前的NDB集群版本中发现的错误。
获取NDB Cluster 8.0。NDB集群8.0的源代码和二进制文件可以从10bet博彩公司 .
有关NDB Cluster 8.0更改的概述,请参见新开发银行集群有什么新动向.
此版本还包含了以前NDB集群版本中所有的错误修复和更改,以及从MySQL 8.0到MySQL 8.0.16主线中添加的所有错误修复和功能更改(参见MySQL 8.0.16的变化(2019-04-25,一般可用性)).
不兼容的更改:连接到NDB集群的MySQL服务器之间的特权分配,就像在NDB 7.6及更早版本中实现的那样,在NDB 8.0中无法实现,并且大多数支持这些功能的代码现在已经被删除了。当一个mysqld中检测这样的表
NDB
方法创建本地的影子表InnoDB
存储引擎;这些影子表是在连接到NDB集群的每个MySQL服务器上创建的。特权表使用NDB
不使用存储引擎进行访问控制;一旦所有连接的MySQL服务器升级,特权表NDB
可以安全地取出使用吗ndb_drop_table.出于兼容性考虑,ndb_restore
——restore-privilege-tables
仍然可以用于将以前版本的NDB集群备份中的分布式特权表恢复到运行NDB 8.0的集群。这些表的处理方法如前一段所述。有关从以前的NDB集群版本系列升级到NDB 8.0的更多信息,请参见升级降级NDB集群.
不兼容的更改:为了保持一致性
InnoDB
,NDB
存储引擎现在使用生成的约束名称约束
子句未指定,或者象征
约束
关键字指定时不带象征
.在以前的NDB
版本中,NDB
使用了外键
价值。index_name
上述更改可能会为依赖于前面外键约束命名行为的应用程序引入不兼容性。(错误# 29173134)
包装:此版本的Docker映像可以从https://hub.docker.com/r/mysql/mysql-cluster/.(Bug #96084, Bug #30010921)
事务协调器中的资源分配(参见DBTC块)现在使用动态内存池执行。这意味着资源分配由数据节点配置参数决定,如在交易参数而且事务临时存储现在限制为不超过事务协调器可用的总资源。
作为这项工作的一部分,控制事务资源的几个新的数据节点参数
DBTC
,这里列出的,也已添加。有关这些新参数的详细信息,请参见事务资源分配参数.(Bug #29164271, Bug #29194843)参考资料:参见Bug #29131828。
NDB
现在可以使用多个本地数据管理器(ldm)在各个数据节点上以并行方式执行备份。(以前,备份是跨数据节点并行完成的,但在数据节点进程中始终是串行的。)类不需要特殊的语法开始备份
命令ndb_mgm客户端来启用此特性,但所有数据节点必须使用多个ldm。这意味着数据节点必须正在运行ndbmtd并且必须将它们配置为在进行备份之前使用多个ldm(请参阅多线程配置参数(ndbmtd)).ndb_restoreAlso现在检测这样的备份并自动尝试并行恢复它。通过稍微修改通常的恢复过程,也可以将备份并行地恢复到以前版本的NDB集群。
有关获取和恢复在数据节点上使用并行创建的NDB集群备份的详细信息,请参见采用并行数据节点备份NDB,从并行备份中恢复.(Bug #28563639, Bug #28993400)
的compile-cluster脚本包含在
NDB
源代码分发不再支持源代码内构建。建筑与CMake3现在由compile-cluster脚本包含在
NDB
源分布。作为自动同步机制的一部分,
NDB
现在实现了一个元数据更改监视线程,用于检测对数据对象(如表、表空间和使用MySQL数据字典的日志文件组)的元数据的更改。此线程在后台运行,每60秒检查一次NDB
字典和MySQL数据字典。的值可以调整监视器轮询间隔
ndb_metadata_check_interval
系统变量,可以通过设置完全禁用ndb_metadata_check
来了。此后检测到不一致的次数mysqld上次启动显示为状态变量,Ndb_metadata_detected_count
.条件下推不再局限于引用同一表中的列值的谓词项;现在还可以从压入条件引用查询计划中前面表中的列值。这使得数据节点可以过滤出更多的行(并行),从而减少单个节点需要执行的工作mysqld过程,预计将显著提高查询性能。
有关更多信息,请参见发动机状态下压优化.
重要的变化;NDB磁盘数据:, mysqldump尝试转储时意外终止
NDB
磁盘数据表。这背后的原因是, mysqldump中与撤消日志缓冲区相关的信息额外的
的列INFORMATION_SCHEMA。文件
但是在NDB 8.0.13中,这个信息已经被删除了。该信息现在已恢复到额外的
列。(错误# 28800252)重要的变化:当使用不同于原集群的数据节点id恢复到集群时,ndb_restore尝试打开节点ID为0的文件。为了防止这种情况发生
——nodeid
而且——backupid
选项(两者都没有默认值)现在都是调用时显式需要的ndb_restore.(错误# 28813708)重要的变化:的默认值
ndb_log_bin
现在系统变量是假
.(错误# 27135706)包装;MySQL NDB ClusterJ:
libndbclient
在一些平台的构建中缺失。(错误# 28997603)NDB磁盘数据:当日志文件组有超过18个撤销日志时,无法重新启动集群。(错误# 251155785)
参考:参见Bug #28922609。
NDB磁盘数据:并发
创建表
使用表空间的语句会导致元数据锁之间的死锁。这种情况发生在Ndb_metadata_change_monitor
在检测到元数据变化后,在表空间和日志文件组上获得了排他性元数据锁,因为每个排他性元数据锁依次获得了一个全局模式锁。此修复程序试图通过降级所取的锁来解决该问题Ndb_metadata_change_monitor
来MDL_SHARED_READ
.(错误# 29175268)参考:参见Bug #29394407。
NDB磁盘数据:的验证时返回的错误消息
MaxNoOfOpenFiles
关于InitialNoOfOpenFiles
Failed已得到改进,使用户更清楚地了解问题的性质。(错误# 28943749)NDB磁盘数据:模式分布
修改表空间
而且修改日志文件组
如果所引用的表空间或日志文件组在其数据字典中不存在,则在参与者MySQL服务器上执行语句失败。在这种情况下,不管MySQL服务器之间是否存在初始不匹配,语句的效果都会被成功分发。(错误# 28866336)NDB磁盘数据:重复执行
Alter tablespace…添加数据文件
使用相同的表空间会导致数据节点挂起,并在手动杀死它们后无法重新启动。(错误# 22605467)NDB复制:一个
删除数据库
涉及某些非常大的表的操作可能导致集群意外关闭。(错误# 28855062)NDB复制:当写在主版上时,以这样一种方式使多次改动受到影响
团
列值属于相同的主键是相同epoch的一部分,被复制到从服务器,错误1022是由于约束违反NDB BLOB_美元
表格(错误# 28746560)id
_部分
NDB集群api:
NDB
标识不需要减少锁争用的短时间事务NdbBlob: close ()
并且不再在解锁仅仅导致在提交或中止事务之前执行额外工作和往返的情况下(例如启用自动提交时)调用此方法。(错误# 29305592)参考:参见Bug #49190, Bug #11757181。
NDB集群api:当最近一次失败的操作被释放时,指向该操作的指针被保留
NdbTransaction
无效,访问时导致NDB API应用程序失败。(错误# 29275244)NDB集群api:当
NDB
内核的SUMA
Block发送一个TE_ALTER
事件时,它不跟踪事件的所有片段何时发送。当NDB
接收事件,缓冲片段,并在所有片段到达时处理事件。当传输和接收之间的时间可能跨越多个时代时,对于非常大的表定义可能会出现一个问题;在此期间,SUMA
可以发送一个SUB_GCP_COMPLETE_REP
信号,以表明它已经发送了一个纪元的所有数据,即使在这种情况下,这并不完全正确,因为可能有片段的TE_ALTER
事件仍在等待数据节点发送。接收SUB_GCP_COMPLETE_REP
导致关闭该纪元的缓冲区。因此,当TE_ALTER
最终到达时,NDB假定它是来自较早纪元的副本,并无声地丢弃它。我们解决这个问题的方法是确保
SUMA
内核块从不发送SUB_GCP_COMPLETE_REP
对于a中有未发送片段的任何纪元SUB_TABLE_DATA
信号。此问题可能会对使用NDB API的应用程序产生影响
TE_ALTER
事件。(SQL节点不使用任何TE_ALTER
事件,因此它们和使用它们的应用程序不会受到影响。)(Bug #28836474)中执行推入连接时
DBSPJ
block必须在查询执行期间存储相关id,这些相关id的内存被分配到整个查询执行的生命周期中,即使这些特定的相关id只在结果集中产生最近的批处理时才需要。后续批次需要存储和分配额外的相关id;因此,如果查询需要足够长的时间才能完成,就会导致查询内存耗尽(错误20008)。现在,在这种情况下,内存仅在当前结果批处理的生命周期内分配,并且在批处理完成后被释放并可用于重用。(错误# 29336777)参考:参见Bug #26995027。
的固定长度字符串进行比较或散列时
NO_PAD
在Collation中,任何尾随的填充字符(通常是空格)都被发送到散列和比较函数中,这样它们就变得有意义了,即使它们本不应该有意义。现在,任何这样的尾随空格都是从固定长度的字符串中修剪出来的NO_PAD
指定排序规则。请注意自
NO_PAD
整理是作为MySQL 8.0中UCA-9.0整理的一部分引入的,这个修复对从以前的NDB集群GA版本升级到NDB 8.0没有影响。(错误# 29322313)
当一个
不是在
或之间的不
Predicate被计算为一个推送条件,零
值不会被SQL标准中指定的条件消除。(错误# 29232744)参考:参见Bug #28672214。
在内部,
NDB
对待零
小于任何其他值,以及窗体的谓词
或列
<价值
检查可能的空值。表单的谓词列
< =价值
或价值
>列
没有进行检查,这可能会导致错误。现在,在这种情况下,这些谓词将被重写,以便列出现在前面,这样它们也将检查是否存在价值
> =列
零
.(错误# 29231709)参考:参见Bug #92407, Bug #28643463。
在MySQL优化器中实现了对常量的折叠之后,一个包含
日期
或DATETIME
字面的不能再被压下去了NDB
.(错误# 29161281)当连接条件在时态数据类型的列之间进行比较时,例如
日期
或DATETIME
和相同类型的常量,如果条件以该形式表示,则将谓词推入
,但当顺序颠倒时(如列
操作符
常数
).(错误# 29058732)常数
inverse_operator
列
当处理一个推送条件时,
NDB
当正在比较的文字值超出正在比较的数据类型范围时,未检测到抛出的错误或警告,因此被截断。这可能导致结果中出现过多或缺失行。(错误# 29054626)如果一个
EQ_REF
或裁判
键在推入连接的子节点中引用表的任何列而不是推入连接的成员,此表不是NDB
表(因为它的格式是非本机字节序),并且正在连接的列的数据类型以字节序敏感的格式存储,那么生成的键将被生成,很可能导致返回一个(无效的)空连接结果。因为只有大端典平台可以以非原生(小端典)格式存储表,所以这个问题只会出现在这样的平台上,尤其是SPARC,而不是x86平台上。(错误# 29010641)
运行NDB 7.6及以上版本的API和数据节点不能使用早期版本系列中已有的已解析配置,因为对于新版本的配置参数的定义值过于严格,这限制了可能的升级路径。现在NDB 7.6及以后的版本对所有的新参数在配置中显式指定的要求不那么严格了,在这种情况下使用硬编码的默认值。(错误# 28993400)
连接到NDB 8.0集群时,NDB 7.6 SQL节点挂起。(错误# 28985685)
中维护的模式分布数据
NDB
的二进制日志线程跟踪订阅用户的数量NDB
Schema表总是为256个数据节点分配一些内存结构,而不管实际节点的数量。现在NDB
只分配实际需要的这些结构。(错误# 28949523)添加
转储406
(NdbfsDumpRequests
)提供NDB
文件系统信息到节点日志中的全局检查点和本地检查点暂停报告。(错误# 28922609)当一个连接表因为不可推而被提前删除时,如果不考虑消除这些条件,即使这些条件是可推的,它也不能在任何后续的连接条件中从其他表中引用。(错误# 28898811)
启动或重新启动SQL节点并连接到集群时
NDB
已经开始了,NDB
报告错误4009集群故障因为它无法获得全局模式锁。这是因为MySQL服务器作为初始化的一部分,为了修改内部数据结构而需要独占元数据锁ndbcluster
插件获取全局模式锁。如果连接到NDB
期间还没有正确设置mysqld初始化,mysqld收到来自ndbcluster
当后者无法获取全局模式锁,并将其打印到日志文件中,导致日志中出现意外错误。这个问题可以通过在无法获取全局模式锁时不向后台线程推送任何警告来解决NDB
错误作为警告。(错误# 28898544)之间的竞争条件
DBACC
而且DBLQH
当事务中同一行上的不同操作同时被准备和中止时,就会发生内核块。这可能会导致DBTUP
尝试在前一个操作中止时准备一个操作,这是意外的,因此可能导致未定义的行为,包括潜在的数据节点故障。为了解决这个问题,DBACC
而且DBLQH
现在,在尝试准备操作之前检查所有依赖项是否仍然有效。请注意此修复还取代了之前针对一个相关问题所做的修复,该问题最初报告为Bug #28500861。
(错误# 28893633)
其中数据节点在配置更改后重新启动,其结果是
MaxNoOfTables
,MaxNoOfOrderedIndexes
,MaxNoOfUniqueHashIndexes
在美国,它有时会以误导性的错误消息失败,提示这是一个临时错误和一个bug,但这两种情况都不是。失败本身是意料之中的,因为至少有一个表对象的ID大于刚刚提到的参数的(新)和,并且这个表不能恢复,因为允许的ID的最大值受到这个和的限制。错误消息已更改以反映这一点,现在指示这是由于问题配置造成的永久错误。(错误# 28884880)
的
ndbinfo.cpustat
表报告了关于发送线程的不准确信息。(错误# 28884157)当LCP状态为IDLE时,从主机执行LCP_COMPLETE_REP信号会导致断言。(错误# 28871889)
NDB
现在提供即时服务.frm
在发现在不支持MySQL数据字典的软件版本中创建的表时进行文件翻译。在此之前,只有在MySQL服务器启动时的模式同步期间支持这种旧式元数据表的转换,但随后就不支持了,这导致在启动时出现错误NDB
具有旧式元数据的表,由ndb_restore以及其他类似的工具mysqld已经启动,被访问使用显示创建表
或选择
;这些表只有在重新启动后才可用mysqld.有了这个修复,不再需要重新启动。(错误# 28841009)从早期版本到NDB 8.0版本的原地升级没有删除
.ndb
虽然在NDB 8.0中不再使用这些文件。(错误# 28832816)删除
存储/ ndb /演示
以及它从源树中包含的演示脚本和支持文件。这些都是过时的,没有维护的,不能与任何当前版本的NDB集群一起运行。也删除
存储/ ndb / include / newtonapi
,其中包括与NDB集群中任何版本都不支持的过时且未维护的API相关的文件,以及在其他地方引用这些文件的文件。(错误# 28808766)NDB 8.x没有版本兼容性表;这意味着运行NDB 8.0.13或7.6的API节点。x无法连接运行NDB 8.0.14的数据节点。对于NDB API用户来说,这个问题是失败的
wait_until_ready ()
.(错误# 28776365)参考:参见Bug #18886034, Bug #18874849。
发出一个
停止
命令ndb_mgm客户造成的ndbmtd最近添加到集群的进程在关闭期间挂在阶段4中。(错误# 28772867)修复了前一个问题,禁用了查找类型(
eq_ref
)推入连接中的操作。当时,人们认为不推查找条件不会对性能产生任何可衡量的影响,因为如果条件失败,只能删除一行。当时实现的解决方案没有考虑到这样一种可能性:在推送连接中,查找操作可能是其他查找甚至扫描操作的父操作,这意味着删除一行实际上可能导致错误地删除整个分支。(错误# 28728603)参考:这个问题是Bug #27397802的回归。
当本地检查点(LCP)在所有数据节点上完成,但该节点失败时,
NDB
没有继续完成LCP所需的步骤。这导致了以下问题:不能启动新的lcp。
Redo和Undo日志没有被修剪,因此变得非常大,导致从磁盘恢复的时间增加。这将导致写服务失败,当重做日志的头部与尾部相遇时,最终导致集群关闭。这限制了集群正常运行时间。
节点重新启动不再可能,因为数据节点重新启动需要节点的状态在磁盘上保持持久,然后才能在加入集群时提供冗余。对于具有两个数据节点和两个片段副本的集群,这意味着需要重新启动整个集群(系统重新启动)来修复问题(对于具有两个片段副本和四个或更多数据节点的集群,这是不必要的)。(Bug #28728485, Bug #28698831)
参考:参见Bug #11757421。
一个条件的可推性
NDB
所有谓词都由一个逻辑连接是有限的吗和
在一个特定的条件下NDB
为了使整个条件被推动。在某些情况下,这严重限制了条件的可推性。此修正将条件分解为其组件,并计算每个谓词的可推性;如果某些谓词不能被推送,它们将作为剩余条件返回,MySQL服务器可以对其进行计算。(错误# 28728007)运行
分析表
在一个NDB
表的索引长度超过支持的最大长度,将导致数据节点失败。(错误# 28714864)在某些情况下,节点可能在初始重启期间挂起。(错误# 28698831)
参考:参见Bug #27622643。
当一个条件被推入存储引擎时,服务器会重新计算它,尽管在这种情况下,只有匹配推入条件的行才应该返回给服务器。(错误# 28672214)
在某些情况下,一个(有时是多个)数据节点在运行时发生意外关闭ndb_restore.当恢复到数据节点数量与原始备份所在集群不同的集群时,这种情况最常发生,但并不总是限于此情况。
这个问题的根本原因是池的耗尽
SafeCounter
对象使用的DBDICT
内核块作为执行模式事务的一部分,并且取自与协议共享的每个块实例池NDB
事件设置和订阅处理。事件设置和订阅处理的并发性使得SafeCounter
池可竭;事件和订阅处理可以处理池耗尽,但模式事务处理不能,这可能导致恢复期间出现节点关闭。这个问题可以通过给予来解决
DBDICT
模式事务是一个隔离的预留池SafeCounters
哪个不能被并发耗尽NDB
活动活动。(错误# 28595915)当备份由于缓冲区耗尽而中止时,在插入、更新和删除操作的触发器预期下降之前同步信号队列,将导致中止信号在
STOP_BACKUP
阶段可以继续。日志含义中止将备份状态更改为ABORT_BACKUP_ORD
,这导致数据节点在恢复后意外关闭STOP_BACKUP
要求状态为STOP_BACKUP_REQ
.此时备份状态未设置为STOP_BACKUP_REQ
(请求继续备份)直到信号队列同步完成。(错误# 28563639)的输出ndb_config
——configinfo
——xml
——查询所有
的配置更改ThreadConfig
而且MaxNoOfExecutionThreads
数据节点参数需要重启系统(最初重启= "系统" = " true "
).(错误# 28494286)由于错误导致提交失败后,mysqld在试图获取涉及到的表的名称时意外关闭。这是由于内部功能的问题
ndbcluster_print_error ()
.(错误# 28435082)API节点应该观察到某个节点正在移动
SL_STOPPING
阶段(优雅停止)并停止将节点用于新事务,这将最大限度地减少节点关闭过程后期阶段的潜在中断。API节点只能通过周期性的心跳信号得知节点状态的变化,因此可能无法避免与节点关闭发生交互。当心跳间隔过长时,会产生不必要的故障。现在,当一个数据节点被优雅地停止时,所有API节点都会被直接通知,从而使它们遭受的中断最小化。(错误# 28380808)ndb_config
——diff-default
试图读取默认值为空字符串(""
).(错误# 27972537)ndb_restore在使用一个或多个staging表时,未能正确地恢复自动递增值。作为此修复的一部分,我们还在这种情况下阻止应用
SYSTAB_0
备份日志,其内容继续直接基于表ID应用,这可能会覆盖存储在SYSTAB_0
对于不相关的表。(Bug #27917769, Bug #27831990)参考:参见Bug #27832033。
ndb_restore的多个实例时,使用一种非原子的机制来恢复自增量值,因此可能会产生不正确的自增量值ndb_restore是并行使用的。(错误# 27832033)
参考:参见Bug #27917769, Bug #27831990。
执行
选择
*从
INFORMATION_SCHEMA。表
导致SQL节点在某些情况下重新启动。(错误# 27613173)当餐桌上有
团
列被删除,然后用不同数量的团
列,在涉及通信错误的某些错误情况下,当没有执行相应事件的预期清除时,用于监视表更改的事件定义可能不一致。特别是,当新版本的表有更多团
列比原来的表多,一些事件可能会丢失。(错误# 27072756)中查询内存耗尽时
DBSPJ
当为延迟操作存储相关id时,查询被终止,错误状态为20000由于查询内存不足,查询中止.(错误# 26995027)参考:参见Bug #86537。
当在非常高的负载下运行包含4个或更多数据节点的集群时,数据节点有时会出现错误899Rowid已经分配了.(错误# 25960230)
mysqld在服务器完全启动之前请求清除二进制日志时意外关闭,因此它还没有准备好从
ndb_binlog_index
表格现在,当这种情况发生时,请求任何所需的清洗ndb_binlog_index
表保存在队列中,等待服务器完全启动时执行。(错误# 25817834)MaxBufferedEpochs
在数据节点上使用,以避免由于滞后而导致的行更改的过度缓冲NDB
事件API订户;当来自一个或多个订阅者的epoch确认延迟了这个epoch数时,将触发异步断开连接,允许数据节点释放用于订阅的缓冲空间。由于这种断开是异步的,在数据节点上的其他新epoch完成之前,它可能还没有完成,导致新epoch无法获取GCP完成记录,产生如下所示的警告:[ndbd] ERROR——c_gcp_list.seize() failed... ... .日志含义[ndbd] WARNING—ACK wo/ gcp record…
并导致以下警告:
断开节点%u,因为它已经超过MaxBufferedEpochs (100 > 100), epoch ....
此修复执行以下修改:
修改GCP完成记录池的大小,以确保始终有一些额外的空间来考虑前面描述的断开连接处理的异步性质,从而避免
c_gcp_list
抓住失败。属性的措辞
MaxBufferedEpochs
警告避免使用矛盾的短语”100 > 100”.
(错误# 20344149)
异步断开mysqld导致任何后续尝试启动NDB API事务失败。如果这发生在批量删除操作期间,则SQL层调用
哈哈::end_bulk_delete ()
,其由ha_ndbcluster
假设已经启动了一个事务,如果不是这样,事务可能会失败。通过在引用此方法使用的事务指针之前检查该事务指针是否已设置,可以解决此问题。(错误# 20116393)删除了编译时引发的警告
NDB
铿锵6。(Bug #93634, Bug #29112560)当在调试模式下执行重做日志时,数据节点在释放一行时可能会失败。(Bug #93273, Bug #28955797)
一个
NDB
在另一个表上同时有一个外键NDB
表的使用删除级联
一个或多个文本
或团
列泄漏内存。作为修复的一部分,
删除级联
是否不再支持打开外键NDB
类的任何列时,子表中的团
或文本
类型。(Bug #89511, Bug #27484882)