MySQL Shell版本说明/ MySQL Shell 8.0.24(21-04-20,一般可用性)

MySQL Shell 8.0.24的更改(21-04-20,一般可用性)

AdminAPI添加或更改功能

  • 用于编写MySQL Shell脚本的API命令行集成已经得到了改进,可以使用函数和选项元数据正确地解析参数并将它们与API调用中的相应参数关联起来。以前,命令行集成将所有参数作为字符串处理,使用以下操作会导致错误:

    > mysqlsh user@hostname:3306——cluster setOption "autoRejoinTries

    命令行集成现在根据API函数期望接收的内容来解释传入的数据。此增强还引入了对命令行集成调用中的列表的支持。

    此外,您现在可以从命令行集成中访问MySQL Shell在线帮助。例如,要获得帮助shell.options功能问题:

    $ mysqlsh——shell选项——帮助

    有关更多信息,请参见API命令行集成

    此外,当注册一个新的MySQL Shell扩展函数时,新的布尔值cli选项支持shell.addExtensionObjectMember ()操作。对象注册操作时cli选项设置为真正的,对象和函数可用于命令行集成。这使您能够扩展MySQL Shell的脚本功能。(错误# 31186637)

AdminAPI bug修复

  • 大多数AdminAPI操作都包含元数据先决条件,以确定是否有效地执行它们。执行此检查时,将向日志中添加两个条目,一个表示即将执行检查,另一个表示元数据状态。这意味着监视集群(这意味着执行定期的状态请求)等操作将产生大量的日志条目。现在,这两个日志消息已经合并到一个条目中,当元数据状态不正确时,该条目在信息级别上被记录下来,当状态正确时作为调试信息记录下来。换句话说,如果元数据状态是正确的,则只有在log_level =调试.(错误# 32582745)

  • memberRole的默认输出中现在包含了集群.status ().以前,此信息仅在扩展选项的值为1或更高。这使得更容易知道一个实例在集群中的角色,而不管它的操作模式是R/W还是R/O。(错误# 32381513)

  • dba.checkInstanceConfiguration ()正在对所需的特权执行不正确的验证。这导致了一个无尽的循环,在这个循环中,操作检测到缺少特权,您可以根据交互帮助指定授予权限,但操作将失败,表明授予权限缺失。现在,验证检查正确的列表。此外,还包括所需赠款的内部清单超级,在8.0中已弃用。修复程序取代了超级使用细粒度授予。(错误# 32287986)

  • memberSslMode选项不支持VERIFY_CA而且VERIFY_IDENTITY以下操作方式:

    • dba.createCluster ()

    • 集群.addInstance ()

    • 集群.rejoinInstance ()

    现在,memberSslMode选项支持这些模式,当使用它们时,将进行验证以确保提供了CA证书。如果您选择使用VERIFY_CAVERIFY_IDENTITY模式时,必须在每个集群实例上使用ssl_ca和/或ssl_capath选择。有关更多信息,请参见确保InnoDB集群

    感谢Daniël van Eeden的贡献。(Bug #32247631, Bug #32241000)

  • 在8.0.23版本中,添加了一个检查来验证server_id在元数据中注册为实例属性,如果没有,则相应地更新元数据。此检查在添加、重新连接和重新扫描操作时执行。但是,当集群从8.0.23之前的版本升级到8.0.23及更高版本时,会出现server_id未在元数据中注册,除非执行了手动重新连接。这一点被忽略了,因为它没有包含在任何诊断消息中。现在,一个新的验证检查是否server_id的集群实例的instanceErrors属性的输出集群.status ()指示使用集群.rescan ()修复它。(错误# 32226871)

  • 从MySQL Shell 8.0.17版本开始,AdminAPI将用于元数据模式中每个添加的实例的复制或恢复帐户存储在实例表中。但是,特定的事务可能会失败,或者该条目可能已经被手动从元数据模式中删除,从而导致在尝试向集群添加其他实例时失败,并且没有办法使用AdminAPI解决这个问题。在这种情况下,如果尝试添加实例,则操作会失败并出现错误。现在,AdminAPI尝试检测与InnoDB集群或InnoDB副本集相关的元数据中的问题。的状态()如果元数据模式中缺少所需的帐户,如果实际使用的帐户不是所需的帐户,操作将打印一条消息。在这种情况下,MySQL Shell帮助会指示您重新添加实例或运行实例重新扫描()基于检测到的问题。的addInstance ()操作还输出调用的提示重新扫描()如果在元数据中发现任何丢失的恢复用户。(错误# 32157182)

  • 集群.addInstance ()是否允许使用expelTimeout而且一致性在不应该的时候选择。这些选项是集群级别设置,只能使用dba.createCluster ()而且集群.setOption ().(错误# 29779995)

  • dba.checkInstanceConfiguration ()操作检测实例是否有任何没有主键的表。组复制要求组复制的每个表都有一个已定义的主键。但是,这并不意味着没有主键的表会导致Group Replication阻塞或失败。相反,结果是对该表的更改不会被复制,但组会继续操作。以前,如果dba.checkInstanceConfiguration ()操作检测到没有主键的表,该操作返回状态为好吧并且只提到缺少主键和不支持引擎的表。现在,如果操作检测到这样一个表,它将返回状态为错误.作为这项工作的一部分dba.createCluster ()操作已更改为在找到此类表时失败。(错误# 29771457)

  • 作为修复错误#28701263的一部分,AdminAPI开始设置并持久化一个默认值READ_ONLYgroup_replication_exit_state_action系统变量。组复制使用的默认值为ABORT_SERVER.但是,在MySQL Server 8.0.16中默认值为group_replication_exit_state_action成为READ_ONLY所以AdminAPI不应该更改它,而应该持久化它。现在,在运行8.0.16及更高版本的实例上,的值group_replication_exit_state_action没有修改。(错误# 29037274)

  • 在线帮助中列出的异常信息对于交互式MySQL Shell来说已经过时和笨拙了,所以它被删除了。(错误# 28542904)

    参考文献:参见Bug #29853828, Bug #32426083, Bug #32157120, Bug #28825389。

  • 使用allowRootFrom选择与dba.deploySandboxInstance ()根据MySQL Shell是否以交互模式运行,操作将创建不同的远程根帐户。的默认值allowRootFrom两种模式是否一致,帐户创建为root@ %交互式和非交互式模式。(错误# 27369121)

  • 当你的问题dba.createCluster ()而且dba.createReplica (),创建表来存储元数据。如果默认存储引擎不存在InnoDB,这些操作可能会失败。元数据创建操作总是使用InnoDB存储引擎。(Bug #101446, Bug #32110085)

增加或更改的功能

  • 从MySQL 8.0.24,您在MySQL Shell的SQL模式下发出的SQL语句可以发送到操作系统的系统日志工具(syslog在Unix上,或Windows事件日志)。选项可以选择此选项——syslog命令行选项,或者通过设置history.sql.syslogMySQL Shell配置选项。从MySQL Shell代码历史记录中排除的SQL语句也从系统日志记录功能中排除。(Bug #31995742, Bug #31514599)

  • MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()现在可以检查不包含主键的表。检查是在ocimds选项用于检查与MySQL数据库服务的兼容性,如果转储中包含的每个表没有主键,则会报错。的兼容性选项,它实现了适当的兼容性措施,有两个新的修改选择,通知MySQL Shell的转储加载实用程序在不可见的列中为没有主键的表创建主键,或忽略丢失的主键。使用组复制的MySQL数据库服务高可用性需要主键。

错误修复

  • 以前,MySQL Shell重试Oracle Cloud Infrastructure Object Storage的请求最多5次,两次重试之间有30秒的等待,最大总等待时间为5分钟。重试策略现在已更改,以增加等待窗口并减少转储或加载操作失败的可能性。MySQL Shell现在重试最多10次,重试之间的等待时间为1分钟,总的等待时间为10分钟。(错误# 32592962)

  • MySQL Shell的实例转储实用程序util.dumpInstance ()如果要转储的最后一个模式是不包含表的模式,则停止并出现错误。这个问题现在已经解决了。(错误# 32540460)

  • MySQL Shell的实例转储实用程序util.dumpInstance ()已经过优化,因此如果服务器的资源(如磁盘空间或线程堆栈)存在限制,仍然可以成功地使用它。为了处理这种情况,如果需要,可以重复来自该实用程序的查询来检索更小的数据块,并且可以避免文件排序。(错误# 32528186)

  • MySQL Shell的实例转储实用程序util.dumpInstance ()错误地删除授予用户的所有特权。效用现在扩大了授予所有语句,以列出在所有模式和表上授予的所有特权(* . *),并列出系统模式所允许的特权。转储加载实用程序util.loadDump ()现在提取加载期间允许和撤销的全局特权的列表,并从格兰特与系统模式以及所有模式和表相关的语句。(错误# 32526567)

  • MySQL Shell的转储加载实用程序util.loadDump ()现在,在加载所有数据后授予特权。以前,如果实用程序试图在一个不存在的例程上授予特权,可能会发生错误。(错误# 32526496)

  • MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()无法完成转储,如果gtid_executed系统变量或信息模式的COLUMN_STATISTICS表是不可用的。在这种情况下,实用程序现在显示一条警告消息并记录详细的错误消息。成功转储不需要这些项。(错误# 32515696)

  • MySQL Shell在注册Python插件时为字典参数及其选项提供的帮助文本的处理和格式得到了改进。(错误# 32509309)

  • MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()不再写刷新表语句添加到二进制日志中,因为这会干扰复制。(错误# 32490714)

  • 从MySQL 8.0.23, MySQL服务器支持从一个没有启用gtid和不使用基于gtid的复制的源服务器复制到一个启用了gtid的副本,使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS选择的将复制源更改为声明。MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()现在,通过在转储元数据中存储二进制日志文件名和位置来支持此功能gtid_executedGTID集。额外的特权复制客户端为使实用程序能够收集此信息,必须使用该选项,但是如果用户ID没有此特权,则转储将继续进行,但将不包含二进制日志信息。

    在将转储数据加载到复制服务器后,可以使用二进制日志信息与非gtid源服务器建立复制。MySQL Shell的转储加载实用程序util.loadDump ()当指定新选项时,从转储元数据(以YAML格式)打印二进制日志和GTID集信息showMetadata:真.(错误# 32430402)

  • MySQL Shell无法正确处理添加到集合中的空数组。在这种情况下,通常从服务器返回的结果集现在被跳过。(错误# 32377134)

  • MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()无法从MySQL 5.6服务器实例块表数据,由于解释选择语句。实用程序现在负责处理差异,并缓存服务器版本信息以便更快地访问。(错误# 32376447)

  • MySQL Shell的并行表导入实用程序util.importTable ()如果发生了不中断导入的非关键错误(如找不到目录或文件),则设置退出码为零。该实用程序现在在观察到第一个非关键错误时设置一个非零错误代码。(错误# 32286186)

  • MySQL Shell的升级检查工具util.checkForServerUpgrade ()现在检查最初在MySQL 5.6中创建的空间数据列。MySQL 5.6中这些列的基础数据类型与MySQL 8.0中的基础数据类型不匹配,因此禁止升级该表,必须重新创建该表。(Bug #32257211, Bug #101944)

  • 当MySQL Shell将字符串转换为布尔值时,该操作现在不区分大小写。以前,不同平台的结果可能不同。(错误# 32217910)

  • 当MySQL壳牌的\警告命令在每个语句后显示警告,对于经典的MySQL协议连接,警告不会显示。(错误# 32151137)

  • MySQL Shell的并行表导入实用程序util.importTable ()现在检查上传的对象是否为目录,并从为文件指定的通配符匹配中排除这些对象。(错误# 31991122)

  • MySQL Shell的转储加载实用程序util.loadDump ()可以将超大的数据块拆分为较小的数据块以便上传。以前,如果在这个阶段中途停止加载,然后恢复加载,则不会考虑并跳过已经加载的较小块中的行,这可能导致死锁。实用程序的进度文件现在分别记录较小的块,以便在加载停止和恢复时可以跳过它们。(错误# 31961688)

  • 包含两个分号序列的事件导致MySQL Shell的实例转储实用程序util.dumpInstance (),模式转储实用程序util.dumpSchemas ()和表转储实用程序util.dumpTables ()进入一个寻找分隔符的无限循环。(错误# 31820571)

  • decodeColumns选项,MySQL Shell的并行表导入实用程序util.importTable ()可以不附带说明吗选项,导致导入停止并出现错误。(错误# 31407058)

  • 如果在MySQL Shell的Python模式下以交互方式运行的脚本末尾没有换行符,并且脚本以一个多行命令结束,MySQL Shell将等待输入而不是处理该命令。用户必须按Enter键来完成脚本的运行,脚本的最后一行被错误地保存在MySQL Shell的代码历史中。MySQL Shell现在在处理脚本输入流后添加一个空行,以确保这种情况不会发生。(错误# 30765725)

  • MySQL Shell使用不同的字符集进行排序,这取决于是使用X协议还是使用经典的MySQL协议连接MySQL服务器实例,这导致了不一致,在某些情况下,还会出现错误。对于MySQL 5.7实例,MySQL Shell现在使用组名称语句将所有相关会话系统变量设置为utf8mb4字符集。对于MySQL 8.0实例,MySQL Shell现在设置collation_connection系统变量为utf8mb4_0900_ai_ci字符集。(错误# 30516645)