MySQL Shell版本说明/ MySQL Shell 8.0.23(21-01-18,通用可用性)

MySQL Shell 8.0.23(21-01-18,一般可用性)

AdminAPI添加或更改功能

  • 的输出状态()操作已扩展,以提供更多与诊断错误有关的信息。以下是InnoDB集群和InnoDB副本集的信息:

    • memberState字段显示本地查询的实例的实际状态,可以为离线错误恢复,或在线

    • 一个recovery.recoveryChannel字段显示正在执行增量恢复或恢复通道状态不为关闭的实例

    • 一个新的instanceErrors字段为每个实例存在,显示可为其检测到的任何诊断信息

    • 扩展选项设置为大于0,则输出包含applierChannel字段,如果实例在线且应用程序通道状态未开启,或者状态未恢复或在线且应用程序通道状态未关闭,则包含复制信息

    有关更多信息,请参见检查集群的状态集群.status ()

  • InnoDB Cluster和InnoDB replicset现在支持并启用并行复制应用程序,有时被称为多线程复制。随着MySQL的进步,如二进制日志事务依赖跟踪和基于XXHASH64的GTID集提取,使用多个复制应用程序线程提高了复制应用程序和增量恢复的吞吐量。

    这导致了以下变化:

    • 运行8.0.23及更高版本的实例的需求现在还包括:

      这意味着运行8.0.23的新实例具有由dba.configureInstance ()而且dba.configureReplicaSetInstance ().尝试添加运行8.0.23或更高版本但未配置这些变量的实例会导致错误。当您升级一个集群或副本集,该集群或副本集运行的MySQL服务器和MySQL Shell版本早于8.0.23时,并行复制应用程序不会在实例上启用。这意味着您没有利用该特性,并且您应该重新配置您的实例以使用并行复制应用程序。有关更多信息,请参见配置并行复制应用程序

    • dba.checkInstanceConfiguration ()验证是否启用了并行复制应用程序。

    • applierWorkerThreads选项配置实例用于复制的复制应用程序线程数,默认为4个线程。方法使用此选项dba.configureInstance ()而且dba.configureReplicaSetInstance ().您可以在实例在线时更改此选项,但只有在实例重新启动后才进行更改。

    • 的输出.status(扩展= 1)而且选择()Operations现在包含关于并行应用程序配置的信息。

AdminAPI bug修复

  • Bug#29305551的修复dba.checkInstanceConfiguration ()操作,以包含一个检查,以验证是否在目标实例上配置了异步复制并正在运行,并在这种情况下打印警告。此检查也用于集群.addInstance ()而且集群.rejoinInstance ()操作,在检测到这种场景时以错误终止它们,并且该操作也用于dba.rebootClusterFromCompleteOutage ()操作,每当有实例要重新加入到集群时。然而,dba.createCluster ()手术失误跳过了检查,然后dba.rebootClusterFromCompleteOutage ()操作跳过了对用于引导集群的实例的检查。该修复确保在完全停用的情况下创建或重新启动集群时也执行检查。此外,它还添加了覆盖检查的支持dba.createCluster ()的操作选项,它改进了错误消息。(错误# 32197222)

  • Bug#29305551的修复扩展dba.checkInstanceConfiguration ()验证异步复制是否已配置并在目标实例上运行,如果是这样,则打印一个警告。但是,没有检查复制区域通道是否已配置但未运行。此修复程序确保验证也考虑配置了但没有积极运行的复制通道。另外,一条错误的信息暗示可能使用停止复制覆盖此检查已被删除,取而代之的是一条信息性消息,该消息解释不支持非托管复制区域通道以及使用它们的可能危险。(错误# 32197197)

  • 根据术语的变化王# 14189, AdminAPI已经与新条款保持一致。错误和日志消息现在使用术语源(以前是主)和副本(以前是从)。(错误# 32152133)

  • 在一次集群.rebootClusterFromCompleteOutage ()操作时,GTID超集用于检测应该使用哪个实例重新启动集群。如果一个实例具有发散的GTID集,并且您希望显式地将其从集群中删除,那么操作将阻塞,因为它无法确定哪个实例具有GTID超集。以前,在这种情况下,没有办法从用于检测GTID超集的实例中排除该实例。现在,如果在交互向导期间回答no,则配置removeInstances选项,则在查找GTID超集时不检查实例。(错误# 32112864)

  • 当一个实例离开了一个副本集,然后它的配置被改变了,使它对InnoDB副本集的使用无效ReplicaSet.rejoinInstance ()操作没有检测到配置无效。现在,在将实例重新连接到replicset之前,将检查实例以确保它们是有效的。(错误# 31975416)

  • 在升级元数据时使用dba.upgradeMetadata (),如果有MySQL路由器实例需要升级,操作将等待所有实例都升级后再继续。该操作为您提供了重新检查过时的MySQL Router实例并继续元数据升级的选项。MySQL路由器升级只有在重新启动应用程序后才完成,但是打印的消息没有提到这一点。这个消息现在包含了MySQL路由器实例在二进制文件升级后必须重新启动的信息。(错误# 31882876)

  • 当您连接到辅助实例时,试图发出诸如集群.rejoinInstance ()集群.addInstance ()集群.dissolve ()等等都会失败。现在,AdminAPI总是连接到当前的主服务器。

    作为这项工作的一部分,作出了以下修改:

    • 现在,如果dba.createCluster ()集群.addInstance ()如果出现组复制错误,AdminAPI将返回performance_schema.error_log条目。

    • 集群.rejoinInstance ()如果实例已经在集群中,则操作已更改为成功,而不是引发异常。

    • dba.rebootCluster ()操作已更改为不清楚super_read_only在实例上。

    (错误# 31757737)

  • 作为InnoDB Cluster默认设置的一部分,为了确保实例自动重新加入到集群中group_replication_start_on_boot选项自动设置为true。然而,这意味着在使用外部工具管理集群生命周期的环境中,例如像Kubernetes这样的协调器,重新连接的自动启用可能会导致与该工具的冲突。此外,如果在不合适的时间启用了实例的自动重新连接(例如在重新引导时,或在修复裂脑时,等等),则可能发生死锁或长时间冻结,直到超时发生。在某些情况下,实例甚至可能在重新配置期间加入错误的集群。

    为了避免这种情况,manualStartOnBoot添加了布尔选项,默认为false。若要禁用实例的自动重新连接,例如在修复裂脑时,请设置manualStartOnBoot选项为true。这将防止在您进行更改时实例自动重新加入集群。属性之前,您需要手动将实例重新连接到集群manualStartOnBoot选项返回false,以确保实例再次自动重新加入集群。类似地,如果使用外部协调器来管理实例的生命周期,请设置manualStartOnBoot选项在整个集群中设置为true,以禁用实例自动重新加入集群。然后应该将协调器配置为手动重新连接实例。(错误# 31643595)

  • 调用dba.checkInstanceConfiguration ()verifyMyCnf设置为一个不存在的文件,则操作成功完成,表示已检查配置文件。的文件是否指定verifyMyCnf存在,如果不存在则打印错误,并确保控制台不会显示不必要的错误消息。(错误# 31468546)

  • 的实例上sql_mode变量设置为ANSI_QUOTES,试图用。升级元数据模式dba.upgradeMetadata ()失败与错误:“字段列表”中“MySQL路由器”列未知.这与使用单引号对字符串加引号的查询有关。作为此修复的一部分,升级元数据操作现在准备AdminAPI使用的会话,在其他完整性检查中,它确保sql_mode对于该会话,使用默认值以避免不兼容的用户配置设置。此外,对dba.getCluster ()而且dba.dropMetadataSchema ()操作。(错误# 31428813)

  • 如果MySQL Shell全局会话连接到一个沙盒实例,并且该实例已停止,MySQL Shell将尝试错误地重新连接到该实例。现在,如果活动会话连接到正在停止的沙箱实例,MySQL Shell将关闭会话。(错误# 31113914)

  • 的输出集群.status ()现在包含关于在元数据中注册但当前未在线的实例的附加信息。MySQL Shell现在连接到在元数据中找到的脱机实例,并试图诊断它们,提供诸如它们的连接和状态等附加信息。(错误# 30501615)

  • 实例是底层组的一部分,但没有在元数据中识别,例如,因为它们是手动配置的,绕过了MySQL Shell,或者因为它们之前从InnoDB集群中删除了,但没有正确地退役,现在显示在的输出中集群.status (),以及关于元数据差异的诊断警告。这确保您可以检测到哪些情况下,一个实例正在参与组中,但没有被MySQL Shell管理。(错误# 27882663)

  • 一个属于一个InnoDB集群的实例通过它的服务器UUID来标识。如果UUID在实例离开集群后更改,例如,因为您使用MySQL Enterprise Backup从备份进行恢复,那么实例就不能重新加入到集群中。现在,如果集群遇到这种情况,它会检查元数据,看看是否可以使用其主机和端口识别实例。如果找到,则根据用于重新连接操作的选项更新元数据。的过程中执行此检查集群.rejoinInstance ()而且集群.rescan ()操作。

    此外,还执行一个检查来验证serverId在元数据中注册为实例属性。如果不是,则相应地更新元数据。此检查在添加、重新连接和重新扫描操作时执行。(错误# 26649039)

增加或更改的功能

  • MySQL Shell的并行表导入实用程序现在可以导入指定的输入数据文件列表,并且它支持通配符模式匹配,以包括来自某个位置的所有相关文件。该实用程序的一次运行上传的多个文件被放置到一个关系表中,因此,例如,从多个主机导出并存储在多个文件中的数据可以合并到一个表中,以便用于分析。文件可以被压缩为gzip或zstd格式,在这种情况下,实用程序以压缩格式从存储中读取它们,为这部分传输节省带宽。然后,该实用程序使用它的并行连接来解压并将多个文件同时上传到目标服务器。

错误修复

  • 当MySQL Shell的实例转储实用程序util.dumpInstance ()是由ocimds选项设置为真正的检查MySQL数据库服务的兼容性用户选项设置为真正的为了在转储中包含用户及其角色和授权,该实用程序报告了一些实际允许的特权的兼容性错误。MySQL Shell的MySQL数据库服务的权限列表现在已经更新。(错误# 32213605)

  • MySQL Shell的表转储实用程序的行为util.dumpTables ()和转储加载实用程序util.loadDump ()关于单表转储和加载的模式已经更改。以前,为单个表生成的转储文件不包含用于重新创建模式的SQL语句,因此在转储加载实用程序加载表之前,模式必须存在于目标MySQL实例中。现在,表转储实用程序生成的转储包含模式语句,当使用转储加载实用程序加载它们时,默认情况下,如果模式不存在,则在目标MySQL实例中创建该模式。的模式选项可用于将表转储加载到目标MySQL实例中存在的另一个模式中。使用该实用程序早期版本创建的表转储仍然需要模式选项和现有的模式。(错误# 32165101)

  • MySQL Shell的表转储实用程序util.dumpTables ()现在支持ocimds兼容性ociParManifest,ociParExpireTime选项,因此您可以检查与MySQL数据库服务的兼容性,并为转储文件生成预认证的请求url。此外,ignoreVersion选项已扩展为允许导入在没有ocimds选项进入MySQL数据库系统。(错误# 32140970)

  • 如果转储包含使用外部身份验证插件创建的用户,则MySQL Shell的转储加载实用程序util.loadDump ()如果这些插件在目标服务器实例上不可用,则无法加载转储。的ocimds选项MySQL Shell的实例转储实用程序util.dumpInstance ()和模式转储实用程序util.dumpSchemas它检查MySQL数据库服务的兼容性,现在检查使用MySQL数据库服务不支持的认证插件的帐户。兼容性选项有一个附加的修改选项skip_invalid_accounts,它将删除此类用户帐户。(错误# 32115948)

  • 以前,MySQL Shell的转储加载实用程序util.loadDump ()停止时出现错误loadUsers选项设置为true,但提供的转储文件不包含用户帐户。该实用程序现在显示一个警告,并在此情况下继续。(错误# 32115861)

  • MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()回落到使用锁表如果consistent选项设置为true(默认值),则锁定转储表的特权重新加载特权不可用。但是,锁定操作可能会导致活动事务上的隐式提交,这意味着数据没有被一致地转储。现在已经纠正了锁定,以确保这种情况的一致性。(Bug #32107327, Bug #101410)

  • 当MySQL Shell的dump加载实用程序util.loadDump ()使用索引标识行边界,如果索引指向读取缓冲区中的数据以外,则会发生错误。实用程序现在检查这种情况,如果是则忽略索引。(错误# 32072961)

  • 当MySQL Shell试图重新连接到服务器时,Ctrl + C没有中断操作。中断现在起作用,并将重试尝试计数器设置为零,以便序列正确退出。(错误# 32041342)

  • MySQL Shell现在可以使用Python 3.9构建。(错误# 32020230)

  • updateGtidSet选项MySQL Shell的转储加载实用程序util.loadDump ()由于权限限制,MySQL数据库系统无法使用。该实用程序现在使用一个被允许的存储过程,因此可以使用该选项。(错误# 32009225)

  • 当MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas (),或表转储实用程序util.dumpTables ()在导出到Oracle云基础设施对象存储桶时,如果到对象存储服务器的连接或路由丢失,MySQL Shell会意外停止。错误现在得到了正确的处理。(错误# 32005418)

  • MySQL Shell的转储加载实用程序util.loadDump ()如果响应中的头值为空,则返回异常。(错误# 31979374)

  • MySQL Shell没有初始化Python 3.8的新cf_feature_version编译器标志字段,该字段在使用格式字符串时可能导致异常。(错误# 31926697)

  • MySQL Shell使用的是Python的系统安装,而不是绑定的版本,MySQL Shell现在支持的最小版本是Python 3.6。Python 3.4.3是之前系统安装的最低要求。绑定的版本是Python 3.7.7。(错误# 31900744)

  • MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()使用表统计信息确定合适的默认行大小。如果表的统计信息过时或不存在,这可能会导致分块过程出现问题。在这种情况下,MySQL Shell现在发出一条消息,建议使用分析表语句以生成最新的统计信息。(错误# 31766490)

  • skipBinlog选项MySQL Shell的转储加载实用程序util.loadDump ()跳过在导入的目标MySQL实例上的二进制日志记录。该选项不适合MySQL DB系统,因为二进制日志记录状态不能更改,如果在这种情况下使用该选项,导入现在会失败并显示错误消息。对于其他MySQL实例,该实用程序现在检查用户是否具有设置sql_log_bin系统变量,如果不这样做,则失败并显示错误消息。(错误# 31748786)

  • MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()使用表的唯一索引的第一列对为导出而获取的数据进行排序。同样的方法用于查询数据以进行分组。实用程序现在使用唯一索引的所有列进行排序。此外,通过添加缓存来存储经常使用的实例元数据,性能得到了提高。缓存是一次性为所有模式对象填充的,而不是根据需要由单个查询填充。(错误# 31706755)

  • MySQL Shell的disconnect功能被添加到壳牌全局对象。(错误# 31704380)