Documentation Home
MySQL Shell 8.0 发行说明  /  MySQL Shell 8.0.4 的变化(2018-01-25,发布候选)

MySQL Shell 8.0.4 的变化(2018-01-25,发布候选)

弃用和移除说明

  • 命令行选项--classic--node--sqln--ssl被声明为已弃用,但实际上已被删除。MySQL Shell 现在再次处理这些选项,但在使用它们时会打印一条警告消息。弃用的选项作为它们的替换选项进行处理,如下所示:

    (漏洞 #27012385)

AdminAPI 添加或更改的功能

  • 当您创建集群或添加实例时,您现在可以覆盖默认组名、本地地址和组种子。这使得自定义集群变得更加容易。dba.createCluster()cluster.addInstance()命令 中添加了以下选项:

    • 使用groupNamewith dba.createCluster()设置集群的名称

    • 用于localAddress设置实例提供的与其他实例通信的地址

    • 用于groupSeeds设置实例加入集群时用作种子的实例

    有关更多信息,请参阅 自定义 InnoDB 集群成员服务器。(错误#26485254,错误#26838005)

  • 与 InnoDB 集群的连接已得到简化。现在,当您发出dba.getCluster()并且活动 Shell 会话不是与主服务器的连接时,将查询集群以获取主服务器信息并自动打开与主服务器的连接。这确保可以将配置更改写入元数据。作为此改进的一部分,您现在可以使用已添加的以下选项配置 MySQL Shell 连接到 InnoDB 集群的类型:

    此外还进行了以下更改:

    • dba.resetSession()方法已被删除。

    • 对象中添加了一个新disconnect()方法cluster,该方法关闭集群打开的所有内部会话。InnoDB Cluster 对断开连接的集群对象的操作会导致错误。

    • Cluster.status()方法的输出现在包含该 groupInformationSourceMember字段,该字段显示集群对象用于获取有关集群的信息的内部连接的 URI。

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

修复了 AdminAPI 错误

  • 除非会话帐户存在,否则帐户验证无法正常工作。现在,验证是使用服务器验证过的帐户完成的。(漏洞#26979375)

  • MySQL Shell 中用于处理 InnoDB 集群的 AdminAPI 仅支持与服务器实例的 TCP 连接。AdminAPI 现在会在开始需要访问数据库的操作之前检查 TCP 连接是否正在使用,而不是尝试使用其他连接类型进行操作但未成功。(缺陷号 26970629)

  • 如果您STOP GROUP REPLICATION在属于集群的实例上发布,则尝试将该实例重新加入集群失败,因为使用了错误的组复制种子。现在, 基于 集群中所有当前活动实例的Cluster.rejoinInstance()正确设置 。(漏洞#26861636)group_replication_group_seedsgroup_replication_local_address

  • 有时dba.addInstance()命令失败并出现错误,表明服务器 RECOVERING尽管处于状态但仍处于状态 ONLINE。此修复可确保返回正确的实例状态。(漏洞#26834542)

  • 如果运行 MySQL Shell 的用户对 AdminAPI 配置的选项文件没有写权限,则不会显示错误。(缺陷号 26830224)

  • 添加 WL#10470后,默认值server_id 已更改为 1。由于每个实例的服务器 ID 必须是唯一的,这导致 AdminAPI 出现问题。现在,具有的服务器实例server_id=1被正确识别为未正确配置以供 InnoDB 集群使用。(漏洞#26818744)

  • 除了 Python 2.7 之外,AdminAPI 现在还支持 Python 2.6,无需在 Oracle Linux 6 上手动安装。(缺陷号 26809748)

  • 使用 从集群中删除实例后 Cluster.removeInstance(),该实例在重新启动后静默重新加入 Group Replication 组。发生这种情况是因为 默认情况下group_replication_start_on_boot 设置为ON。现在,对于运行 MySQL 8.0.4 及更高版本的实例,选项文件中的修复设置 group_replication_start_on_bootOFF。对于运行 MySQL 8.0.4 之前版本的实例,会发出警告,告诉您手动编辑 group_replication_start_on_boot 实例的选项文件以避免该问题。(漏洞#26796118)

  • 由于使用的是 Python 版本,在需要 SSL 的 Windows 上使用 AdminAPI 命令会导致错误。(漏洞#26636911)

  • adoptFromGR通过将选项与命令一起 使用,从现有组复制部署创建 InnoDB 集群dba.createCluster()将失败,并出现错误,指出该实例已经是复制组的一部分。该问题仅出现在 MySQL Shell 默认向导模式中。该修复确保dba.createCluster() 命令的交互层允许使用该adoptFromGR 选项。(漏洞#26485316)

  • 创建和添加沙箱实例时生成的警告已得到改进。(缺陷号 26393614)

  • 使用具有 的实例时 require_secure_transport=ON,需要连接到实例的 AdminAPI 命令失败。(缺陷号 26248116)

  • Cluster.dissolve()命令试图停止在元数据中注册的所有实例上的组复制,如果这些实例中的任何一个不可联系,换句话说,状态将导致连接错误 (MISSING)ONLINE该修复程序确保仅停止可以联系的实例,换句话说,与 state 联系的实例 。(漏洞 #26001653)

  • 使用适当的 AdminAPI 操作将实例添加到 InnoDB Cluster 时,会执行检查以验证任何现有表的兼容性。如果检测到不兼容的表(例如使用MyISAM),则会发出错误。但是,错误消息指的是 AdminAPI 操作不可用的选项:--allow-non-compatible-tables。(缺陷号 25966731)

  • cluster.rejoinInstance()命令尝试重新加入一个实例,即使该实例已经是集群的一部分。现在,只MISSING 接受状态中的 实例cluster.rejoinInstance()。尝试重新加入处于任何其他状态的实例失败并出现错误。(漏洞 #87873,漏洞 #26870329)

  • 在 Unix 上,如果安装了 Python 3,则 AdminAPI 命令失败。(错误#87731,错误#26785584)

  • 使用 dba.checkInstanceConfiguration()and dba.configurelocalinstance()命令时,如果它有足够的权限来实际执行命令,则不会检查正在使用的帐户。此修复可确保该帐户在继续之前具有所需的权限。这还需要更改授予 clusterAdmin用户的权限。(漏洞 #87300,漏洞 #26609909)

添加或更改的功能

  • X DevAPI:功能中添加了 一个新patch()操作 modify(),使您能够通过合并一组更改来修改文档。有关详细信息,请参阅JSON_MERGE_PATCH()

  • X DevAPI: MySQL Shell文档_id 时没有指定集合添加操作时自动生成 _id自动生成的 _id 是使用 UUID() 函数创建的。现在,使用的令牌的顺序已从 MAC 地址 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee所在 。 eeeeeeeeeeeeeeeeeeeeeeee-dddd-cccc-bbbb-aaaaaaaa

  • X DevAPI: 由 X DevAPI 使用 mysql.getClassicSession(connection_data)or mysqlx.getSession(connection_data)现在 ssl-mode=REQUIRED用作默认值,如果没有 ssl-mode提供,则既不 ssl-ca也不ssl-capath提供。如果没有ssl-mode提供并且提供了任何ssl-cassl-capath,则由 MySQL Shell 创建的所有会话现在默认为 ssl-mode=VERIFY_CA.

  • X DevAPI: 除了通过匹配过滤器对集合中的文档起作用的现有 CRUD 命令之外,还添加了以下操作,使您能够处理单个文档:

    • Collection.replaceOne(string id, Document doc)id如果存在,则用提供 的文件更新(或替换)标识的文件。

    • Collection.addOrReplaceOne(string id, Document doc)添加给定的文档。如果该 id字段或​​任何其他具有唯一索引的字段已存在于集合中,则操作会更新匹配的文档。

    • Document Collection.getOne(string id) 返回给定的文档id。这是 . 的快捷方式Collection.find("_id = :id").bind("id", id).execute().fetchOne()

    • Result Collection.removeOne(string id) 删除给定的文档id。这是一个捷径Collection.remove("_id = :id").bind("id", id).execute().

    使用这些操作,您可以按 ID 引用文档,通过遵循加载、修改和保存模式,使对单个文档的操作更简单,例如:

    doc = collection.getOne(id);
    doc["address"] = "123 Long Street";
    collection.replaceOne(id, doc);
  • X DevAPI: 您现在可以在 MySQL Shell 会话中使用保存点。对象中添加了以下方法 Session

    • 用于setSavepoint()生成保存点。服务器执行 SAVEPOINTSQL 语句并返回生成的保存点名称。

    • 用于setSavepoint(name)指定SAVEPOINT SQL 语句使用的名称。

    • 用于releaseSavepoint(name)执行 RELEASE SQL 语句。

    • 用于rollbackTo(name)执行 ROLLBACK TO nameSQL 语句。

    检查传递给这些函数的任何名称以确保该名称不为 null 或空字符串。''不允许使用、""、 等名称 ``,即使服务器允许这些名称也是如此。有关详细信息,请参阅 SAVEPOINT、ROLLBACK TO SAVEPOINT 和 RELEASE SAVEPOINT 语句

  • X DevAPI: X DevAPI 现在支持对表和集合进行 CRUD 操作的行锁定。使用lockShared()写锁的lockExclusive() 方法和读锁的方法,已经添加到 find()select()中。任一方法都可以以任意组合调用任意次数,包括不调用。但是要使用的锁定类型总是最后一个被调用的。调用锁定方法后,您只能执行操作,调用execute() orbind()。有关详细信息,请参阅 InnoDB 锁定

  • X DevAPI: X DevAPI 删除操作已得到改进。现在,这些 drop()方法与方法处于同一级别 create(),它们都没有返回任何内容。现在不需要使用execute()after drop 方法。如果在数据库中不再存在的对象上调用 drop 方法,现在不会出现错误。

    这会修改Session对象,以便:

    • dropSchema()什么都不返回

    • dropTable(String schema, String name)已移除

    • dropCollection(String schema, String name)已移除

    • dropView(String schema, String name)已移除

    这会修改 Schema 对象,以便:

    • 没有dropCollection(String name)添加 任何内容

    这会修改 Collection 对象,以便:

    • dropIndex(String name)是直接操作,意义.execute()不再需要

    • dropIndex(String name)什么都不返回

  • X DevAPI:mysql与实例的 SQL 连接的经典会话一起使用 的这导致了以下变化:

    • getSession()功能已添加到mysql创建经典会话的模块中。此功能的工作方式与现有mysql.getClassicSession() 功能相同。

    • runSql()方法 ClassicSession已扩展为获取参数列表以替换为查询中的占位符。例如,现在您可以发出:

      session.runSql("select * from tbl where name = ? and age > ?", ["Joe", "20"])

      此外,query()还添加了一个函数ClassicSession作为 的别名 runSql(),使其与 Session.query().

    • 已从 中删除以下功能 ClassicSession

      • createSchema()

      • getSchema()

      • getDefaultSchema()

      • getCurrentSchema()

      • setCurrentSchema()

      • ClassicSchema()

    • ClassicTable对象已被删除。

    • 以下Table和 View DDL 函数已从Schema 对象中删除:

      • dropTable()

      • dropView()

    • 全局db变量的行为已被修改。当创建全局连接并且连接数据包含默认架构时,全局 db变量将设置为相应的 Schema对象。现在,对于通过经典 MySQL 协议的连接,例如ClassicSession.

  • MySQL Shell 现在支持通过按 Tab 键自动完成光标前的文本。自动完成适用于:

    • 内置 MySQL Shell 命令,例如键入 \con后按 Tab 键完成到\connect.

    • SQL、JavaScript 和 Python 语言关键字取决于当前的 MySQL Shell 模式。

    • 基于当前默认模式的 SQL 模式下的表名、列名和活动模式名。

    可以使用以下命令选项配置自动完成:

  • 您现在可以使用 Unix 套接字进行 X 协议连接。URI 类型字符串中的套接字文件路径应该是百分比编码的,例如 root@/home%2Fuser%2Fmysql-sandboxes%2F3310%2Fsandboxdata%2Fmysqlx.sock,或者用括号括起来,例如 root@(/home/user/mysql-sandboxes/3310/sandboxdata/mysqlx.sock). 该--socket选项不能与--port选项组合。请参阅使用类似 URI 的字符串或键值对连接到服务器

  • 用于util.checkForServerUpgrade([uri])检查服务器是否可以从当前运行的版本升级到下一个主要系列版本。例如,您可以验证运行 MySQL 5.7 的服务器实例是否满足 MySQL 8.0 的升级先决条件,请参阅 准备安装以进行升级。要验证 URI 类型字符串中的服务器实例,例如 user@example.com:3306问题:

    util.checkForServerUpgrade(['user@example.com:3306'])

    MySQL Shell 提供有关表空间中任何在将实例升级到 MySQL 8.0 时会导致问题的报告。

  • MySQL Shell 针对 MySQL 服务器版本 8.0.4 和 OpenSSL 构建。

  • MySQL 8.0.4caching_sha2_password 默认使用身份验证插件和加密连接。这意味着在 MySQL 中创建的任何新帐户都使用这些功能。如果在启用加密连接的情况下建立连接,则新的身份验证方法是完全透明的,这是默认的首选连接模式。如果明确禁用加密连接,则适用以下限制:

    • X 协议会话需要加密连接。

    • 如果 caching_sha2_password 插件报告诸如 Authentication requires a secure connection之类的错误,则无法使用 MySQL Shell 连接到该帐户,直到建立加密连接或使用mysql客户端清除错误。

    请参阅使用加密连接缓存 SHA-2 可插入身份验证

修正错误

  • 在使用过期或临时密码时,在未指定端口或套接字的情况下尝试服务器连接失败,并出现需要重置密码的错误。默认连接数据现在设置在连接处理的适当位置,因此连接成功。(漏洞#27266648)

  • MySQL Shell 需要选项名称 ssl-ciphers而不是标准 MySQL 选项名称--ssl-cipher来指定用于连接加密的允许密码列表。--ssl-cipherMySQL Shell 现在需要标准选项名称 。(漏洞 #27185275)

  • --show-warnings选项在 MySQL Shell 中不起作用。(漏洞 #27036716)

  • 使用 Unix 套接字进行连接时的输出\status显示相对路径。现在显示了套接字的绝对路径。(漏洞 #26983193)

  • MySQL Shell 现在在以批处理模式调用时以及以交互模式使用时 自动预加载内置 模块mysql和API 模块。mysqlx(缺陷号 26174373)

  • MySQL Shell 的用户配置路径默认为 %AppData%\MySQL\mysqlsh\Windows 和 ~/.mysqlsh/Unix。此目录用于 MySQL Shell 历史文件 ( history)、日志文件 ( mysqlsh.log) 和主题文件 ( prompt.json)。它也是 MySQL Shell 搜索启动脚本(mysqlshrc.jsmysqlshrc.py)的最终位置。

    MYSQLSH_USER_CONFIG_HOME您现在可以通过使用环境变量 指定替代路径来覆盖用户配置路径 。MySQL Shell 使用该环境变量指定的目录来代替 %AppData%\MySQL\mysqlsh\Windows 和 ~/.mysqlsh/Unix 上的用户配置数据。(漏洞 #26025157)

  • 对于文件处理,MySQL Shell 现在将文件路径中的前导波浪号扩展到适当的主目录。MySQL Shell 使用相关的环境变量识别主目录,或查找登录用户。(缺陷号 25676405)

  • MySQL Shell 现在program_name 在连接时为服务器提供一个连接属性,值为mysqlsh. 连接属性显示在性能模式连接属性表中。(缺陷 #24735491,缺陷 #82771)

  • 以 Python 模式在 MySQL Shell 中运行help()导致 AttributeError。(漏洞 #24554329,漏洞 #82767)

  • 数组和对象现在接受IN 运算符。例如:

    collection.find("'Fred' IN username")