Documentation Home
MySQL Shell 8.0 发行说明  /  MySQL Shell 8.0.14 的变化(2019-01-21,正式发布)

MySQL Shell 8.0.14 的变化(2019-01-21,正式发布)

AdminAPI 添加或更改的功能

  • Cluster.status() 操作已扩展,使您能够显示有关集群使用的基础组复制组的信息。现在您可以从集群的所有成员中检索信息,而无需单独连接到每个成员。

    查看关于groupNameand 的信息memberId;以及有关成员检查、提议和拒绝的交易数量的一般统计信息:

    Cluster.status({extended:true})

    查看有关恢复和常规事务 I/O、应用程序工作线程统计信息和任何滞后的信息;应用程序协调器统计信息,如果启用了并行应用;错误,以及来自 I/O 和应用程序线程问题的其他信息:

    Cluster.status({queryMembers:true})

    此外,在以前的版本 groupInformationSourceMember中,输出中 显示的 URI 类型字符串Cluster.status() 可能是集群的 MySQL 路由器地址,而不是提供显示的组信息的实例的地址。这已得到改进,以确保 groupInformationSourceMember始终显示提供组信息的实例的正确hostname, or report_host, value 和 port, or value 。report_port(错误#28636963、错误#26519466、错误#27824265、错误#28366027)

  • AdminAPI 不再依赖 mysqlprovision 检查命令。这项工作取得了以下成果:

    • errors返回的 JSON 中 的字段dba.checkInstanceConfiguration()已被删除,因为它仅用于保存 mysqlprovision 发出的错误。现在可以直接报告任何错误,例如 RuntimeError。

    • dba.verbose值不再影响为 dba.checkInstanceConfiguration()、 显示的调试信息量dba.configureInstance()dba.configureLocalInstance()因为它仅用于控制从 mysqlprovision 显示的信息的详细程度。相反,来自 MySQL Shell 的通用详细值用于控制这些函数的详细级别。

    • 此外,返回的消息已得到普遍改进,使其更加准确。

    参考资料:另请参阅:Bug #28737777、Bug #27305806、Bug #28768627、Bug #27702439、Bug #28733883。

  • 创建集群时,您可以设置实例从集群中移除之前的超时时间,例如当它们变得无法访问时。将新expelTimeout 选项传递给操作,该操作 在种子实例上dba.createCluster()配置 变量。group_replication_member_expel_timeout添加到集群的所有运行 MySQL 服务器 8.0.13 及更高版本的实例都会自动配置为 group_replication_member_expel_timeout 与种子实例上配置的值相同。

  • 您现在可以在集群保持在线时配置 InnoDB 集群的模式。这使您能够配置底层组复制组以选择特定实例作为单主模式下的新主实例,或者在不使集群脱机的情况下在多主模式和单主模式之间切换。这使用组协调器和 WL#10378中添加的功能,请参阅 配置在线组。使用以下操作:

    • Cluster.setPrimaryInstance(instance)instance,它通过覆盖任何选举过程 来强制选举 作为新的主要成员。

    • Cluster.switchToMultiPrimaryMode(),它将集群切换到多主模式。所有实例都成为主要实例。

    • Cluster.switchToSinglePrimaryMode([instance]),它将集群切换到单主模式。如果 instance指定,它将成为主要实例,所有其他实例成为次要实例。如果instance未指定,则新的主实例是成员权重最高的实例(在成员权重相同的情况下,UUID 最低)。

  • 您现在可以在实例联机时检查和修改 InnoDB 集群的现有设置。要检查集群的当前设置,请使用以下操作:

    • Cluster.options(),其中列出了其 ReplicaSets 和实例的集群配置选项。还可以指定布尔选项 all以在输出中包含有关所有 Group Replication 系统变量的信息。

    这项工作还使您能够在集群级别或实例级别配置 InnoDB 集群选项,同时实例保持在线。这避免了删除、重新配置然后再次添加实例以更改 InnoDB Cluster 选项的需要。使用以下操作:

    • Cluster.setOption(option, value)全局更改所有集群实例的设置

    • Cluster.setInstanceOption(instance, option, value)更改单个集群实例的设置

    您将 InnoDB Cluster 选项与列出的操作一起使用的方式取决于该选项是否可以更改为在所有实例上都相同。这些选项在集群(所有实例)和每个实例级别都是可变的:

    • exitStateAction

    • memberWeight

    此选项仅可在每个实例级别更改:

    • label

    这些选项只能在集群级别更改:

    • failoverConsistency

    • expelTimeout

    • clusterName

  • Cluster.rescan() 操作已扩展,使您能够检测集群拓扑的变化,并修改集群元数据,例如删除旧实例数据。现在你可以:

    • 使用该updateTopologyMode选项检测元数据中注册的组复制模式(单主模式或多主模式)是否与集群的当前模式匹配,如果通过新选项或提示确认请求,则更新元数据中的信息。在使用WL#12052 中添加 的 和 选项后,您可以使用此选项更新元数据 。 Cluster.switchToSinglePrimaryMode([instance])Cluster.switchToMultiPrimaryMode()

    • 使用addInstances选项指定要添加到元数据的新实例列表,或 removeInstances指定要从元数据中删除的过时实例列表的选项。将值传递 auto给这些选项以自动从元数据中添加或删除实例,而无需指定显式实例列表。这使该函数即使在非交互模式下也能更新元数据,使其与其他 AdminAPI 操作保持一致。

    • 此外,一个新的交互选项已添加到 cluster.rescan() 操作中,以启用或禁用专门针对该 cluster.rescan() 命令的交互模式提示。

    参考资料:另请参阅:Bug #28997465、Bug #28529362、Bug #28889563、Bug #25675665、Bug #28542904。

  • 在 8.0.14 中,如果主故障转移发生在单主模式下 ,则组复制引入了指定故障转移保证(最终或读取你的写入” )的能力(参见WL#11123)。通过将新 failoverConsistency选项传递给 dba.createCluster()操作来配置 InnoDB Cluster 在创建时的故障转移保证,这配置了 group_replication_consistency 种子实例上的系统变量。此选项定义了在单主组中选择新主节点时使用的新防护机制的行为。隔离限制连接从新主服务器写入和读取,直到它应用了来自旧主服务器的任何未决积压更改(有时称为读取您的写入)。当防护机制就位时,应用程序实际上不会在应用任何积压时看到短时间的时间倒退。这确保应用程序不会从新选出的主节点读取过时的信息。

    仅当目标 MySQL 服务器版本为 8.0.14 或更高版本时才支持该failoverConsistency选项,并且添加到已配置该failoverConsistency选项的集群的实例将自动配置为 group_replication_consistency 在支持该选项的所有集群成员上具有相同的配置。变量默认值由 Group Replication 控制,为EVENTUAL,将 failoverConsistency选项 更改BEFORE_ON_PRIMARY_FAILOVER为启用防护机制。或者使用 failoverConsistency=0for EVENTUALfailoverConsistency=1for BEFORE_ON_PRIMARY_FAILOVER

    笔记

    在多主 InnoDB Cluster 上使用该failoverConsistency选项没有效果但被允许,因为稍后可以通过该操作将集群更改为单主模式 Cluster.switchToSinglePrimaryMode()

修复了 AdminAPI 错误

  • 的默认值为 ,但 AdminAPI 现在覆盖了它并将实例的默认 值设置group_replication_exit_state_action 为。这可确保意外离开组的实例继续运行并可以重新加入集群。(漏洞 #28701263)ABORT_SERVERREAD_ONLY

  • 在未启用 X 插件的服务器上创建集群时,会对 X 协议端口值进行静默假设。现在,X 协议端口的值仅为启用了 X 插件的实例存储。(漏洞#27677227)

  • dba.checkInstanceConfiguration() 操作未检查目标实例上是否启用了性能模式。这可能会导致您可以创建集群但无法对其运行多个管理操作的情况,例如 Cluster.status() 操作。现在, dba.checkInstanceConfiguration()检查实例上是否启用了 Performance Schema。(缺陷号 25867733)

  • Cluster.checkInstanceState() 在已经是当前集群成员的实例上执行时,输出表明该实例是完全可恢复的。这是误导性的,是由于缺少验证以确保实例不属于集群造成的。(漏洞 #24942875)

  • 当权限通过角色(在 MySQL 服务器 8.0 及更高版本中可用)与用户相关联时,该dba.checkInstanceConfiguration() 操作无法识别权限。在这种情况下,尽管用户拥有所有必需的权限,但仍会错误地发出缺少权限的错误。现在,AdminAPI 操作可以正确识别具有角色分配权限的用户。(缺陷 #91394,缺陷 #28236922)

添加或更改的功能

  • X DevAPI:Table对象Collection 现在支持该.count()方法,它是 X DevAPI 的一部分。

  • 从命令行启动时,MySQL Shell 打印有关产品的信息、有关会话的信息(例如默认模式和连接 ID)、警告消息以及在启动和连接期间返回的任何错误。您现在可以通过使用mysqlsh命令行选项来禁止打印您不需要的信息 。值为 1(指定选项时的默认值)时,不打印有关 MySQL Shell 产品的信息,但会打印会话信息、警告和错误。值为 2 时,仅打印错误。 --quiet-start[=1|2]

    作为这项工作的一部分,对打印的信息进行了整理,以便在有关会话的信息之前打印有关 MySQL Shell 产品的信息。此外,错误打印的处理已规范化,可以将诊断数据发送到 stderr,将错误发送到 stdout。(错误#28833718,错误#28855291)

  • 使用经典 MySQL 协议的 MySQL Shell 连接现在支持对客户端和服务器之间发送的信息进行压缩。您可以在启动 MySQL Shell 并使用命令行选项进行连接时指定压缩,或者在使用其他接口创建会话时在 URI 字符串或键值对中指定压缩。您还可以使用 MySQL Shell 配置选项 defaultCompress为每个全局会话启用压缩。

    对于使用 Unix 套接字文件的 MySQL Shell 连接, --socket现在可以指定不带参数的命令行选项,以使用协议的默认 Unix 套接字文件进行连接。(缺陷号 28730149)

  • MySQL Shell JSON 导入实用程序现在可以处理 JSON 文档中表示的 BSON(二进制 JSON)数据类型。BSON 文档中使用的数据类型并非都由 JSON 原生支持,但可以使用 JSON 格式的扩展来表示。导入实用程序可以处理使用 JSON 扩展来表示 BSON 数据类型的文档,将它们转换为相同或兼容的 MySQL 表示,并使用该表示导入数据值。转换后的数据值可用于表达式和索引,并可由 SQL 语句和 X DevAPI 函数进行操作。      

    要以这种方式将 BSON 类型的 JSON 扩展转换为 MySQL 类型,您必须 convertBsonTypes在运行导入实用程序时指定该选项。其他选项可用于控制特定 BSON 数据类型的映射和转换。如果您导入具有 BSON 类型的 JSON 扩展名的文档并且不使用此选项,则文档将以与它们在输入文件中表示的方式相同的方式导入。

  • 添加了 MySQL Shell 配置选项 showColumnTypeInfo和命令行选项 --column-type-info,以显示返回结果集中每一列的元数据,例如列类型和排序规则。元数据在结果集之前打印,并且仅在 SQL 模式下显示。

    在元数据中,列类型作为 MySQL Shell 使用的类型 ( Type) 和原始数据库使用的类型 ( DBType) 返回。对于使用经典 MySQL 协议的 MySQL Shell 连接, DBType由协议返回,对于 X 协议连接,DBType从可用信息推断。列长度​​ ( Length) 以字节为单位返回。

  • MySQL Shell 提供的升级检查器实用程序,即全局对象的checkForServerUpgrade()功能 util,有几个增强功能:

    • 该实用程序现在可以为无法自动执行且必须手动执行的相关检查选择并提供建议和说明。手动检查被评为警告或通知(信息)级别,并列在自动检查之后。在 MySQL Shell 8.0.14 中,该实用程序提供了有关 MySQL 8.0 中默认身份验证插件更改的相关建议。

    • 已添加检查已删除的 log_syslog_*系统变量,这些变量以前配置错误记录到系统日志(Windows 上的事件日志,以及syslogUnix 和类 Unix 系统)。

    • 已针对可能由文件删除或损坏引起的特定模式不一致添加了检查,包括删除模式的目录和删除.frm表的文件。

    您可以从 MySQL Shell 中访问升级检查器实用程序或从命令行启动它。有关说明和更多信息,请参阅 MySQL Shell 实用程序

  • MySQL Shell 可以以表格、选项卡式或垂直格式打印结果,或者作为漂亮或原始的 JSON 输出。从 MySQL Shell 8.0.14 开始,新的 MySQL Shell 配置选项 resultFormat可用于将这些输出格式中的任何一种指定为所有会话或仅当前会话的持久默认值。更改此选项会立即生效。或者,可以在启动时使用新的命令行选项 --result-format来指定会话的输出格式。现有命令行选项--table--tabbed--vertical现在是--result-format具有相应值的选项的别名。

    现有命令行选项 --json控制会话中所有 MySQL Shell 输出的 JSON 包装。指定 --json--json=pretty打开 JSON 包装并生成漂亮的 JSON。指定 --json=raw打开 JSON 包装并生成原始 JSON。使用这些选项中的任何一个,resultFormatMySQL Shell 配置选项的值都会被忽略。指定 --json=off或不指定该 --json选项将关闭 JSON 包装,结果集将以resultFormat配置选项指定的格式正常输出。

    outputFormatMySQL Shell 配置选项现已弃用 。此选项结合了 JSON 包装和结果打印功能,这两个功能现已分开。如果您的 MySQL Shell 配置文件或脚本中仍指定此选项,则行为如下:

    • 使用jsonjson/raw值, outputFormat分别激活使用漂亮或原始 JSON 的 JSON 包装。

    • 使用tabletabbedvertical 值,outputFormat关闭 JSON 包装并将resultFormat 会话的 MySQL Shell 配置选项设置为适当的值。

  • MySQL Shell 使用的 V8 库已经更新到 6.7.288.46 版本。

修正错误

  • MySQL Shell 的 TAR 版本随 Python 2.7 一起提供。尝试包含站点包时,由于缺少包含所需的构建文件而发出错误。(缺陷号 28973138)

  • 重构了 MySQL Shell 中用户提供的数据的处理过程,以确保在使用后进行正确的清理。(漏洞#28915716)

  • MySQL Shell 函数针对参数错误返回的异常类型和错误消息已在不同的函数中标准化。(漏洞#28838958)

  • shell.setCurrentSchema()如果在建立活动会话之前调用 该方法来设置默认架构,则 MySQL Shell 会意外停止 。MySQL Shell 现在会在操作发生时验证是否存在活动会话。(漏洞#28814112)

  • 如果没有导入选项,MySQL Shell JSON 导入实用程序不再需要提供空字典。(漏洞#28768585)

  • IDENTIFIED在 SQL 模式下,如果 MySQL Shell 包含字符串or PASSWORD或您使用--histignore命令选项 配置的其他字符串, 则 MySQL Shell 不会将语句添加到历史记录中orshell.options["history.sql.ignorePattern"]. 但是,这以前意味着过滤掉的语句在输入后无法立即更正,并且在出现任何错误时必须重新输入。MySQL Shell 现在总是可以通过按向上箭头来调用最后执行的语句,而不管历史忽略列表中设置的过滤器如何。如果过滤适用于最后执行的语句,则一旦输入另一个语句,或者如果您在执行该语句后立即退出 MySQL Shell,它就会从历史记录中删除。(缺陷号 28749037)

  • MySQL Shell 中的结果打印逻辑已被重构为使用后端而不是高级结果数据,为所有类型的结果数据提供性能改进,并为 JSON 数据提供更准确的表示。(缺陷号 28710831)

  • 修复了使用新的 MySQL Shell 命令行语法时发生的内存泄漏。(漏洞 #28705373)

  • 在 MySQL Shell(操作)提供的升级检查器实用程序中检查共享表空间中的分区表 util.checkForServerUpgrade()未返回 8.0.11 和 8.0.12 目标版本的正确结果。该检查现在使用替代的信息架构表,这些表在这些版本中填充了所需的信息。(漏洞#28701423)

  • MySQL Shell 命令\option忽略了在初始值之后为选项指定的由空格分隔的其他参数。(漏洞#28658632)

  • MySQL Shell 允许使用该方法将密码中的换行符(换行符和回车符)传递给 Secret Store Helper shell.storeCredential ,从而导致 Secret Store Helper 出错。如果在为该方法提供的密码中使用换行符,MySQL Shell 现在会返回异常 shell.storeCredential,并且不会将它们传递给 Secret Store Helper。(缺陷号 28597766)

  • 在 Windows 平台上,UTF-8 编码的字符串使用对象打印到控制台cout,一次传输一个字节。这导致多字节 Unicode 字符(例如单引号)显示和处理不正确。MySQL Shell 现在使用替代函数进行打印,并验证多字节 UTF-8 字符是否作为一个完整的单元发出。(漏洞#28596692)

  • 在 MySQL Shell 中执行 SQL 脚本时,针对脚本中语法错误的位置报告了不准确的行号。该数字引用了当前 SQL 块而不是脚本中的行号。错误消息现在使用全局行号。(漏洞 #28545982)

  • MySQL Shell 中的 SQL 语句拆分逻辑已被重构以修复许多问题并匹配 MySQL 命令行工具mysql的行为:

    • \分隔符字符串中不再接受 反斜杠字符 ( )。

    • 现在可以正确处理在非命令的上下文中 使用定界符 一词。

    • 在脚本中,注释不会被丢弃,并且注释和语句组现在的拆分方式与 mysql拆分它们的方式相同。

    • 大型脚本现在可以成功地分成增量块,即使某些标记跨越多个块也是如此。

    • 现在可以在 ANSI_QUOTESSQL 模式下解析脚本。

    • 现在可以正确解析包含引号的多行字符串和注释。

    • 内联命令的处理方式与 mysql相同,如下所示:

      • \出现在语句开头的字符被解释为多字母 MySQL Shell 命令的开始 。

      • 语句中出现的\字符被解释为单字母命令的开始。该命令立即执行,然后从输入语句中剥离。

      • 语句结束后出现的\字符被解释为单字母命令的开始。

    (错误#27959016,错误#25689071)

  • MySQL Shell 对 Windows 命名管道连接的处理得到了改进和系统化。现在,如果您在 Windows 上将主机名指定为句点 (.),MySQL Shell 将使用命名管道进行连接。

    • 如果您使用 URI 类型字符串进行连接,请指定 user@.

    • 如果您使用数据字典进行连接,请指定 {"host": "."}

    • 如果您使用单独的参数进行连接,请指定 --host=.-h .

    默认情况下,使用管道名称MySQL--socket您可以使用该选项或作为 URI 类型字符串的一部分来指定替代命名管道 。如果使用 URI 类型字符串,则命名管道必须以字符\\.\为前缀,并使用百分比编码进行编码或用括号括起来,如以下示例所示:

    (\\.\named:pipe)
    \\.\named%3Apipe

    (漏洞#27381738)

  • 为 MySQL Shell 启用 JSON 格式输出时,不打印 Shell API Options 类 ( shell.options) 和 AdminAPI Cluster 类 ( dba.getCluster) 的属性,仅打印类名。(漏洞 #25027181)