Documentation Home
MySQL Shell 8.0 发行说明  /  MySQL Shell 8.0.17 的变化(2019-07-22,全面上市)

MySQL Shell 8.0.17 的变化(2019-07-22,全面上市)

AdminAPI 添加或更改的功能

  • 重要更改: InnoDB Cluster 创建的内部恢复帐户的处理已更改,因此默认情况下帐户始终创建为 mysql_innodb_cluster_ server_id@%,其中server_id是特定于实例的。这个生成的恢复帐户名称存储在 InnoDB 集群元数据中,以确保在从集群中删除实例时始终删除正确的帐户。

    如果给出,将创建多个帐户的先前行为ipWhitelist已被删除。此外 Cluster.removeInstance() ,不再删除正在删除的实例上的所有恢复帐户。现在,它会删除在主实例上删除的实例的恢复帐户,并在实际从组中删除实例之前等待更改被复制。同样, Cluster.rejoinInstance() 不再丢弃任何恢复帐户。如果它不再存在于主要实例(在正常情况下应该存在),它只会创建正在重新加入的实例的恢复帐户。如果恢复帐户已经存在,它会被重用 Cluster.rejoinInstance()

    从现有的组复制部署中采用集群时,会为每个成员创建和设置新的恢复帐户。用户配置的预先存在的帐户保持不变并且不会被删除,除非它们具有 mysql_innodb_cluster_前缀。

    作为这项工作的一部分, dba.createCluster()Cluster.rebootClusterFromCompleteOutage() 操作的行为已经改变。现在,如果这些操作遇到具有 的实例 super_read_only=ON,它会自动禁用。因此 clearReadOnly,这些操作已弃用该选项。

    参考资料:另请参阅:Bug #29629121、Bug #29559303。

  • dba.createCluster()操作已得到改进,作为这项工作的一部分,操作的某些步骤的执行顺序已更改 。现在,恢复(复制)用户的创建和对元数据的更新是在引导组复制组之后执行的。作为这项工作的一部分,该dba.createCluster() 操作已更新为支持该 interactive选项,该选项是一个控制提供的向导的布尔值。当 interactive为真时,操作会显示提示和确认。的默认值interactive等于 useWizards选项。

  • Group Replication 为组中的成员版本实施的兼容性策略现在考虑成员的 MySQL Server 版本的补丁版本。以前,在组合运行不同 MySQL 版本的实例时,只会考虑主要版本。InnoDB Cluster 已更新以支持这些兼容性策略有影响的集群操作。使用补丁版本可确保在组重新配置和升级过程中为混合版本组提供更好的复制安全性。作为这项工作的一部分,提供的有关实例的信息已得到扩展。

    已进行以下 InnoDB Cluster 更改以支持兼容性策略:

    • Cluster.addInstance() 操作现在检测到由于 MySQL 版本导致的不兼容,并且在不兼容的情况下会中止并显示信息性错误。

    • Cluster.status() 属性mode现在考虑群集的值 super_read_only以及群集是否具有法定人数。

    • Cluster.status() 输出现在包含布尔属性 , 该 属性autoRejoinRunning按属于集群的实例显示,并且在运行自动重新加入时为真。

    • extended选项已更改为接受整数或布尔值。这使得行为类似于该queryMembers选项,因此该选项现在已被弃用。

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

  • InnoDB Cluster 在运行 8.0.17 及更高版本的实例上支持新的 MySQL Clone 插件。当一个 InnoDB Cluster 配置为使用 MySQL Clone 时,加入集群的实例选择是使用 Group Replication 的分布式恢复还是 MySQL Clone 来恢复集群处理的事务。您可以选择配置此行为,例如强制克隆,它会替换任何已处理的事务。您还可以配置 Cluster.addInstance() 行为方式,让克隆操作在后台进行或在 MySQL Shell 中显示不同级别的进度。这使您能够以最有效的方式自动供应实例。此外,输出 Cluster.status() for members in RECOVERINGstate 已扩展为包括恢复进度信息,使您能够轻松监控恢复操作,无论它们是使用 MySQL 克隆还是分布式恢复。

修复了 AdminAPI 错误

  • 重要变化: 使用 AdminAPI 部署的沙箱不支持该 RESTART语句。现在,包装器脚本在循环中调用mysqld,以便有一个确保 RESTART支持的监视过程。(漏洞#29725222)

  • Cluster.addInstance() 操作未验证 server_id加入实例的 是否在所有集群成员中不是唯一的。尽管 unique 的使用server_id对于 Group Replication 的正常工作不是强制性的(因为所有内部复制通道都使用 --replicate-same-server-id=ON),但建议复制流中的所有实例都具有 unique server_id。现在,此建议是 InnoDB Cluster 的要求,当您使用该 Cluster.addInstance() 操作时,如果该操作server_id已被集群中的实例使用,则该操作将失败并出现错误。(漏洞 #29809560)

  • InnoDB 集群不支持配置了二进制日志过滤器的实例,但允许复制过滤器。现在,具有复制过滤器的实例也被阻止使用 InnoDB Cluster。(漏洞#29756457)

    参考资料:另请参阅:Bug #28064729、Bug #29361352。

  • 在运行版本 8.0.16 的实例上, Cluster.rejoinInstance() 当一个或多个集群成员处于 RECOVERING状态时操作失败,因为无法获取组复制通信协议。更具体地说, group_replication_get_communication_protocol() 函数失败是因为它只能在所有成员都是 的情况下执行ONLINE。现在,如果函数在重新加入实例时失败,则会显示警告,AdminAPI 会继续执行操作。

    从 MySQL 8.0.17 开始, group_replication_get_communication_protocol() 如果成员是 ,该函数不再发出错误 RECOVERING。(漏洞#29754915)

  • 在基于 Debian 的主机上,hostname 默认解析为 IP 地址 127.0.1.1,这与实际网络接口不匹配。这不受组复制的支持,这使得部署在此类主机上的沙箱无法使用,除非对配置文件进行手动更改。现在,由 MySQL Shell 创建的沙箱配置文件包含以下附加行:

    report_host = 127.0.0.1

    换句话说,该report_host 变量被设置为环回 IP 地址。这确保沙箱实例可以在基于 Debian 的主机上使用,而无需任何额外的手动更改。(缺陷号 29634828)

  • 如果二进制日志已从所有集群实例中清除, Cluster.checkInstanceState() 则无法检查实例的状态,从而导致错误的输出值。现在, Cluster.checkInstanceState() 验证GTID_PURGED所有集群实例的值并提供正确的输出以及一条信息性消息,提及可能采取的操作。此外, Cluster.addInstance()Cluster.rejoinInstance() 没有使用执行的检查 Cluster.checkInstanceState() 来验证目标实例相对于集群的 GTID 状态。如果所有集群实例的二进制日志都被清除,则 Cluster.addInstance() 命令会成功,但实例将永远无法加入集群,因为分布式恢复无法执行。现在,这两个操作都使用由执行的检查 Cluster.checkInstanceState() 并提供信息性错误消息。(错误#29630591,错误#29790569)

  • 在交互模式下使用该dba.configureLocalInstance() 操作时,如果您提供了选项文件的路径,它将被忽略。(漏洞 #29554251)

  • 调用cluster.removeInstance()一个不存在的实例,例如由于拼写错误或因为它已经被删除,导致提示询问是否应该删除该实例,然后操作失败。(漏洞 #29540529)

  • 要将实例添加或重新加入现有的 InnoDB Cluster,该实例不得已作为异步复制中的副本运行。以前, dba.checkInstanceConfiguration()错误地将作为副本运行的目标实例报告为对 InnoDB Cluster 使用有效。因此,尝试使用已通过诸如此类的操作错误验证的实例在 Cluster.addInstance() 没有信息性错误的情况下失败。

    现在,dba.checkInstanceConfiguration() 验证目标实例是否已配置为副本,如果是,则生成警告。同样, Cluster.addInstance()Cluster.rejoinInstance() 操作检测到此类实例并阻止它们使用 InnoDB Cluster,并因错误而失败。请注意,这不会阻止属于集群的实例也作为异步复制中的源运行。(漏洞 #29305551)

  • dba.createCluster()当实例已经在该元数据中时,允许在已填充元数据架构的目标实例上执行 该操作。目标实例上存在的元数据被覆盖,这是意外的。现在,在这种情况下 dba.createCluster()会抛出异常,您可以选择删除元数据模式或重启集群。(缺陷号 29271400)

  • 当使用 MySQL Shell 从 MySQL Shell 成功启动 MySQL 的沙箱实例时 ,在同一控制台窗口中dba.startSandboxInstance()Ctrl+C会终止沙箱实例。沙箱实例现在在新的进程组中启动,因此它们不受中断的影响。(缺陷号 29270460)

  • 在使用 AdminAPI 创建集群期间,会创建一些内部复制用户,其用户名以mysql_innodb_cluster开头。但是,如果 MySQL 服务器定义了全局密码过期策略,例如 default_password_lifetime设置为非零值,则内部用户的密码在达到指定期限后过期。现在,内部用户帐户由 AdminAPI 创建,密码过期已禁用。(漏洞#28855764)

  • dba.checkInstanceConfiguration()和 操作未检查持久配置的有效性, 这些dba.configureInstance()配置可能与相应的系统变量值不同,特别是在使用 更改时SET PERSIST_ONLY。这可能导致这些操作报告错误或不准确的结果,例如报告实例配置正确,而实际上持久化配置无效并且在服务器重新启动后可能应用错误的设置,或者不准确地报告服务器更新已完成当只需要重新启动时需要。(漏洞#28727505)

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

  • 当您从集群中删除实例的元数据而不从实例本身中删除元数据时(例如,由于身份验证错误或实例无法访问),无法将实例再次添加到集群中。现在,添加了另一个验证 Cluster.addInstance() 来验证实例是否已经属于集群的底层组但不在 InnoDB 集群元数据中,如果它已经属于 ReplicaSet 则发出错误。同样,当为本地地址自动设置的默认端口无效(超出范围)而不是使用随机端口时,会发出错误。(缺陷号 28056944)

  • 在交互模式下发布dba.configureInstance()时,在选择选项 2 为 InnoDB 集群创建一个新的管理员帐户,需要最少的授权后,无法为新用户输入密码。

添加或更改的功能

  • MySQL Shell 具有用于 X 协议会话的 SQL 查询执行的新功能,其工作方式与经典 MySQL 协议会话中的 SQL 查询执行功能相同。新函数Session.runSql()只能在 MySQL Shell 中用作 X 协议的替代方法, Session.sql()以创建独立于用于连接到 MySQL 服务器的协议的脚本。请注意,它Session.runSql()是 MySQL Shell 独有的,不是标准 X DevAPI 的一部分。作为此更改的一部分, ClassicSession.querySQL 查询执行函数(它是 的同义词 ClassicSession.runSQL())现已弃用。

    还为经典 MySQL 协议和 X 协议会话提供了一个新功能fetchOneObject(),以将下一个结果作为脚本对象返回。列名用作字典中的键(如果它们是有效标识符,则用作对象属性),行值用作字典中的属性值。此功能使查询结果能够在与协议无关的脚本中浏览和使用。对返回对象所做的更新不会持久保存在数据库中。

  • MySQL Shell 的新并行表导入实用程序为大型数据文件提供快速数据导入到 MySQL 关系表。该实用程序分析输入数据文件,将其分成块,然后使用并行连接将块上传到目标 MySQL 服务器。LOAD DATA该实用程序能够以比使用语句 的标准单线程上传快许多倍的速度完成大型数据导入。

    当您调用并行表导入实用程序时,您指定数据文件中的字段与 MySQL 表中的列之间的映射。LOAD DATA您可以为处理任意格式数据文件的命令设置字段和行处理选项。该实用程序的默认方言映射到使用具有该 SELECT ... INTO OUTFILE语句默认设置的语句创建的文件。该实用程序还具有映射到 CSV 文件(在 DOS 或 UNIX 系统上创建)、TSV 文件和 JSON 的标准数据格式的预设方言,您可以根据需要使用字段和行处理选项自定义这些。

  • MySQL Shell 有许多新的查询结果显示选项:

    • shell.dumpRows()函数可以将查询返回的结果集格式化为 MySQL Shell 支持的任何输出格式,并将其转储到控制台。请注意,结果集由函数使用。这个函数可以在 MySQL Shell 中使用,以与交互式 SQL 模式相同的方式向用户显示脚本运行的查询结果。

    • 新的 MySQL Shell 输出格式 json/array生成包装在 JSON 数组中的原始 JSON 输出。输出格式 ndjson作为 的同义词添加 json/raw,并且这两种输出格式都生成由换行符分隔的原始 JSON 输出。--result-format=[value]您可以通过使用命令行选项启动 MySQL Shell 或设置 MySQL Shell 配置选项来选择 MySQL Shell 输出格式resultFormat

    还添加了一个新函数shell.unparseUri(),它将 URI 组件和连接选项的字典转换为用于连接到 MySQL 的有效 URI 字符串。

  • 您现在可以使用在启动时加载的插件来扩展 MySQL Shell。MySQL Shell 插件可以用 JavaScript 或 Python 编写,它们包含的函数在 MySQL Shell 中以 JavaScript 和 Python 模式提供。这些插件可用于包含注册为 MySQL Shell 报告的函数,以及作为用户定义的 MySQL Shell 全局对象的一部分提供的扩展对象成员的函数。

    您可以通过将代码存储在 MySQL Shell 用户配置路径中文件夹的子文件夹中来创建 MySQL Shell 插件plugins,其中包含 MySQL Shell 在启动时定位并执行的初始化文件。您可以通过将多个插件的子文件夹放在文件夹下的包含文件夹中,来构建一个插件组,其中包含一组可以共享公共代码的相关插件 plugins

  • 您现在可以通过定义扩展对象并使它们作为附加 MySQL Shell 全局对象的一部分可用来扩展 MySQL Shell 的基本功能。扩展对象可以用 JavaScript 或 Python 编写。当您创建和注册一个扩展对象时,它在 JavaScript 和 Python 模式下的 MySQL Shell 中可用。您可以使用内置全局对象提供的函数构造和注册扩展对象shell

  • 您现在可以将 MySQL Shell 配置为将日志记录信息发送到控制台,以及将其发送到应用程序日志。--verbose命令行选项和 MySQL verboseShell 配置选项激活此功能。默认情况下,设置该选项后,内部错误、错误、警告和信息性消息将发送到控制台,这相当于应用程序日志的日志记录级别 5。您可以添加另外三个级别的调试消息,直到最详细级别。

  • MySQL Shell 的升级检查器实用程序( util.checkForServerUpgrade()操作)执行两项新检查。当检查从任何 MySQL 5.7 版本升级到任何 MySQL 8.0 版本时,该实用程序会识别使用 InnoDB 或 NDB 以外的存储引擎的分区表,因此依赖于不再提供的 MySQL 服务器的通用分区支持。当检查从任何版本升级到 MySQL 8.0.17 时,该实用程序会识别表空间数据文件路径中的循环目录引用,这不再被允许。

  • X DevAPI 现在支持索引数组字段。单个索引字段描述可以包含一个 array采用布尔值的新成员名称。如果设置为 true,则假定该字段包含给定类型的元素数组。此外,可能的索引字段数据类型集(用作索引字段描述中成员类型的值)用 type 扩展 ,其中长度 N 是强制性的。 CHAR(N)

  • MySQL Shell 现在支持发送连接属性(应用程序可以在连接时传递给服务器的键值对)的能力。MySQL Shell 定义了一组默认属性,可以禁用或启用。此外,除了默认属性之外,应用程序还可以指定要传递的属性。默认行为是发送默认属性集。

    您将连接属性指定为 connection-attributes连接字符串中的参数。connection-attributes 参数值必须为空(与指定相同 )true、一个Boolean值(truefalse启用或禁用默认属性集)或一个列表或零个或多个 key=value用逗号分隔的说明符(除了默认属性集外还要发送) . 在列表中,缺少键值的计算结果为空字符串。例子:

    "mysqlx://user@host?connection-attributes"
    "mysqlx://user@host?connection-attributes=true"
    "mysqlx://user@host?connection-attributes=false"
    "mysqlx://user@host?connection-attributes=[attr1=val1,attr2,attr3=]"
    "mysqlx://user@host?connection-attributes=[]"

    您可以为 X 协议连接和经典 MySQL 协议连接指定连接属性。MySQL Shell 设置的默认属性是:

    > \sql SELECT ATTR_NAME, ATTR_VALUE FROM performance_schema.session_account_connect_attrs;
    +-----------------+------------+
    | ATTR_NAME       | ATTR_VALUE |
    +-----------------+------------+
    | _pid            | 28451      |
    | _platform       | x86_64     |
    | _os             | Linux      |
    | _client_name    | libmysql   |
    | _client_version | 8.0.17     |
    | program_name    | mysqlsh    |
    +-----------------+------------+

    应用程序定义的属性名称不能以 开头, _因为此类名称是为内部属性保留的。

    如果未以有效方式指定连接属性,则会发生错误并且连接尝试失败。

    有关连接属性的一般信息,请参阅 性能模式连接属性表

  • MySQL Shell 现在支持JSON 数组或对象表达式 的OVERLAPS和 运算符:NOT OVERLAPS

    expr OVERLAPS expr
    expr NOT OVERLAPS expr

    这些运算符的行为方式与 JSON_OVERLAPS()函数类似。假设一个集合有这些内容:

    mysql-js> myCollection.add([{ "_id": "1", "list": [1, 4] }, { "_id": "2", "list": [4, 7] }])

    这个操作:

    mysql-js> var res = myCollection.find("[1, 2, 3] OVERLAPS $.list").fields("_id").execute();
    mysql-js> res

    应该返回:

    {
    "_id": "1"
    }
    1 document in set (0.0046 sec)

    这个操作:

    mysql-js> var res = myCollection.find("$.list OVERLAPS [4]").fields("_id").execute();
    mysql-js> res

    应该返回:

    {
    "_id": "1"
    }
    {
    "_id": "2"
    }
    2 documents in set (0.0031 sec)

    如果应用程序使用任一运算符而服务器不支持它,则会发生错误。

修正错误

  • 在 Python 模式下使用 MySQL Shell,在本机 MySQL Shell 对象上使用自动完成会导致有关未知属性的信息性消息写入应用程序日志文件。(漏洞 #29907200)

  • 通过仅在找到分隔符后才重新解析代码,减少了在多行模式下在 MySQL Shell 中发出的语句的执行时间。(缺陷号 29864587)

  • Python的sys.argv数组只在MySQL Shell以批处理方式启动时进行了初始化,而在MySQL Shell以交互方式启动时并没有进行初始化。(漏洞 #29811021)

  • MySQL Shell 错误地将CAST 操作编码为函数调用而不是二元运算符,从而导致 SQL 语法错误。(缺陷号 29807711)

  • MySQL Shell 现在支持 ->>JSON 的非引用提取运算符。(缺陷号 29794340)

  • 改进了 MySQL Shell 在批处理模式下处理的脚本中的空行处理。(漏洞#29771369)

  • 在Windows上,当使用该 \watch命令显示MySQL Shell报告时,按 Ctrl+C中断命令的执行直到该命令指定的刷新间隔结束后才生效。中断现在立即生效。此外,当按下 Ctrl+C\show时,使用或命令运行的报告执行的任何查询 \watch现在都会自动取消。(缺陷号 29707077)

  • 在 Python 模式下,MySQL Shell 创建的本机字典对象不会验证它们是否包含请求的键,这可能导致返回随机值或 SystemError 引发异常。现在添加了密钥验证, KeyError 如果请求的密钥无效,则会抛出异常。(漏洞 #29702627)

  • 在交互模式下使用 MySQL Shell 时,如果原始 JSON 输出是从终端以外的源(例如文件或管道)显示的,在某些情况下,提示显示在与输出的最后一行相同的行. 该问题现已得到纠正,如果输出的最后一行不是以 one 结尾,则会在提示消息之前打印一个新行。(缺陷号 29699640)

  • \sql在另一种语言处于活动状态时执行单个 SQL 语句 的 MySQL Shell命令现在支持\G语句分隔符以垂直打印结果集。(漏洞#29693853)

  • stdoutMySQL Shell 对输出的选择或输出 的一些不一致 stderr已得到纠正,因此只有打算由其他程序处理的预期输出会转到 stdout,所有信息性消息、警告和错误都会转到stderr。(缺陷号 29688637)

  • 当 MySQL Shell 以仅打印错误消息的选项启动时, 仍会打印--quiet-start=2有关升级检查器实用程序操作的警告消息。checkForServerUpgrade()(漏洞 #29620947)

  • 在 Python 模式下,MySQL Shell 创建的原生字典对象没有提供迭代器,因此无法对其进行迭代或使用in 关键字。现在添加了提供 Python 迭代器的功能。(漏洞 #29599261)

  • 当使用该 \watch命令显示 MySQL Shell 报告时,屏幕在重新运行报告之前被清除。对于执行缓慢查询的报表,这会导致空白屏幕显示很长时间。现在,就在报告生成其第一个文本输出之前清除屏幕。(漏洞#29593246)

  • MySQL Shell 的升级检查器实用程序 checkForServerUpgrade()为在配置文件中检测到的每个已删除系统变量返回不正确的错误文本。(漏洞 #29508599)

  • 当尝试处理从单个语句重复生成结果的存储过程的输出时,MySQL Shell 会挂起。这些问题现已得到纠正。(错误#29451154、错误#94577、错误#28880081、错误#93070)

  • 您现在可以 --json在启动 MySQL Shell 以使用升级检查器实用程序时指定命令行选项来激活 JSON 包装。在这种情况下,默认返回 JSON 输出,您可以通过指定--json=raw. 此外,与运行实用程序相关的警告和错误消息已从 JSON 输出中删除。(漏洞#29416162)

  • 在 SQL 模式下,当 MySQL Shell 配置为使用外部分页器工具显示输出时,无论查询结果是否有效,都会调用分页器。对于无效查询,这会导致寻呼机显示空白页面,并且错误消息仅在退出寻呼机后可见。现在仅当查询返回有效结果时才会调用分页工具,否则会显示错误消息。(缺陷 #29408598,缺陷 #94393)

  • ANSI_QUOTESMySQL Shell在解析引号字符时 没有考虑SQL 模式。(漏洞 #27959072)

  • 在 Windows 上创建的 MySQL Shell 的提示主题文件无法在其他平台上使用。该问题由解析器错误处理回车符引起,现已修复。(缺陷号 26597468)

  • 现在不允许在启动 MySQL Shell 时 使用mysqlsh命令行选项 --execute( -e) 后跟 --file( ),因为这些选项是相互排斥的。-f如果按该顺序指定选项,则会返回错误。请注意,如果--file首先指定,--execute则被视为已处理文件的参数,因此不会返回错误。(缺陷号 25686324)

  • 改进了 MySQL Shell 的 JavaScript 表达式解析器返回的语法错误,以提供上下文并阐明错误的位置。(漏洞#24916806)