Documentation Home
MySQL Shell 8.0 发行说明  /  MySQL Shell 8.0.19 的变化(2020-01-13,全面上市)

MySQL Shell 8.0.19 的变化(2020-01-13,全面上市)

AdminAPI 添加或更改的功能

  • 不兼容的更改: AdminAPI 现在包括 InnoDB ReplicaSets,它使您能够以类似于 InnoDB Cluster 的方式管理异步复制设置。InnoDB ReplicaSet 的加入意味着 InnoDB Cluster 元数据模式已经升级到 2.0 版本。无论您是否计划使用 InnoDB ReplicaSet,要使用 MySQL Shell 8.0.19 和 AdminAPI,您都必须升级集群的元数据。将 MySQL Shell 的全局会话连接到您的集群,并使用新dba.upgradeMetadata()操作升级集群的元数据以使用新的元数据。

    警告

    如果不升级元数据,您将无法使用 MySQL Shell 8.0.19 更改使用早期版本创建的集群的配置。您只能读取集群的配置,例如使用 Cluster.status().

    dba.upgradeMetadata()操作升级任何自动创建的 MySQL Router 用户以具有正确的权限。名称不以 开头的手动创建的 MySQL Router 用户mysql_router_不会自动升级。这是升级集群的重要步骤,只有这样才能升级 MySQL Router 应用程序。请参阅升级 InnoDB 集群

    警告

    使用新元数据的集群不能由早期的 MySQL Shell 版本管理,例如,一旦升级到 8.0.19 版本,您就不能再使用 8.0.18 或更早版本来管理集群。

    要获取有关向集群注册的哪些 MySQL Router 实例需要元数据升级的信息,请发出 cluster.listRouters({'onlyUpgradeRequired':'true'}).

  • AdminAPI 现在支持用于集群和副本集操作的套接字连接。(缺陷号 26265826)

  • 您现在可以获取有关在 InnoDB Cluster 中注册的 MySQL Router 实例的信息,并从集群中注销 Router,例如当您停止使用它时。使用该 Cluster.listRouters() 操作显示在集群中注册的所有路由器的列表。结果提供主机名、端口等信息。

    要过滤列表以仅显示不支持最新元数据版本的 Router 实例,请使用该 onlyUpgradeRequired选项,例如通过发布 Cluster.listRouters({'onlyUpgradeRequired':'true'}). 返回的信息显示Router实例是否与您使用的MySQL Shell版本支持的Metadata版本兼容,您可以在升级集群时使用。

    要从集群中删除已注册的路由器,请使用该 操作。 Cluster.removeRouterMetadata(router)

  • AdminAPI 包括对 InnoDB ReplicaSet 的支持,使您能够以类似于 InnoDB Cluster 的方式管理异步复制集。InnoDB ReplicaSet 使您能够部署由单个主节点和多个辅助节点(传统上称为 MySQL 复制主从)组成的异步复制集。您使用 AdminAPI 操作管理 ReplicaSet,例如检查 InnoDB ReplicaSet 的状态,并在发生故障时手动故障转移到新的主节点。与 InnoDB Cluster 类似,MySQL Router 支持针对 InnoDB ReplicaSet 的引导,这意味着您可以自动配置 MySQL Router 以使用您的 InnoDB ReplicaSet,而无需手动配置文件。这使得 InnoDB ReplicaSet 成为启动和运行 MySQL 复制和 MySQL Router 的快速简便的方法,使其非常适合扩展读取、开发环境和不需要 InnoDB Cluster 提供的高可用性的应用程序。看 升级 InnoDB 集群

修复了 AdminAPI 错误

  • 当在无权访问选项文件且操作请求指定输出配置文件的非沙盒实例上执行时, 该dba.configureLocalInstance()操作可能会失败并出现未找到密钥 (LogicError)错误。my.cnf(缺陷号 30657204)

  • 扩展状态信息现在显示在 InnoDB Cluster 或 InnoDB ReplicaSet 上找到的元数据版本。例如问题:

    mysql-js> Cluster.status({extended=1})
    mysql-js> ReplicaSet.status({extended=1})

    (缺陷号 30624615)

  • 如果使用 MySQL Shell 版本 8.0.14 或更早版本部署集群,则元数据包含 X 协议连接的无效端口号。元数据升级捕获此类端口并删除无效号码。为避免由于此错误端口导致的路由问题,请升级集群的元数据。请参阅 升级 InnoDB 集群。(缺陷号 30618264)

  • 当复制副本被配置为从 InnoDB 集群主读取时,即使使用适当的复制过滤来忽略元数据,当使用 MySQL 克隆作为恢复方法将实例添加到集群时,复制也会失败。这是因为恢复过程正在授予帐户特权,但该帐户失败并破坏了复制。(缺陷号 30609075)

  • Cluster.removeInstance() 实例无法访问时,操作会发出误导性错误消息,表明在使用替代有效主机或 IP 时它不属于集群。现在,错误表明实例无法访问。(缺陷号 30580393)

  • 尽管 MySQL Shell 8.0.18 版在 WL#12758中添加了对 IPv6 的支持,但无法使用由 MySQL Shell 8.0.18 版和 MySQL Router 8.0.18 以及 IPv6 地址组成的 InnoDB 集群。随着 MySQL Shell 和 MySQL Router 8.0.19 版本的发布,请注意:

    • 由于不支持 IPv6,将 MySQL Shell 版本 8.0.18 与 MySQL Router 8.0.18 结合使用会导致 Router 失败。(漏洞#30354273)

    • 在使用 X 协议连接的集群中将 MySQL Shell 版本 8.0.18 与路由器 8.0.19 相结合,导致 AdminAPImysqlX在元数据中错误地存储 IPv6 值,从而导致路由器失败。(错误号 30548843)但是,在使用 MySQL 经典协议连接的集群中,将 MySQL Shell 版本 8.0.18 与路由器 8.0.19 结合起来是可能的。

    因此,要使用具有 IPv6 地址的 InnoDB Cluster,无论使用何种协议,推荐的部署是 MySQL Shell 8.0.19 和 MySQL Router 8.0.19。(缺陷号 30548843)

    参考资料:另请参阅:Bug #30354273。

  • 使用自动重新加入时,如果目标实例正在重新加入集群,则 、 等操作将 dba.rebootClusterFromCompleteOutage()失败 Cluster.status()。现在,集群将自动重新加入视为实例状态,而不是始终中止操作的检查。这确保 Cluster.status() 即使对于正在重新加入集群的实例也会报告,并且 dba.rebootClusterFromCompleteOutage()可以检测正在重新加入集群的实例并覆盖重新加入操作,以便集群可以正确重启。(缺陷号 30501590)

  • clusterAdmin设置连接选项时未复制用户的 SSL 客户端证书选项 ,这导致它们在连接时失败。(缺陷号 30494198)

  • 当自动计算 localAddress无效时,例如当它超出有效范围时,错误消息现在已得到改进。请参阅 配置 InnoDB 集群端口。(缺陷号 30405569)

  • AdminAPI 确保集群的所有成员都具有与创建集群时配置的相同的一致性级别。但是,当为集群选择高和非默认一致性级别时,向其添加实例会导致错误 3796,这表明 group_replication_consistency 无法在目标实例上使用。发生这种情况是因为 和 的一致性值 不能用于 是 的实例, BEFORE并且 AFTER当实例处于该 阶段时会发生多个事务。只要集群中的至少一个成员处于同一场景(高全局一致性级别),其他 AdminAPI 命令就会导致相同的错误 BEFORE_AND_AFTERRECOVERINGRECOVERINGRECOVERING. 例如, dba.getCluster()。该修复确保 AdminAPI 使用的所有会话都使用 EVENTUAL集群一致性级别为或 BEFORE时的一致性级别。(错误#30394258,错误#30401048)AFTERBEFORE_AND_AFTER

  • clusterAdminAdminAPI 创建 的用户缺少在 MySQL 8.0 服务器上持久配置更改所需的一些权限 。特别是,正在发出 拒绝访问SYSTEM_VARIABLES_ADMIN错误,指示需要和 PERSIST_RO_VARIABLES_ADMIN 特权。clusterAdmin现在为MySQL 8.0 服务器上的用户添加了这些权限 。(缺陷号 30339460)

  • 当使用 MySQL Clone 作为恢复方法时,尝试将不支持的实例添加 RESTART到集群会导致 MySQL Shell 意外停止。现在,在这种情况下,一条消息说明 Cluster.rescan() 必须使用它来确保将实例添加到元数据中。(缺陷号 30281908)

  • 和系统变量是会话设置autocommitsql_mode但它们可以全局设置为不同的值。如果这些变量以多种不同方式具有非默认值,则 AdminAPI 会失败,例如 DML 失败、无法设置系统变量等。(错误#30202883,错误#30324461)

  • 尝试针对已修改或删除集群管理用户的 InnoDB 集群引导 MySQL 路由器失败。这是由对 InnoDB Cluster 元数据表授予的权限引起的。推荐的解决方案是升级到元数据 2.0,这会更改元数据的权限以确保不会发生此问题。请参阅 升级 InnoDB 集群。(缺陷号 29868432)

  • 创建多主集群时, group_replication_enforce_update_everywhere_checks 不会自动设置系统变量。但是,切换到多主模式会自动启用 group_replication_enforce_update_everywhere_checks 并切换到单主模式会禁用它。现在,该 dba.createCluster()操作将 group_replication_enforce_update_everywhere_checks 变量设置为适合单主或多主集群。(漏洞#29794779)

  • 在 8.0.16 版本中,autoRejoinTries添加了用于定义实例在被驱逐后尝试重新加入集群的次数的选项。该选项是一个有效的集群设置,可以像许多其他选项一样通过 AdminAPI 进行配置。但是,该autoRejoinTries 选项未被列出 Cluster.options()。(漏洞#29654346)

  • InnoDB Cluster 元数据现在支持最长 265 个字符的主机名,其中 255 个字符可以是主机部分,其余字符可以是端口号。(漏洞#29507913)

  • dba.createCluster()如果实例是用 innodb_default_row_format=COMPACT 或 启动的,则可能会失败innodb_default_row_format=REDUNDANT。这是因为没有ROW_FORMAT在 InnoDB Cluster 元数据表上指定,这导致它们使用 innodb_default_row_format. 元数据架构已更新为使用ROW_FORMAT = DYNAMIC. (漏洞 #28531271)

  • 当实例重新启动时,例如在完全中断后,它可能已super_read_only 被禁用。这意味着可以写入非主实例,导致实例不再同步。这可能会导致 dba.rebootClusterFromCompleteOutage()失败并出现Conflicting transaction sets 错误。该修复程序确保所有实例 super_read_only=1在属于集群时都已持久化,无论是通过SET PERSIST_ONLY,还是 dba.configureLocalInstance()对于不支持持久化的实例。(缺陷 #97279,缺陷 #30545872)

  • Cluster.status() 操作可能会报告错误get_uint(24):字段值超出允许范围,因为它始终期望某些字段的值为正值,而实际上这些字段可能具有负值。例如,当不同实例的时钟发生偏移时可能会发生这种情况。(缺陷 #95191,缺陷 #29705983)

  • 如果clusterAdmin 在创建集群后更改了用户名,则可能会遇到诸如The user specified as a definer does not exist 之类的错误。这是因为该 clusterAdmin用户被用作 DEFINERInnoDB Cluster 所需视图的用户,如果该用户被重命名,则定义者实际上丢失了。在 8.0.19 版本中,InnoDB Cluster 元数据已更改以避免此问题,用于 dba.upgradeMetadata()升级集群。请参阅升级 InnoDB 集群。使用 8.0.19 及更高版本部署的集群不会遇到此问题。(缺陷 #92128,缺陷 #28541069)

  • 由于对 InnoDB Cluster 元数据表的级联约束,无法创建多主集群。这已在 8.0.19 版中得到修复,因此要解决此问题,请使用 升级您的集群 dba.upgradeMetadata()。请参阅 升级 InnoDB 集群。(漏洞 #91972,漏洞 #29137199)

添加或更改的功能

  • MySQL Shell 中的 JavaScript 函数require()已得到改进,除了内置模块和 MySQL Shell 已知的模块搜索路径上的模块之外,还支持加载本地模块。如果您指定以 或 为前缀的模块名称或路径./../MySQL Shell 现在会在包含当前正在执行的 JavaScript 文件或模块的文件夹中搜索指定的模块,或者在交互模式下,在当前工作目录中搜索。如果在该文件夹中未找到该模块,MySQL Shell 将继续检查由 sys.path 变量指定的众所周知的模块搜索路径。

  • MySQL Shell 的升级检查器实用程序( util.checkForServerUpgrade()操作)包括以下新的和扩展的检查:

    • 该实用程序现在标记所有默认值为零的datedatetimetimestamp列,并说明 SQL 模式(全局或当前会话)是否允许为这些列类型插入零值。默认情况下,这些在 MySQL 中不再被允许,强烈建议用有效值替换零值,因为它们将来可能无法正常工作。

    • 检查已删除函数的使用情况现在包括该 PASSWORD()函数。

    • 该实用程序现在检查 识别的任何孤立表InnoDB,但 SQL 层认为它们由不同的存储引擎处理。如果在数据目录中进行手动更新,就会发生这种情况。如果存在孤立表,则可能会使升级过程停止。

  • 在 MySQL Shell 的交互模式下,对于 JavaScript、Python 或 SQL,\source命令或其别名 \.可用于从给定路径的脚本文件中执行代码。为了与 mysql客户端兼容,仅在 SQL 模式下,您现在可以使用 source不带反斜杠和可选 SQL 定界符的命令从脚本文件执行代码。source既可以用于 MySQL Shell 的 SQL 交互模式,直接执行脚本,也可以用于批处理模式处理的 SQL 代码文件,从文件中执行进一步的脚本。仅在 SQL 模式下,您现在还可以使用\source 命令的别名\.(不使用 SQL 定界符)在以批处理模式处理的 SQL 代码文件中。因此,在 SQL 模式下使用 MySQL Shell,您现在/tmp/mydata.sql可以使用以下三个命令中的任何一个以交互模式或批处理模式执行文件中的脚本:

            source /tmp/mydata.sql; 
            source /tmp/mydata.sql 
            \. /tmp/mydata.sql  

    该命令\source /tmp/mydata.sql也有效,但仅在交互模式下有效。

修正错误

  • 在平台的标准全局配置路径(在 %PROGRAMDATA%\MySQL\mysqlshWindows 上的文件夹中,或 /etc/mysql/mysqlsh/在 Unix 上)搜索启动脚本时,MySQL Shell 检查的是错误的脚本名称 shellrc,而不是正确的名称 mysqlshrc。(缺陷号 30656548)

  • 在 Windows 上,MySQL Shell 将 UTF-8 编码的字符串传递给 NTFS 文件系统,该文件系统以 UTF-16 编码存储文件名。当使用非 ASCII 字符时,不匹配导致文件和文件夹被错误命名或定位。MySQL Shell 现在将 NTFS 操作中使用的所有字符串从 UTF-8 转换为 UTF-16,并将从 Windows API 调用的 Unicode 函数版本接收的所有字符串转换回 UTF-8。(缺陷号 30538516)

  • 运行 MySQL Shell 的升级检查器实用程序时提供的连接数据中的某些主机名未正确解析 checkForServerUpgrade(),包括通过指定 IP 地址和子网掩码设置用户帐户主机名的位置。(错误#30536355、错误#30696901、错误#98056)

  • 如果 MySQL 服务器环境变量 MYSQL_UNIX_PORT(它指定默认的 Unix 套接字文件)由相同的进程更新,然后用于使用套接字文件创建到 MySQL 服务器的 MySQL Shell 连接,则 MySQL Shell 使用套接字文件路径缓存和连接之前已设置,但报告已使用更新的套接字文件路径建立了连接。现在显示用于连接的正确套接字文件。(缺陷号 30533318)

  • 如果用于自定义 MySQL Shell 提示的提示主题文件包含格式错误的 UTF-8 序列,则在启动时会显示一条错误消息来代替提示文本。MySQL Shell 现在在加载之前验证提示主题文件,如果有问题,则使用默认提示代替并发出错误消息。(缺陷号 30406283)

  • 如果 MySQL Shell 安装在 Microsoft Windows 上的非默认位置,并随后被卸载,则不会删除 MySQL Shell 使用的 Python 库在安装后创建的文件。当从任何位置卸载 MySQL Shell 时,这些文件现在被删除。(缺陷号 30333801)

  • 以前,大多数需要整数值的 MySQL Shell 选项可以设置为空值,在这种情况下应用值 1。例外是logLevel 选项,它需要一个值。该行为现已标准化,因此所有需要非字符串值的 MySQL Shell 选项都必须指定一个值,但在命令行上设置的选项除外。受影响的选项是dba.gtidWaitTimeoutdba.logSqlhistory.maxSizeverbose。(缺陷号 30320839)

  • 在交互模式下使用 MySQL Shell 时,在多行 JavaScript 语句中使用模板文字会导致错误。该问题现已解决。(缺陷号 30248651)

  • 在Python模式下,当多条语句同时输入MySQL Shell以交互方式执行时,只有第一条语句被正确执行。(缺陷号 30029568)

  • 已更正 MySQL Shell 的 Debian 控制文件,以删除未定义某些变量时发生的打包错误。感谢 Evgeniy Patlan 的修复。(缺陷 #29802600,缺陷 #95158)

  • 在 MySQL Shell 的类 URI 连接字符串解析器中,路径分隔符的处理以前依赖于平台。现在引入了统一解析,可以在Unix平台上正确解析Windows命名管道,在Windows平台上也可以正确解析Unix套接字文件。(漏洞#29456981)

  • MySQL Shell 现在通过获取所提供地址的完全限定域名并使用该名称的绝对形式(带尾随点)来查找主机名。此方法避免了某些网络配置导致的潜在问题,这些网络配置将主机名解析为环回地址,而实际上它们可以从外部寻址。(漏洞#27704559)