MySQL集群NDB 8.0发行说明/发行版系列的更新日志:MySQL集群NDB 8.0/ MySQL集群NDB 8.0.13变化(2018-10-23,开发里程碑)

MySQL集群NDB 8.0.13变化(2018-10-23,开发里程碑)

功能添加或改变

  • 重要的变化;NDB磁盘数据:以下显示的更改磁盘数据文件的信息INFORMATION_SCHEMA.FILES表:

    • 表空间和日志文件组不再代表的文件表。(这些构造不是实际文件。)

    • 现在每个数据文件是由单个行文件表。现在每个undo日志文件也只在这个表的代表一行。(以前,一行显示为每个复制每个文件的每个数据节点上)。

    • 行相应的数据文件或undo日志文件、节点ID和undo日志缓冲区信息不再显示在额外的列的文件表。

      重要的

      移除NDB 8.0.15 undo日志缓冲区信息恢复。(错误# 92796,错误# 28800252)

  • 重要的变化;NDB客户端程序:删除了弃用——ndb选择perror。使用ndb_perror获得错误消息的信息NDB错误代码。(错误# 81705,错误# 23523957)

    引用:参见:错误# 81704,错误# 23523926。

  • 重要的变化:从这个版本开始,MySQL NDB集群正在开发与标准MySQL 8.0服务器在一个新的统一的释放模型具有以下特点:

    • NDB 8.0开发的,由使用MySQL 8.0发布的源代码树。

    • NDB集群8.0版本的编号方案遵循方案MySQL 8.0,从当前MySQL版本(8.0.13)。

    • 与NDB建立源附加的支持集群返回的版本字符串mysql- v,如下所示:

      壳牌≫mysql - v mysql版本为Linux 8.0.13-cluster x86_64(源分布)

      NDB二进制文件继续显示MySQL服务器版本和NDB引擎版本,像这样:

      壳> ndb_mgm - v MySQL distrib mysql-8.0.13 ndb-8.0.13-dmr, Linux (x86_64)

      在MySQL集群NDB 8.0中,这两个版本号总是相同的。

    构建MySQL 8.0.13源NDB集群支持(或更高版本),使用CMake选项-DWITH_NDBCLUSTER

  • NDB集群api:添加了方法getExtraMetadata ()setExtraMetadata ()

  • INFORMATION_SCHEMA现在表填充MySQL集群表的表空间数据。(错误# 27167728)

  • 现在可以指定一组内核用于I / O的线程执行离线多线程构建有序的索引,而不是正常的I / O文件I / O等职责,压缩或解压缩。离线在这种情况下是指执行的命令索引构建当父表没有被写入;这样的建筑发生当一个NDB集群执行节点或系统重启,或者使用从备份恢复一个集群的一部分ndb_restore——rebuild-indexes

    此外,离线索引构建的默认行为修改使用所有可用的核心工作ndbmtd,而限制自己核心的I / O的线程。这样做可以提高重启和恢复时间和性能、可用性和用户体验。

    此增强功能实现如下:

    1. 的默认值BuildIndexThreads改变从0到128。这意味着离线命令默认索引构建现在多线程。

    2. 的默认值TwoPassInitialNodeRestartCopy改变从真正的。这意味着一个初始节点重启首先副本的数据生活节点是开始时创建任何indexes-builds命令索引离线,然后再次同步数据和现场节点,也就是说,同步两次,两国synchonizations离线建立索引。这将导致一个初始节点重启的行为更像一个节点的正常重启,并减少所需的时间来建立索引。

    3. 一个新线程类型(idxbld)的定义ThreadConfig配置参数,允许离线索引构建线程锁定特定的cpu。

    此外,NDB现在不同的线程访问的类型ThreadConfig通过以下两个标准:

    1. 是否一个执行线程的线程。线程的类型主要,ldm,recv,代表,tc,发送执行线程;线程类型io,监管机构,idxbld不是。

    2. 分配的线程是否一个给定的任务是永久或暂时的。目前所有线程类型除了idxbld是永久性的。

    有关更多信息,请参见手册中的参数的描述。(错误# 25835748,错误# 26928111)

  • 当执行一个NDB备份时,ndbinfo.logbuffers现在显示表信息缓冲区使用的备份过程在每个数据节点上。这是实现为行除了反映出两个新的日志类型重做DD-UNDO。这些行之一的日志类型备份数据,显示缓冲期间使用备份的数据量片段复制到备份文件。另一行日志类型日志备份,它显示日志缓冲区的用量在备份后记录更改备份已经开始。一个每一个log_type行所示logbuffers表中的每个数据节点集群。行中有这两种日志类型表只有当一个NDB备份现在正在进展中。(错误# 25822988)

  • 添加了ODirectSyncFlag数据节点的配置参数。启用时,数据节点将所有完成文件系统写入重做日志好像他们已经进行使用fsync

    请注意

    这个参数没有影响,如果至少满足以下条件之一:

    • ODirect不启用。

    • InitFragmentLogFiles被设置为稀疏的

    (错误# 25428560)

  • 添加了——logbuffer-size选择ndbdndbmtd,用于调试与大量的日志消息。这个控件数据节点日志缓冲区的大小;默认(32 k)是用于正常操作。(错误# 89679,错误# 27550943)

  • NDB 8.0之前,所有字符串哈希是基于第一个将字符串转换为规范化的形式,然后使用md5哈希结果二进制图像。这可能会导致一些性能问题,原因如下:

    • 规范化字符串总是空间填充完整。对于一个VARCHAR,这往往涉及添加更多的空间比原来有字符字符串。

    • 的字符串库没有优化的空间填充,并在某些用例中添加相当大的开销。

    • 字符集之间填充语义不同,其中一些没有填充完整。

    • 转换后的字符串可能会相当大,即使没有空间填充;一些可以将一个代码点转换为Unicode 9.0排序100字节的字符数据或更多。

    • 随后MD5散列主要包括填充的空间,并不是特别有效,可能导致额外的性能损失的冲洗L1缓存的重要组成部分。

    整理提供自己的哈希函数,散列字符串直接首先创建一个规范化字符串。此外,对于Unicode 9.0针对性,没有填充的散列值计算。NDB现在利用内置函数当哈希字符串标识为使用Unicode 9.0排序。

    以来,其他现有数据库排序有散列分区转换后的字符串,NDB继续使用之前的方法使用这些哈希字符串,保持兼容性。(错误# 89609,错误# 27523758)

    引用:参见:错误# 89590,错误# 27515000,# 89604,Bug # 27522732。

  • 表中创建NDB 7.6和更早的包含元数据的形式压缩.frm文件,它不再是支持MySQL 8.0。为了方便在线升级NDB 8.0,NDB执行动态翻译此元数据并将其写入MySQL服务器的数据字典,这使mysqldNDB集群中的8.0与表的表没有防止后续使用之前版本的NDB软件。

    重要的

    一旦修改表的结构在NDB 8.0中,其元数据存储使用数据字典,它不再可以访问NDB 7.6和更早。

    此增强功能还可以恢复的NDB使用早期版本备份到一个集群运行NDB 8.0(或更高版本)。

错误修复

  • 重要的变化;NDB磁盘数据:这是可能的问题创建表声明一个不存在的表空间。现在这样一个语句失败与错误。(错误# 85859,错误# 25860404)

  • 重要的变化:NDB支持下列三个值创建表声明的ROW_FORMAT选择:默认的,固定,动态。以前,这些被接受,但导致以外的任何值动态被使用。现在一个创建表声明,试图创建一个NDB如果表失败,并显示一条错误ROW_FORMAT使用,没有列出的三个值中的一个。(错误# 88803,错误# 27230898)

  • 微软的Windows操作系统;ndbinfo信息数据库:监控过程的进程ID在Windows平台上使用重新启动产卵并重启mysqld现在所示ndbinfo.processes表作为一个angel_pid。(错误# 90235,错误# 27767237)

  • NDB集群api:NDB API的例子程序ndbapi_array_simplendbapi_array_using_adapter没有执行清理后执行;此外,该示例程序ndbapi_simple_dual没有检查是否这个例子中所使用的表已经存在。由于这些问题,这些例子可以连续运行超过一次。

    刚刚描述的问题已经纠正的例子来源,及相关代码清单NDB API文档的更新以匹配。10bet官方网站(错误# 27009386)

  • NDB集群api:之前的解决一个问题,在多个数据节点的失败部分重启可能导致API节点失败,没有正确检查相关的有效性NdbReceiver对象在继续之前。现在在这种情况下无效对象触发处理无效的信号,而不是一个节点故障。(错误# 25902137)

    引用:这个问题的回归:错误# 25092498。

  • NDB集群api:不正确的结果,通常是一个空的结果集,当返回setBound ()用于指定一个吗绑定。这个问题似乎是在gcc问题引起的,有限的情况下使用该方法的旧版本(不使用NdbRecord),是固定通过重写旧的有问题的内在逻辑的实现。(错误# 89468,错误# 27461752)

  • NDB集群api:发布NDB API对象保存在一个或多个Ndb_free_list结构为以后重用。每个列表也跟踪了所有对象,并确保这些是最终发布了回去。如果内部函数NdbScanOperation: init ()失败了,这是可能的NdbApiSignal已分配的NdbOperation泄露。现在在这种情况下,NdbScanOperation:释放()被称为释放分配的任何对象失败了NdbScanOperation之前返回给空闲列表。

    此修复还处理类似的问题NdbOperation: init (),一个失败的调用也可以泄漏信号。(错误# 89249,错误# 27389894)

  • NDB集群api:删除未使用的TFSentinel实现类,在32位系统上编译器警告。(错误# 89005,错误# 27302881)

  • NDB集群api:通过API调用线程创建的成功并不总是检查,在某些情况下这可能导致超时。(错误# 88784,错误# 27225714)

  • NDB集群api:该文件存储/ ndb / src / ndbapi / ndberror.c被重命名ndberror.cpp。(错误# 87725,错误# 26781567)

  • NDB客户端程序:通过一个无效的连接字符串时,ndb_mgm客户端并不总是在退出前释放所有内存使用。(错误# 90179,错误# 27737906)

  • NDB客户端程序:ndb_show_tables并不总是释放所有内存使用。(错误# 90152,错误# 27727544)

  • 当地检查站并不总是处理删除表正确操作。(错误# 27926532)

    引用:这个问题的回归:错误# 26908347,错误# 26968613。

  • 在某些情况下,当一个事务被中止DBTC块,依然链接触发记录操作记录尚未采用引用计数,但是当这样的操作记录是释放扳机引用计数还是递减。(错误# 27629680)

  • 一个内部缓冲区已经被释放后立即被重用可能导致计划外数据节点关闭。(错误# 27622643)

    引用:参见:错误# 28698831。

  • 一个NDB在线备份的数据,这是模糊,重做和undo日志。恢复到一致的状态有必要确保日志包含所有的更改生成的模糊数据的捕获部分内外一致的快照。这是通过等待GCI边界通过捕获的数据完成后,但在停止改变日志和记录停止GCI备份的元数据。

    在恢复时,日志重播停止GCI,恢复系统的状态已经停止GCI一致。一个问题出现的时候,在一定的负荷下,可以选择一个GCI边界发生过早,不跨越所有的数据捕获。这可能导致不一致时恢复备份;这些可以被注意到破碎的约束或损坏条目。

    现在选择停止GCI,横跨整个模糊数据捕获过程的持续时间,以便备份日志总是包含所有数据在给定停止快。(错误# 27497461)

    引用:参见:错误# 27566346。

  • NDB表、添加或删除一个外键时作为一个DDL语句的一部分,所有父表的外键metatdata引用应该重新加载所有SQL节点上的处理程序连接到集群中,但这样做是只在mysqld的语句被执行死刑。因此,任何后续查询依赖外键可以返回元数据对应的父表不一致的结果。(错误# 27439587)

    引用:参见:错误# 82989,错误# 24666177。

  • 分析表使用过多的CPU在大low-cardinality表。(错误# 27438963)

  • 查询使用非常大的列表没有正确处理,这可能导致数据节点的失败。(错误# 27397802)

    引用:参见:错误# 28728603。

  • 一个数据节点过载在某些情况下可能导致意外关闭的数据节点,导致所有数据节点断开从管理和节点。

    这是由于情况API_FAILREQ不是最后一个接收信号节点故障之前。

    作为解决的一部分,事务协调员的处理SCAN_TABREQ信号的ApiConnectRecord在一个不正确的状态也有所改善。(错误# 27381901)

    引用:参见:错误# 47039,错误# 11755287。

  • 在一个两节点集群,当节点ID最低的是开始使用——nostart、API客户端无法连接失败不能在主机端口PORT_NO alloc节点id:没有免费的节点id发现mysqld (API)。(错误# 27225212)

  • 改变MaxNoOfExecutionThreads没有一个初始系统重启导致计划外数据节点关闭。(错误# 27169282)

    引用:这个问题的回归:错误# 26908347,错误# 26968613。

  • 在大多数情况下,尤其是在错误的情况下,NDB命令行程序在退出时未能处理所使用的空闲内存选项,和失败ndb_end ()。这是固定的内部方法ndb_load_defaults ()ndb_free_defaults ()存储/ ndb / include / util / ndb_opts.h,用一个取代这些Ndb_opts等资源类,自动释放其析构函数的一部分。(错误# 26930148)

    引用:参见:错误# 87396,错误# 26617328。

  • 一个查询INFORMATION_SCHEMA.FILES它包括一个时表返回任何结果命令条款。(错误# 26877788)

  • 在重新启动,DBLQH负荷重做日志部分元数据对于每个重做日志管理部分,从一个或多个重做日志文件。因为每个文件元数据的能力有限,必须咨询的文件数量取决于重做日志的大小的部分。这些文件被打开、读取、顺序和关闭,关闭一个文件同时发生的开放。

    在关闭文件的缓慢的情况下,有可能超过4每重做日志文件同时开放一部分;因为这些文件打开使用OM_WRITE_BUFFER选项,超过4块写缓冲区分配每一部分在这种情况下。写缓冲池不是无限;如果所有重做日志部分在一个类似的状态,导致数据节点的池筋疲力尽,关闭。

    这个问题得到解决,避免使用OM_WRITE_BUFFER在元数据加载,所以任何瞬态开放超过4重做日志文件/日志文件部分不再导致失败的数据节点。(错误# 25965370)

  • 在某些情况下,数据节点的执行期间不必要的重启ALTER TABLE……重组分区。(错误# 25675481)

    引用:参见:错误# 26735618,错误# 27191468。

  • 竞态条件有时发生在异步断开和重新连接的运输而其他线程并发信号数据插入发送缓冲区,导致集群的计划外停机。

    作为工作的一部分,修复这个问题,内部使用的模板函数运输车注册准备发送时是使用likely-or-unlikely逻辑重构加速执行,并删除重复检查NULL。(错误# 24444908,错误# 25128512)

    引用:参见:错误# 20112700。

  • ndb_restore有时记录数据文件和日志文件进度值大于100%。(错误# 20989106)

  • 删除不必要的调试打印出来的内部函数ha_ndbcluster: copy_fk_for_offline_alter ()。(错误# 90991,错误# 28069711)

  • 内部函数BitmaskImpl: setRange ()设置一个少于指定。(错误# 90648,错误# 27931995)

  • 插入一行成一个NDB表有一个外键引用科学家将一个唯一索引表主键以外的失败ER_NO_REFERENCED_ROW_2。这是由于这一事实NDB检查外键约束在唯一索引更新,以便约束检查无法使用索引查找的行。现在,在这种情况下,NDB等待,直到所有惟一索引值一直在更新之前检查插入的行上的外键约束。(错误# 90644,错误# 27930382)

    引用:参见:错误# 91965,错误# 28486390。

  • 删除了所有对c++的引用注册存储类NDB集群资源;使用这种说明符,弃用c++ 11和删除在c++中17日提出警告,以构建与最近编译器。(错误# 90110,错误# 27705985)

  • 它是不可能创建一个NDB表的使用PARTITION_BALANCE设置为FOR_RA_BY_LDM_X_2,FOR_RA_BY_LDM_X_3,或FOR_RA_BY_LDM_X_4。(错误# 89811,错误# 27602352)

    引用:这个问题的回归:错误# 81759,错误# 23544301。

  • 添加一个(tcp)(shm)部分,一个集群的全局配置文件与多个数据节点导致违约TCP连接丢失节点使用单独的部分。(错误# 89627,错误# 27532407)

  • 在配置文件中删除内存泄漏的解析器。(错误# 89392,错误# 27440614)

  • 固定的implicit-fallthrough警告,警告了未初始化的值,和其他编译时遇到的警告NDBGCC 7.2.0。错误# 89255(错误# 89254年,错误# 89258,错误# 89259,错误# 89270,错误# 27390714,错误# 27390745,错误# 27390684,错误# 27390816,错误# 27396662)

    引用:参见:错误# 88136,错误# 26990244。

  • 节点连接状态并不总是正确地报道了ClusterMgr报告后立即断开。(错误# 89121,错误# 27349285)

  • 结果用于发送的代码的重用线程执行一个协助发送时,所有的本地版本公布全球发送缓冲区池,导致当地发送缓冲池的预期水平被忽略。现在发送线程和协助工作线程遵循自己的政策维持当地的缓冲池。(错误# 89119,错误# 27349118)

  • PGMAN阻止了一个新的Page_request记录使用seizeLast其返回值不是检查,可能会导致访问无效的内存。(错误# 89009,错误# 27303191)

  • TCROLLBACKREP没有正确处理的信号DBTC内核块。(错误# 89004,错误# 27302734)

  • 现在发送优先级信号时,我们确保挂起信号的数量显式初始化。(错误# 88986,错误# 27294856)

  • 内部函数ha_ndbcluster: unpack_record ()没有执行适当的错误处理。(错误# 88587,错误# 27150980)

  • 校验和不支持NDB表,但这不是不反映在校验和列的INFORMATION_SCHEMA.TABLES表,在这种情况下可能会假定一个随机值。现在这个列的值总是设置为NDB表,就像它是InnoDB表。(错误# 88552,错误# 27143813)

  • 运行时内存泄漏检测ndb_mgm - e“CLUSTERLOG……”。(错误# 88517,错误# 27128846)

  • 终止时,ndb_config不释放所有内存使用。(错误# 88515,错误# 27128398)

  • ndb_restore在退出前没有正确释放内存。(错误# 88514,错误# 27128361)

  • 在某些情况下,多个Ndb对象被用于从一个API节点并行块数量从一个块中提取参考DBLQH是一样的吗SUMA块即使请求来自一个API节点。由于这种模棱两可,DBLQH误以为从API请求节点的请求SUMA块,但都以失败告终。这是通过检查固定节点id之前检查块号码。(错误# 88441,错误# 27130570)

  • 内加入完全物化的一部分semijoin不推,即使它可能是。此外,解释没有提供信息为什么连接不推。(错误# 88224,错误# 27022925)

    引用:参见:错误# 27067538。

  • 所有已知的编译器警告了-Werror在构建的NDB源代码已经固定。(错误# 88136,错误# 26990244)

  • 当复制weedout算法用于评估一个semijoin,结果失踪的行。(错误# 88117,错误# 26984919)

    引用:参见:错误# 87992,错误# 26926666。

  • NDB不与GCC编译7。(错误# 88011,错误# 26933472)

  • 表中使用宽松的扫描可以作为一个孩子推连接查询,可能导致不正确的结果。(错误# 87992,错误# 26926666)

  • 当代表一个物化semijoin查询计划,MySQL优化器插入额外的QEP_TABJOIN_TAB对象来表示访问物化子查询的结果。加入叠加分析仪没有正确设置其内部数据结构对于这些,让他们未初始化。这意味着以后使用的任何条目对象引用物化semijoin访问一个初始化tableno当访问一个64位的列tableno位掩码,可能是指一个点超出其最终导致SQL节点的计划外停机。(错误# 87971,错误# 26919289)

  • 在某些情况下,SCAN_FRAGCONF收到信号后SCAN_FRAGREQ密切的旗帜已经被发送,清除计时器。当这发生时,下一个SCAN_FRAGREF到达时间跟踪失败引起的。现在在这种情况下,一个检查清除定时器处理之前执行SCAN_FRAGREF消息。(错误# 87942,错误# 26908347)

  • 在删除一个元素Dbacc,或移动它在哈希表扩展或减少,使用的方法(getLastAndRemove ())可以返回一个引用移除元素在发布页面,可后来被引用的函数调用。这是由于改变带来的动态索引内存NDB土壤质素的实施;以前,一直属于一个单一的页面Dbacc实例,所以访问是安全的。这不再是改变后的情况;一个页面发布Dbacc可以放置直接进入全球页面池,其他线程可以分配。

    现在我们确保新发布的页面Dbacc保存在当前Dbacc实例并没有直接在全球页面池。此外,引用发布页面已被删除;受影响的内部方法现在返回最后一个元素的值,而不是通过引用。(错误# 87932,错误# 26906640)

    引用:参见:错误# 87987,错误# 26925595。

  • 当创建一个表和一个不存在的冲突检测功能,NDB返回一个不正确的错误消息。(错误# 87628,错误# 26730019)

  • ndb_top未能建立与错误“HAVE_NCURSESW_H”没有定义。(错误# 87035,错误# 26429281)

  • 在MySQL集群配置一个MySQL服务器写入二进制日志失败发生在创建和使用一个NDB表店铺生成的列。只有当产品出现的问题是由调试支持。(错误# 86084,错误# 25957586)

  • 可以创建或改变存储记忆生成的表使用一个不存在的表空间没有任何错误。这样一个操作失败,错误3510ER_TABLESPACE_MISSING_WITH_NAME,如预期。(错误# 82116,错误# 23744378)

  • ndb_restore——打印数据的——十六进制没有打印后0LONGVARBINARY值。(错误# 65560,错误# 14198580)

  • 当内部函数ha_ndbcluster: copy_fk_for_offline_alter ()检查依赖对象表上应该放弃一个外键,它没有执行任何过滤为外键,使它尝试检索索引或触发相反,导致虚假错误723 (没有这样的表)。