-
命令行选项
--classic
、--node
、--sqln
和--ssl
被声明为已弃用,但实际上已被删除。MySQL Shell 现在再次处理这些选项,但在使用它们时会打印一条警告消息。弃用的选项作为它们的替换选项进行处理,如下所示:--classic
被处理为--mysql
--node
被处理为--mysqlx
--sqln
被处理为--sqlx
--ssl
被处理为--ssl-mode
(漏洞 #27012385)
-
当您创建集群或添加实例时,您现在可以覆盖默认组名、本地地址和组种子。这使得自定义集群变得更加容易。
dba.createCluster()
和cluster.addInstance()
命令 中添加了以下选项:使用
groupName
withdba.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。
除非会话帐户存在,否则帐户验证无法正常工作。现在,验证是使用服务器验证过的帐户完成的。(漏洞#26979375)
MySQL Shell 中用于处理 InnoDB 集群的 AdminAPI 仅支持与服务器实例的 TCP 连接。AdminAPI 现在会在开始需要访问数据库的操作之前检查 TCP 连接是否正在使用,而不是尝试使用其他连接类型进行操作但未成功。(缺陷号 26970629)
如果您
STOP GROUP REPLICATION
在属于集群的实例上发布,则尝试将该实例重新加入集群失败,因为使用了错误的组复制种子。现在, 基于 集群中所有当前活动实例的Cluster.rejoinInstance()
正确设置 。(漏洞#26861636)group_replication_group_seeds
group_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_boot
为OFF
。对于运行 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()
anddba.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
所在 。eeeeeeeeeeee
eeeeeeeeeeee-dddd-cccc-bbbb-aaaaaaaa
X DevAPI: 由 X DevAPI 使用
mysql.getClassicSession(connection_data)
ormysqlx.getSession(connection_data)
现在ssl-mode=REQUIRED
用作默认值,如果没有ssl-mode
提供,则既不ssl-ca
也不ssl-capath
提供。如果没有ssl-mode
提供并且提供了任何ssl-ca
或ssl
-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()
生成保存点。服务器执行SAVEPOINT
SQL 语句并返回生成的保存点名称。用于
setSavepoint(name)
指定SAVEPOINT
SQL 语句使用的名称。用于
releaseSavepoint(name)
执行RELEASE
SQL 语句。用于
rollbackTo(name)
执行ROLLBACK TO name
SQL 语句。
检查传递给这些函数的任何名称以确保该名称不为 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.4
caching_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-cipher
MySQL 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.js
或mysqlshrc.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")