Documentation Home
MySQL Shell 8.0 发行说明  /  MySQL Shell 8.0.27 的变化(2021-10-19,全面上市)

MySQL Shell 8.0.27 的变化(2021-10-19,全面上市)

弃用和移除说明

  • AdminAPI dba.rebootClusterFromCompleteOutage() 用于指定用户和密码以运行所需任务的操作选项现已弃用,不应再使用。用户名和密码取自活动的 MySQL Shell 会话。(漏洞#26586818)

修复了 AdminAPI 错误

  • 当 MySQL Shell 设置为返回 JSON 输出时,MySQL Shell 对 InnoDB Cluster 操作的进度报告可能会导致生成非 JSON 输出。该问题现已得到纠正。(缺陷号 33237648)

  • 针对特定目标实例问题的 InnoDB Cluster 错误消息现在包括受影响实例的主机名和端口,以便在操作涉及多个实例时可以识别它。(漏洞#28365584)

  • AdminAPI 的dba.stopSandboxInstance() 操作尝试验证 PID 文件是否存在以用于日志记录,但如果未找到该文件,操作将停止。该操作现在在没有文件的情况下继续进行,并使用沙箱端口提供日志记录信息。(缺陷号 25096293)

添加或更改的功能

  • MySQL InnoDB ClusterSet 是一种新的解决方案,它通过将主 InnoDB 集群与其在备用位置(例如不同数据中心)中的一个或多个副本链接起来,为 MySQL InnoDB 集群部署提供容灾能力。InnoDB ClusterSet 使用专用的 ClusterSet 复制通道自动管理从主集群到副本集群的复制。如果主集群由于数据中心丢失或与它的网络连接丢失而变得不可用,您可以激活副本集群来恢复服务的可用性。

    InnoDB ClusterSet 部署中主 InnoDB 集群和副本集群之间的紧急故障转移可以由管理员通过 MySQL Shell 使用 AdminAPI 触发,AdminAPI 包含在 MySQL Shell 中。您还可以在主集群仍然可用时执行主动控制切换,例如,如果需要对主集群进行配置更改或维护。MySQL Router 自动将客户端应用程序路由到 InnoDB ClusterSet 部署中的正确集群。

  • MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()和表转储实用程序 util.dumpTables()现在自动检测转储中的分区表,并将每个分区的分块和转储并行化为一个独立的表。转储中的数据文件以 schema@table@partition. MySQL Shell 的转储加载实用程序util.loadDump()然后为每个分区的块安排加载,就好像它们属于不同的表一样,从而提高并行化和性能。

    使用 MySQL Shell 8.0.27 以后的实用程序创建的转储无法由 8.0.27 之前的 MySQL Shell 版本加载,因为元数据中的不兼容更改管理未来添加的功能,这些功能不受旧版本实用程序的支持,这是一种功能此版本中还引入了列表,它记录了创建转储时实际使用的功能。从 MySQL Shell 8.0.27 开始,转储加载实用程序会检查列表并在发现它不支持的功能时报告错误。在未来的版本中,功能列表将允许您尝试使用旧版本的 MySQL Shell 进行转储加载并尽可能成功。

  • Oracle Cloud Infrastructure 对象存储现在支持使用单个预验证请求 (PAR) 访问存储桶中的所有对象或具有特定前缀的存储桶中的对象。MySQL Shell 的转储加载实用程序 util.loadDump()增加了对这种类型 PAR 的支持。以前使用为 MySQL Shell 转储清单文件创建的 PAR 的方法需要为转储中的每个项目生成一个 PAR,这在导出大型数据集时非常耗时。此方法还需要在 PAR 过期时重新创建转储。使用存储桶和前缀 PAR 时,只需重新创建 PAR,而不是整个转储。

    随着对 bucket 和前缀 PAR 的支持的引入,MySQL Shell 转储实用程序的ociParManifest 选项之前设置为启用 true该选项并指定(为了生成 MySQL Shell 转储清单文件,其中每个文件都有一个 PAR)转储),现在默认设置为 false,只有在明确 设置时才启用。ocimdsosBucketNametrue

  • maxBytesPerTransaction为与 MySQL Shell 转储加载实用程序一起使用而引入 的新选项util.loadDump()定义了可以在单个 LOAD DATA语句中从数据文件加载的最大字节数。如果数据文件超过maxBytesPerTransaction大小,多个LOAD DATA语句会以小于或等于该 maxBytesPerTransaction值的块的形式从文件中加载数据。group_replication_transaction_size_limit 此选项的预期用途是当数据文件对于目标服务器的限制(例如服务器或max_binlog_cache_size 设置定义的限制)来说太大时,以较小的块加载数据 。有关详细信息,请参阅 转储加载实用程序

  • MySQL Shell 现在完全支持经典 MySQL 协议连接的 LDAP 身份验证方法和 Kerberos 身份验证。以前,这些身份验证方法所需的一些客户端插件在使用 MySQL Shell 时不可用,它使用 MySQL 客户端库对经典 MySQL 协议连接进行客户端身份验证。此外,对于 Kerberos 身份验证,MySQL Shell 无法利用缓存的票证授予票证 (TGT),从而消除了身份验证过程中对用户名和密码的需求。这是因为 MySQL Shell 自动提供系统用户名、提示输入密码或使用 Secret Store Helper 提供密码,

    新的持久 shell.options.mysqlPluginDir设置和非持久命令行选项 --mysql-plugin-dir可用于指定未内置到libmysqlclient客户端库中的客户端身份验证插件的路径,包括authentication_ldap_sasl_clientauthentication_kerberos_client。这些插件需要支持基于 SASL 的 LDAP 身份验证和 Kerberos 身份验证。

    --auth-method命令选项用于指定mysql_clear_password简单 LDAP 身份验证所需的插件时,MySQL Shell 现在启用并使用该插件。此客户端插件内置于 MySQL 客户端库中,但出于安全考虑,默认情况下未启用。此身份验证类型仅适用于使用 SSL 或套接字的安全连接。

    --auth-method当该选项用于指定 authentication_ldap_sasl_clientauthentication_kerberos_client插件 时,支持用于 Kerberos 身份验证的缓存 TGT 。当为连接设置这些选项之一时,如果用户名丢失,MySQL Shell 不会提供系统用户名,不会提示输入密码,也不会尝试使用 Secret Store 助手来检索或存储凭据。

修正错误

  • 不兼容的更改: 为了管理旧版本实用程序不支持的新增功能,MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()、表转储实用程序 util.dumpTables()和转储加载实用程序 util.loadDump()现在将功能列表写入元数据文件以进行转储. 如果在创建转储时使用了某个功能,则会将其写入功能列表,否则将被忽略。dump loading 实用程序检查功能列表,如果找到功能则报告错误。此版本中引入的分区感知是与此功能管理功能兼容的第一个功能。

    由于此更改,旧版本的 MySQL Shell 无法读取 MySQL Shell 8.0.27 及更高版本的转储实用程序生成的元数据,这意味着它们无法导入使用更高版本制作的转储。(缺陷号 33063035)

  • 为了提高 MySQL Shell 嵌入其他应用程序时的集成能力,添加了一种新的 JSON shell 模式,可以通过定义 MYSQLSH_JSON_SHELL环境变量来激活。在此模式下,MySQL Shell 接受以下格式为 JSON 文档的命令:

    • {"execute":json-string}

      在活动的 MySQL Shell 模式(JavaScript、Python 或 SQL)中执行给定的代码。代码作为一个完整的单元执行,不完整则返回错误。

    • {"command":json-string}

      执行给定的 MySQL Shell 命令。

    • {"complete":{"data":json-string[, "offset": uint}}

      根据给定的数据和当前的 MySQL Shell 上下文确定自动完成的选项。

    此外,还修复了在 MySQL Shell 的 JSON 模式下输出时将引号错误地添加到字符串值的问题。(缺陷号 33310170)

  • 当 MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()、表转储实用程序 util.dumpTables()和转储加载实用程序 util.loadDump()与 Oracle 云基础设施对象存储桶交互时,微小的时钟变化可能导致与授权标头的日期相关的 HTTP 401 错误。这是由于实用程序在重试请求时重用标头引起的。这些实用程序现在会定期刷新请求的标头,并在出现此特定错误时自动重新发送请求。(缺陷号 33271037)

  • 当 MySQL Shell 的命令行选项 --file用于指定要处理的文件时,文件名后的参数现在以交互模式和批处理模式传递给脚本。(缺陷号 33235685)

  • MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()和表转储实用程序 util.dumpTables()在尝试分块列名包含逗号字符的表时返回错误。该问题现已解决。(缺陷号 33232480)

  • MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()、表转储实用程序 util.dumpTables()和转储加载实用程序 的进度检查器util.loadDump()不检查为 MySQL Shell 设置的输出格式。结果,选择JSON模式输出并showProgress: true为实用程序设置了选项时,产生了一些非JSON输出。(缺陷号 33223635)

  • waitDumpTimeoutMySQL Shell 的转储加载实用程序 的选项值util.loadDump()未正确验证,可以使用负值。(缺陷号 33212873)

  • 使用该ociParManifest选项时,MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()和表转储实用程序 util.dumpTables()现在会显示创建 PAR 和编写清单文件的过程的进度信息或开始和结束消息。(缺陷号 33181308)

  • 当 MySQL Shell 使用 Python 3.8 或更高版本构建时,将区域设置设置为用户的首选项,MySQL Shell 提示符中的 Unicode 字符在 Windows 上无法正确显示。(缺陷号 33174999)

  • 由于FLUSH TABLES WITH READ LOCK语句的不同权限要求,MySQL Shell 的实例转储实用程序util.dumpInstance()、模式转储实用程序util.dumpSchemas()和表转储实用程序util.dumpTables()并不总是正确地识别语句何时会成功。如果该语句失败,则取消转储而不是回退到使用LOCK TABLES语句。现在,如果FLUSH TABLES WITH READ LOCK 语句因访问被拒绝而失败,LOCK TABLES则使用语句代替。该FLUSH TABLES WITH READ LOCK语句首先尝试使空运行与实际运行保持一致,但它设置了一个小超时并在获取后立即释放锁。(缺陷号 33173739)

  • MYSQLSH_USER_CONFIG_HOME环境变量用于设置自定义 MySQL Shell 配置路径时,prompt.json如果未附加路径分隔符,则文件路径构建不正确。路径构建已更正为在需要时附加分隔符。(缺陷号 33164726)

  • 当为 MySQL Shell 的实例转储实用程序、模式转储实用程序 和表转储实用程序 ocimds启用该选项 时,这些实用程序现在会标记对模式中对象的显式授权,这些对象 无法导入到 MySQL 数据库服务实例中。该选项的 修改现在删除了此类授权。(缺陷号 33162928)util.dumpInstance()util.dumpSchemas()util.dumpTables()mysqlcompatibilitystrip_restricted_grants

  • 当该ocimds选项与 MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()或表转储实用程序 一起使用util.dumpTables()以启用检查和修改以与 MySQL 数据库服务兼容时,这些实用程序现在会对每个表中的列数进行额外检查。如果表超过InnoDB 1017 列的限制,这将被报告为需要手动修复的问题。(缺陷号 33159903)

  • 当 MySQL Shell 的转储加载实用程序 util.loadDump()用于从预验证请求 (PAR) URL 加载转储时,如果 URL 无效,该实用程序不会将其识别为尝试的 PAR,并且生成的错误消息不提供信息。该实用程序现在可以识别无效的 PAR 并返回包含预期 URL 格式的错误消息。PAR URL 本身被替换为secret错误消息和日志中的单词。(缺陷号 33155373)

  • MySQL Shell 的转储加载实用程序 util.loadDump()在下载使用 zstd 压缩编写的数据文件时使用了一个小的输入缓冲区。这会降低非本地文件的性能,因为每个请求都是单独发出的。缓冲区大小现已增加。(缺陷号 33150332)

  • 当 MySQL 用户帐户名称包含网络掩码作为主机值的一部分时,MySQL Shell 的转储加载实用程序 util.loadDump()在初始化加载操作时无法正确处理此问题。因此,无法使用具有网络掩码的用户帐户来运行该实用程序。该问题现已解决。(错误#33144419,错误#104375)

  • MySQL Shell 的转储加载实用程序 util.loadDump()现在在加载语句后为用户设置默认角色GRANT,以确保已创建所有角色并已授予适当的授权。(错误#33128803,错误#104339)

  • MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()和表转储实用程序 使用的一些查询util.dumpTables()依赖于服务器版本,包括使用EXPLAIN SELECT分块和识别角色支持。这些实用程序现在可以在不参考服务器版本的情况下进行相关检查。(缺陷号 33103480)

  • 在 Unix 系统上,SIGINT 信号在从 MySQL Shell 外部发送时不会中断提示或密码提示。MySQL Shell 现在可以一致地处理信号。(缺陷号 33096667)

  • 数据类型映射问题意味着 MySQL Shell 的 Python 插件无法使用 检索多列的列类型column.get_type()。(缺陷号 33084551)

  • strip_definers兼容性要求应用于 MySQL Shell 的实例转储实用程序util.dumpInstance()、模式转储实用程序util.dumpSchemas()和表转储实用程序转储的表时,视图和例程util.dumpTables()SQL SECURITY子句更改为指定INVOKER而不是 DEFINER。如果存储的例程只包含一个简单的语句,则该子句被插入到错误的位置,导致无法加载转储。在某些情况下,该条款也被错误地省略了。这些问题现已得到纠正,此外,缺少SQL SECURITY视图或例程的子句现在作为兼容性问题单独报告。(错误#33079172,错误#33087120)

  • 如果模式匹配使用通配符前缀,MySQL Shell 的帮助搜索功能会产生重复的主题结果。(缺陷号 33060756)

  • 当用户定义的 MySQL Shell Python 插件使用 @plugin_function()装饰器时,字典条目的必需属性被覆盖为 false. 该问题现已解决。(缺陷号 33026024)

  • 与 MySQL Shell 8.0.26 捆绑在一起的 Python 3.9.5 缺少 Paramiko 和适用于 Python 的 Oracle Cloud Infrastructure SDK 所需的库。(缺陷号 32985104)

  • 改进了 MySQL Shell 实例转储实用程序的信息收集阶段,util.dumpInstance()以减少从源服务器识别和获取元数据所需的时间。检索元数据的过滤查询现在仅限于用户特别请求的过滤,以缩短响应时间。去掉了一些不必要的调用和请求,增加了线程和连接保活功能。作为更改的结果,EXECUTE当转储中的视图调用函数来获取其数据时,不再需要该权限。(缺陷号 32969290)

  • util.dumpInstance()改进了 MySQL Shell 的实例转储实用程序、模式转储实用程序 util.dumpSchemas()和表转储实用程序 的进度报告和最终摘要报告 util.dumpTables()。最终的总结报告现在显示了带和不带准备步骤的转储的持续时间,这在以前是从时间中排除的。进度报告包括额外的步骤,状态消息现在作为信息性消息记录到 MySQL Shell 应用程序日志文件,而不是打印到控制台。计算吞吐量的错误已得到修复。(缺陷号 32969287)

  • MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()、表转储实用程序 util.dumpTables()和转储加载实用程序 util.loadDump()现在记录导致返回错误的任何 SQL 语句,并记录错误。(缺陷号 32966510)

  • MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()和表转储实用程序 的分块算法中的错误假设util.dumpTables()意味着如果单个表行超过 bytesPerChunk选项指定的大小,因此应该在它自己的块文件中,其他行也可能写入文件。该算法现已更正。(缺陷号 32955616)

  • util.dumpInstance()当 MySQL Shell 的实例转储实用程序、模式转储实用程序util.dumpSchemas()和表转储实用程序 的一致选项设置为 false 时,util.dumpTables()在进行转储时不会锁定实例以进行备份。这些实用程序现在检查在gtid_executed转储过程开始和结束时设置的 GTID,如果它们不同则发出警告。(缺陷号 32954757)

  • util.loadDump()当对现有视图引用的表执行 DDL 时, MySQL Shell 的转储加载实用程序 可能会在慢速服务器上因死锁错误而停止。以前,该操作最多重试 20 次,中间有 200 毫秒的延迟。现在,每次尝试后延迟加倍,实用程序重试最多五分钟。(缺陷号 32928528)

  • MySQL Shell 的实例转储实用程序、模式转储实用程序、表转储实用程序和转储加载实用程序的选项 的帮助和文档 excludeUsers错误 地指出没有主机指定的用户名等同于。实际上,所有具有该用户名的用户帐户都被排除在外。MySQL Shell 现在还排除了某些应该始终排除的帐户,即使它们没有使用该 选项指定。(缺陷号 32799076)includeUsersutil.dumpInstance()util.dumpSchemas()util.dumpTables()util.loadDump()'user_name'@'%'excludeUsers

  • 如果内容超出服务器的设置, MySQL Shell 的并行表导入实用程序 util.importTable()无法导入压缩的输入文件 。max_binlog_cache_size如果在尝试导入文件时 收到错误“MySQL 错误 1197 (HY000):多语句事务需要超过‘max_binlog_cache_size’字节的存储空间”maxBytesPerTransaction ,请将实用程序的新选项设置为小于或等于服务器实例的值 max_binlog_cache_size环境。该实用程序将使用的最小值为 4096 字节。设置该选项后,该实用程序使用多个LOAD DATA 请求适合指定缓存大小的大块输入文件的语句。未设置该选项时,压缩的输入文件将加载到单个块中。(缺陷号 32575351)

  • MySQL Shell 的转储加载实用程序 util.loadDump()现在在进度文件中包含目标服务器实例的 UUID。如果加载操作停止并恢复,实用程序会检查保存的 UUID 是否与当前目标服务器的 UUID 匹配,如果不匹配则返回错误并停止操作。此检查可确保在因复制命令运行实用程序而意外使用错误进度文件的情况下返回有意义的错误。(缺陷号 32561035)

  • MySQL Shell 的插件处理假定包使用 Egg 打包格式,导致定位和加载模块时出错。现在在处理模块路径时考虑 Wheel 包装格式。(缺陷号 32451772)

  • 当用户使用套接字连接到服务器时 , MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()和表转储实用程序 失败,除非还指定了该选项。这些实用程序在转储 DDL 文件的注释中包含对主机的描述,并错误地认为这将出现在连接选项数据中。如果未指定该选项,主机现在设置为 用于注释 。(缺陷 #32109967,缺陷 #101439)util.dumpTables()--hostlocalhost--host

  • 在扫描元数据文件以查找从 Oracle Cloud Infrastructure 对象存储桶加载的转储时, MySQL Shell 的转储加载实用程序 util.loadDump()未提供进度更新。对于大型转储,进展似乎停滞不前。该实用程序现在报告此阶段的进度,并将每个操作的时间戳存储在进度日志中。还进行了许多性能改进,包括多线程扫描和后台线程池的使用。线程池的大小可以使用新backgroundThreads选项设置,默认为threads从本地服务器加载的转储选项的值,或者四倍的值threads从非本地服务器加载的转储选项。(缺陷号 31645798)

  • 添加了一个新的命令行选项--log-file,允许您更改 MySQL Shell 应用程序日志文件mysqlsh.log的默认位置。默认位置是用户配置路径, %APPDATA%\MySQL\mysqlsh\在 Windows 或 ~/.mysqlsh/Unix 上。以前可以通过定义环境变量来覆盖用户配置路径 MYSQLSH_USER_CONFIG_HOME,但现在该 --log-file选项允许您在启动单个 MySQL Shell 实例时从命令行执行此操作,以便不同的实例可以写入不同的位置。(漏洞 #27253110)

  • 在 MySQL Shell 的 Python 模式下交互输入的注释不包含在 MySQL Shell 历史记录中,尽管 JavaScript 注释包含在内。现在两者都包括在内。(漏洞#26484975)

  • 当 MySQL Shell 的命令行选项 --dba=enableXProtocol用于在与 MySQL 5.7 服务器的连接上安装和启用 X 插件时,该过程验证安装命令没有返回任何错误,但没有验证插件是否已正确安装并接受适当的连接类型。MySQL Shell 现在会在向用户返回响应之前验证插件状态,以便他们可以查看插件现在是否可用。(缺陷 #24554967,缺陷 #82759)

  • 在没有 Python 支持的情况下进行编译会导致致命错误。这是由编译过程中包含的 Python 测试文件引起的。(错误#101923,错误#32256576)