Documentation Home
MySQL 8.0 发行说明  /  MySQL 8.0.31 的变化(2022-10-11,全面上市)

MySQL 8.0.31 的变化(2022-10-11,全面上市)

审核日志说明

  • audit_log_rotate()功能简化了审计日志文件轮换。以前,审核日志文件轮换需要手动重命名文件并设置 audit_log_flush = ON为关闭文件并使用原始名称打开一个新的日志文件。该 audit_log_rotate()函数重命名当前文件并创建一个新文件。不再需要手动重命名审计日志文件。

    audit_log_flush从MySQL 8.0.31 开始不推荐使用 该变量;希望在未来版本的 MySQL 中删除对它的支持。

编译笔记

  • 将内部性能架构函数从 _utf8* 重命名为 _utf8mb4*,因为它们从 v8.0.11 开始就使用 utf8mb4。(漏洞#34351301)

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

  • 修复了 clang/ubsan 的链接器标志,以解决 LLVM/Clang 相关的整数问题,如 LLVM 错误 #16404 中所述。(漏洞#34311325)

  • 更新了帮助程序脚本以使用“utf8mb3”作为字符集/排序规则,而不是“utf8”以实现未来兼容性。

    用于处理 utf8mb3 字符集和排序规则的重命名函数和数据结构有助于阐明它们的 utf8mb3 用法。(错误#34263480,错误#34025412)

  • 清理了 CMake 代码,并简化了 INFO_BIN 和 INFO_SRC。(缺陷号 34139084)

组件说明

  • 新的组件服务现在使服务器组件和插件能够在本地服务器内进行查询。新的 MySQL 命令服务类似于 中的 C API 函数libmysql,只是它们不向客户端公开协议内部结构。有关这些服务的信息,请参阅 MySQL Server Doxygen 文档,网址为 https://mysql.net.cn/doc/index-other.html。搜索:

    • s_mysql_mysql_command_factory

    • s_mysql_mysql_command_options

    • s_mysql_mysql_command_query

    • s_mysql_mysql_command_query_result

    • s_mysql_mysql_command_field_info

    • s_mysql_mysql_command_error_info

钥匙圈笔记

  • MySQL Keyring 以前使用服务器插件实现 Oracle Cloud Infrastructure Vault Keyring 密钥库功能,但现在正在过渡到使用 MySQL 组件基础设施。新的密钥环组件与现有插件有相似之处 ,但配置不同,并且可以在使用一组类似的配置选项初始化新组件时keyring_oci访问使用插件创建的密钥 。keyring_oci有关配置详细信息,请参阅 使用 Oracle Cloud Infrastructure Vault 密钥环组件

    component_keyring_oci未在启动期间使用 --early-plugin-load服务器选项加载或在启动期间或运行时使用系统变量配置:

    如果安装了密钥环组件,则性能模式 keyring_component_status表会提供有关它的状态信息。请参阅 keyring_component_status 表

优化器注释

  • 重要变化: MySQL 优化器对集合操作的内部管理得到改进,效果如下:

    • 带括号的查询表达式的主体现在可以嵌套与UNION. 例如,此处显示的查询,以前因错误而被拒绝ER_NOT_SUPPORTED_YET,现在被允许:

      ( 
        (SELECT a, b, c FROM t ORDER BY a LIMIT 3) ORDER BY b LIMIT 2
      ) ORDER BY c LIMIT 1;
    • 当折叠括号内的表达式主体时,MySQL 现在遵循 SQL 标准中指定的语义,因此更高的外部限制不能覆盖内部更低的限制。这意味着表达式(SELECT ... LIMIT 3) LIMIT 5最多可以返回三行。

    • UNION DISTINCT现在UNION ALL可以嵌套在任意组合中。

    刚才列出的所有情况下支持的最大嵌套级别是 63;这遵循解析器执行的任何简化或合并。有关详细信息,请参阅 带括号的查询表达式。(漏洞 #103954)

  • 派生表中的外部引用指向 JOIN操作中的表,该操作不可用于子查询(错误地)报告为有效,而没有派生表的此类引用被正确报告为无效。

    VALUES在一个相关问题中,放置在语句子句 内的对派生表的外部引用INSERT不被认为是有效的,而没有派生表的类似引用被视为有效。现在,对派生表的这种引用在VALUES.

    在这两种情况下,我们都通过确保将正确的名称解析上下文用于外部引用来解决问题。(错误#32678303,错误#34131822)

性能模式说明

SQL 语法说明

  • 重要变化: 以前,MySQL 支持使用full作为表、列、视图、存储过程或存储函数的名称,以及表、视图或列的别名。从此版本开始,以这种方式使用full (不管字母大小写)作为不带引号的标识符现在已被弃用,并引发警告。这是为了更紧密地与 SQL 标准保持一致,其中 FULL保留为关键字。

    例如,以下CREATE TABLEandDROP TABLE 语句现在会引发警告,如下所示:

    mysql> CREATE TABLE full (c1 INT, c2 INT);
    Query OK, 0 rows affected, 1 warning (0.03 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 4119
    Message: Using FULL as unquoted identifier is deprecated, please use quotes or
    rename the identifier. 
    1 row in set (0.00 sec)
    
    mysql> DROP TABLE full;
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 4119
    Message: Using FULL as unquoted identifier is deprecated, please use quotes or
    rename the identifier. 
    1 row in set (0.00 sec)

    要在没有警告的情况下执行语句,请用反引号 ( `) 将每个语句中的表名括起来,如下所示:

    mysql> CREATE TABLE `full` (c1 INT, c2 INT);
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> DROP TABLE `full`;
    Query OK, 0 rows affected (0.02 sec)

    FULL在赋值右侧 的使用不受此更改的影响。例如,SET 此处显示的语句仍然有效:

    mysql> SHOW VARIABLES LIKE '%metadata%';
    +---------------------------------------+---------+
    | Variable_name                         | Value   |
    +---------------------------------------+---------+
    | binlog_row_metadata                   | MINIMAL |
    | innodb_stats_on_metadata              | OFF     |
    | performance_schema_max_metadata_locks | -1      |
    | resultset_metadata                    | FULL    |
    +---------------------------------------+---------+
    4 rows in set (0.00 sec)
    
    mysql> SET @@global.binlog_row_metadata=FULL;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SHOW VARIABLES LIKE '%metadata%';
    +---------------------------------------+-------+
    | Variable_name                         | Value |
    +---------------------------------------+-------+
    | binlog_row_metadata                   | FULL  |
    | innodb_stats_on_metadata              | OFF   |
    | performance_schema_max_metadata_locks | -1    |
    | resultset_metadata                    | FULL  |
    +---------------------------------------+-------+
    4 rows in set (0.00 sec)

    有关详细信息,请参阅关键字和保留字

  • 现在可以将列直方图设置为用户指定的 JSON 值。当抽样遗漏重要值时,这会很有用。这也意味着辅助(副本)MySQL 服务器可以承担采样数据和构建直方图的工作,然后可以在不影响其性能的情况下将其用于主(源)。

    此功能是通过对 ANALYZE TABLE ... UPDATE HISTOGRAM. 以下语句将col_name表列的直方图设置为tbl_name直方图的 JSON 表示形式 json_data

    ANALYZE TABLE tbl_name 
      UPDATE HISTOGRAM ON col_name
      USING DATA 'json_data'

    之后您可以通过检查 Information Schema表 的HISTOGRAM列 的值来确认这一点。COLUMN_STATISTICS

    有关更多信息和示例, 请参阅 直方图统计分析。

    感谢 Kaiwang Chen 对 MySQL 的贡献。(错误#104040,错误#33012389)

  • 在此版本中,MySQL 添加了对 SQL 标准 INTERSECTEXCEPT表运算符的支持。

    query_a INTERSECT query_b仅包括出现在两个结果集中的行。

    query_a EXCEPT query_b返回结果集中query_a不在的结果中的 任何query_b行。

    INTERSECT并且EXCEPT都支持DISTINCTand ALLDISTINCT在这两种情况下都使用默认值。(这与 for 相同UNION)。

    INTERSECT之前的组 EXCEPTUNION,所以 被评估为。 TABLE r EXCEPT TABLE s INTERSECT TABLE tTABLE r EXCEPT (TABLE s INTERSECT TABLE t)

    有关其他信息和示例, 请参阅INTERSECT 子句EXCEPT 子句。(错误#1309、错误#31336、错误#11747209、错误#11744757)

添加或更改的功能

  • 重要变更;复制:Rewriter插件根据重写器规则表重写 SQL 查询。以前,所有查询都需要重写,包括来自任何用户的查询,无论权限如何,以及内部系统查询,如复制应用程序线程、引导 MySQL 服务器和存储引擎执行的查询。此 MySQL 版本提供了一种机制,允许插件跳过某些查询的重写,例如由系统线程执行的查询和来自指定用户的查询。

    我们通过实施一个新的权限来做到这一点,该权限 SKIP_QUERY_REWRITE指示其查询未被重写的用户。一个新的系统变量 rewriter_enabled_for_threads_without_privilege_checks 控制是否为在禁用特权检查的情况下执行的线程跳过重写。这些线程包括升级线程、初始化线程和 PRIVILEGE_CHECKS_USER具有 NULL. 为保持向后兼容性,此变量的默认设置为 variable is ON,但推荐设置为 OFF

    只有安装了插件 SKIP_QUERY_REWRITE, 和 rewriter_enabled_for_threads_without_privilege_checks 才可用。Rewriter

    有关详细信息,请参阅 重写器查询重写插件

  • 重要变化: 对于捆绑了 OpenSSL 库的平台,用于 MySQL Server 的链接 OpenSSL 库已更新至版本 1.1.1q。在https://www.openssl.org/news/cl111.txthttps://www.openssl.org/news/vulnerabilities.html中描述了 OpenSSL 版本 1.1.1q 中修复的问题 。(漏洞#34414695)

  • InnoDB: 提供了两个新的状态变量,用于监视在线缓冲池大小调整操作。Innodb_buffer_pool_resize_status_code 状态变量报告指示在线缓冲池大小调整操作阶段的状态代码。 状态变量报告一个百分比值, Innodb_buffer_pool_resize_status_progress 指示每个阶段的进度。

    有关详细信息,请参阅 配置 InnoDB 缓冲池大小

  • InnoDB: InnoDB现在支持并行索引构建,这提高了索引构建性能。特别是,将排序的索引条目加载到 B 树中现在是多线程的。以前,此操作由单个线程执行。

  • 复制: 使用复制过滤时,副本不再引发与特权检查或被 require_row_format过滤掉的事件验证相关的复制错误。以前,所有权限都在应用程序中检查,有些在应用过滤器之前检查,有些直到之后才检查;在这个版本中,权限检查现在被推迟到所有复制过滤器都被应用之后。此外,在此版本之前,接受者和应用require_row_format者都进行了相等 1现在,在评估任何过滤器之前,应用程序单独执行此检查。

    这使得可以使用现有的复制过滤器过滤掉任何未通过验证的事务,并且副本只接受给定用户已被授予访问权限的数据库部分,只要更新数据库的这一部分仅以基于行的格式复制。另一个可能需要这样做的实例是从本地或云服务迁移到 MySQL 数据库服务时,这些服务使用入站复制用户无权访问的管理表。

    权限检查防止更新副本上的关键表。检查require_row_format可防止复制不安全的操作;这与特权检查结合使用,因为保证不存在不安全操作消除了对某些会话上下文初始化和清理操作的需要,这反过来又消除了为这些操作授予特权的需要。

    与此工作相关的其他行为更改在以下列表中注明:

    • 当接收到违反要求行格式验证的事件时,接收线程不再出错;当处理违反要求行格式验证的事件并随后由于复制过滤器而被过滤掉时,应用程序线程不再出错。

    • Query由于缺乏设置此处列出的任何系统变量的权限,应用程序 线程不再因过滤掉的日志事件而出错 :

      这是因为设置变量和检查应用程序是否有权设置它现在仅在过滤发生后执行。如果一个事件被过滤掉,应用程序不会尝试设置变量,因此永远不会在检查它是否具有这样做的必要权限时失败。

    • Execute_load_query当处理事件并最终因复制过滤器而被过滤掉时,应用程序 线程不再在特权检查中出错。Append_block应用或 事件时也是如此 Begin_load_query,处理后续Execute_load_query事件然后将其过滤掉。

    • 应用程序线程不再在特权检查或事件require_row_format检查中 出错Delete_file。这些事件是不可过滤的,因为它们不包含表名或数据库名,所以我们假设它们被过滤掉了。我们假设这是安全的,因为 Delete_file 事件不会改变数据库状态。

    • Append_blockapplier thread 在处理or 事件 期间不再创建或删除文件系统中的文件 Delete_file,当有配置的用户帐户 PRIVILEGE_CHECKS_USER并且它没有FILE权限时,也不会require_row_format启用。

    • 对于由 更改的复制事件 --replicate-rewrite-db,任何权限检查都适用于重写的数据库。

    有关详细信息,请参阅服务器如何评估复制过滤规则复制过程中的副本错误。(错误#33704306,错误#33733677)

  • 添加了新的 Resource_group_supported 状态变量以指示服务器是否支持资源组功能。(缺陷号 34264356)

  • 包含 curl 而不是链接到系统 curl 库的二进制包已升级为使用 curl 7.85.0。(错误#34138733,错误#34614578)

  • 新的 thread_pool_transaction_delay 系统变量允许在工作线程开始执行新事务之前指定延迟时间(以毫秒为单位)。最大值为 300000(5 分钟)。

    事务延迟可用于并行事务因资源争用而影响其他操作的性能的情况。例如,如果并行事务影响索引创建或在线缓冲池大小调整操作,您可以配置事务延迟以减少这些操作运行时的资源争用。

  • 新的thread_pool_query_threads_per_group 系统变量允许您增加线程组中查询线程的数量,而不是默认的单个查询线程。当您使用高并发线程池算法 ( thread_pool_algorithm=1) 时,如果由于长时间运行的事务而遇到较慢的响应时间,请考虑增加该值。它不能超过 的值 thread_pool_max_transactions_limit

  • 以前仅适用于 MySQL 数据库服务的线程池插件功能现在适用于 MySQL 企业版。

    • thread_pool_max_transactions_limit 变量定义线程池插件允许的最大事务数。定义一个事务限制将一个线程绑定到一个事务直到它提交,这有助于在高并发期间稳定吞吐量。

    • thread_pool_dedicated_listeners 变量在每个线程组中指定一个侦听器线程来侦听来自分配给该组的连接的传入语句。当事务限制由 定义时,启用此变量是必要的 thread_pool_max_transactions_limit。它确保每个线程组都有一个可用的侦听器线程。

    • TP_CONNECTION_ADMIN特权使用户能够使用特权连接访问服务器。当达到定义的限制 thread_pool_max_transactions_limit时,新连接将无法访问服务器。特权连接忽略定义的限制 thread_pool_max_transactions_limit并允许连接到服务器以增加事务限制、删除限制或终止正在运行的事务。

  • WRITE_CONSENSUS_SINGLE_LEADER_CAPABLEPerformance Schema 表中 的新字段 replication_group_communication_information 显示复制组是否支持使用单个共识领导者,即使 group_replication_paxos_single_leader当前OFF在查询成员上设置为。如果组启动时 group_replication_paxos_single_leader设置为 ON,并且其通信协议版本为 MySQL 8.0.27 或更高版本,则该字段设置为 1。

  • 激活 MySQL Server 的离线模式,这是通过将offline_mode系统变量的值更改为 来完成的ON,现在 CONNECTION_ADMIN除了 SYSTEM_VARIABLES_ADMIN特权(或已弃用的SUPER特权,涵盖这两种特权)之外还需要特权。当激活离线模式时,其用户具有特权的会话 CONNECTION_ADMIN保持连接状态,并且具有该特权的用户可以与离线服务器实例建立新连接。新要求意味着可以激活离线模式的管理员不能无意中将自己锁在外面。

  • 添加了只读build_id 系统变量。在 Linux 系统上,一个 160 位的 SHA1签名是在编译时生成的;此值转换为十六进制字符串,为构建提供唯一标识符。该值在启动时写入服务器日志。

    此变量在 Linux 以外的平台上不受支持。

  • 添加了 Ubuntu 22.10 支持。

修正错误

  • 不兼容的更改:pfs_plugin_table自 MySQL 8.0.14 起已弃用 的服务

    使用此服务的插件或组件必须更新以使用 pfs_plugin_table_v1和 代替。(缺陷号 34361827)pfs_plugin_column_*

  • 重要变更;Replication:无论二进制日志格式如何,无论 --replicate-do-dbor 查询默认数据库过滤的日志事件 --replicate-ignore-db包括XA START,XA END,XA COMMIT, andXA ROLLBACK(但不 XA PREPAREorXA COMMIT ONE_PHASE

    这可能会导致此处列出的问题之一:

    • XA STARTorXA END被过滤掉时,事务第​​一部分中的 XA 语句序列变得无效,这使得副本因错误而停止。

    • XA STARTXA END被保留而XA COMMITXA ROLLBACK被过滤掉时,事务可以在副本上无限期地保持准备状态。

    为了防止这些问题的发生,我们不再使用 or 过滤默认 数据库的XA START, XA END, XA COMMIT, orXA ROLLBACK 语句 。(错误#106201,错误#33764808)--replicate-do-db--replica-ignore-db

  • InnoDB: 升级到支持使用添加或删除的列的行版本的版本后, 具有可空列和立即添加列的表上ALGORITHM-INSTANT进行即时操作时发生故障ADD COLUMN(缺陷号 34488482)

  • InnoDB: 在同一语句中添加虚拟列和删除列 ALTER TABLE引发了无效的调试断言失败。(漏洞#34467592)

  • InnoDB: 删除列并将现有列重命名为删除列的名称后,列的物理位置设置不正确。(缺陷号 34463089)

  • InnoDB:更正 了检测到的 Valgrind 错误mtr_t::start() 。(缺陷号 34327575)

  • InnoDB: 对损坏的分区表的 DDL 操作引发断言失败。(缺陷号 34293555)

  • InnoDB: 直方图采样期间的索引块闩锁顺序违规阻止并发插入并可能导致死锁失败。(错误#34282448,错误#34174927,错误#107299)

  • InnoDB: 正在进行ALTER TABLE数据加载操作时执行的操作引发了断言失败。(缺陷号 34267618)

  • InnoDB: InnoDB修复了由 Address Sanitizer (ASAN) 构建识别的 MySQL 服务器初始化期间的内存泄漏。(缺陷号 34156050)

  • InnoDB: 在恢复期间,与从磁盘获取的加密撤消表空间页面关联的表空间对象不包含解密页面所需的加密密钥,导致失败。(缺陷号 34148143)

  • InnoDB: 在调试版本中,降序 b 树扫描引发了调试断言失败。(缺陷号 34144951)

  • InnoDB:innodb_redo_log_consumer_advance() 函数无法处理无效参数。(缺陷号 34052884)

  • InnoDB: 使用ALGORITHM=INSTANT添加的列在添加该列的 DDL 操作之前创建的读取视图中可见。(缺陷号 33937504)

  • InnoDB: 使用包含具有特定表 ID 的用户创建表的 MySQL 5.6 数据目录升级 MySQL 实例时发生故障。在从 MySQL 5.7 升级到 MySQL 8.0 时,分配该表 ID 会导致分配冲突的数据字典表 ID。

    感谢 Rahul Malik 的贡献。(缺陷号 33919635)

  • InnoDB: 包含内部临时表页的缓冲块在页遍历期间被重新定位,导致断言失败。(漏洞#33715694)

  • InnoDB: 删除带有废弃表空间的表会导致断言失败。(缺陷号 33232978)

  • InnoDB: 在关闭到达刷新阶段之前页面 I/O 读取未完成导致在页面更改缓冲区合并要在 I/O 读取后完成的情况下断言失败。(缺陷号 33192496)

  • InnoDB: 索引闩锁顺序违规 dict_table_x_lock_indexes()导致断言失败。(缺陷号 32912868)

  • InnoDB:TRUNCATE TABLE特定情况下,操作无法释放获取的互斥体。(错误#107858,错误#34380370)

  • InnoDB: 在调试版本中,导入一个没有 .cfg文件的表空间,用于立即添加或删除列的表会引发断言失败。(错误#107517,错误#34307874)

  • InnoDB:trx_undo_prev_version_build()更正 了函数中潜在的内存泄漏

    感谢 Alex Xing 的贡献。(缺陷 #106952,缺陷 #34051207)

  • InnoDB: 在恢复期间重做空间删除时发生调试断言失败。(缺陷 #103482,缺陷 #32819101)

  • InnoDB:删除了指定对象池数量 的InnoDB启动消息,以避免与缓冲池实例数量混淆。(缺陷 #80248,缺陷 #22653060)

  • 分区:ALTER TABLE当语句更改其任何列的字符集 时,分区表未按预期重新分区 其根本原因是,在确定字符集更改是否可以作为就地更改操作来完成时,我们没有考虑受字符集更改影响的任何列是否是表分区表达式的一部分。由于这样的更改可能会导致表的重新分区,因此无法就地完成。现在,当计划更改字符集时,我们还会检查这是否会影响分区表达式中的任何列;如果没有,那么我们可以就地进行操作。(错误#106884,错误#34031693)

  • 复制:组复制应用程序通道 () 允许 使用START REPLICA和,但手动停止和启动通道会使 复制组的成员无法提交远程事务。当组复制正在运行时,这些语句现在不能用于通道。(漏洞#34231291)STOP REPLICAgroup_replication_applierONLINE

  • 复制: 更正了复制信息处理中的一个内部错误。(缺陷号 34214416)

  • 复制: 在 InnoDB ClusterSet 中,如果发生提交顺序死锁和随后的重试,组复制可能会在认证期间回滚事务,并出现错误,指出事务的 GTID 已被使用。现在仅当 GTID 已在服务器实例和组中使用时才会返回错误。(缺陷号 34157846)

  • 复制: 当单个事件导致对副本上表的同一行进行多次更新时,如果副本在源中不存在的表上具有主键,则无法应用更改。基于散列的行查找算法现在在这种情况下运行,即使主键存在于副本表中也是如此。(漏洞#34114296)

  • 复制: 当单个语句为副本上的不同表生成多个写入事件时,副本表中额外的自动增量列仅针对最后生成的事件进行清理。如果最后一个事件不涉及带有额外自动增量列的表,则它们根本不会被清理。清理过程现在总是针对多个写入事件进行。(缺陷号 34095290)

  • 复制: 如果 group_replication_force_members设置了系统变量,则向客户端返回误导性错误,并且等待视图更改超时。错误和相关错误已更新,因此它们不会表明为系统变量提供的值不正确。(缺陷号 34091087)

  • 复制: Performance Schema 表中的 FILTER_RULE 列 replication_applier_filters显示了规则不存在的过滤器的不正确数据。在这种情况下,表格现在显示空字符串。(缺陷号 33885484)

  • 复制: 在一些罕见的刷新或同步错误情况下,服务器可能会尝试使用文件和文件内位置的无效值更新二进制日志的端点,从而导致未定义的行为。

    为了解决这个问题,我们现在只在已知文件和位置参数都有效时 调用内部函数 。(缺陷号 33818238)update_binlog_end_pos(binlog_file, pos)

  • 复制: 使用无效 GTID 日志事件的 SID 的操作有时会导致未定义的行为。

    我们通过确保 SID 始终被初始化来解决这个问题,即使它属于无效的 GTID 日志事件。(缺陷号 33784022)

  • 复制:MAX_SIZE_LOG_EVENT_STATUS未正确计算状态变量 () 的最大长度

    此处列出了此修复程序中更正的问题:

    • sql_require_primary_key并且 default_table_encryption 需要 2 个字节(一个用于类型 ID,一个用于变量)

    • 的最大长度 time_zone被计算为255而不是MAX_TIME_ZONE_NAME_LENGTH

    • 需要一个额外的字节(each)来保存用户变量的长度,存储的数据库ID的个数 binlog_accessed_db_names,以及微秒的类型

    此外,master_data_written实际上未使用的 已被删除。(缺陷号 33713071)

  • 复制: 在 32 位平台上,设置 binlog_expire_logs_seconds2147483648 () 或更多具有导致在指定时间过去之前清除所有二进制日志的效果。(缺陷号 33670457)231

  • 复制: 如果正在进行组配置更改,则新成员无法加入。此场景中发出的错误消息现在说明正在进行什么操作,例如主要选举、单主模式和多主模式之间的交换或组通信协议的更改。(缺陷号 32766981)

  • 复制: 检查事务提交没有冲突且顺序正确后,组复制向提交会话报告。当事件调度程序线程启动时,组复制无法找到提交会话,导致成员进入ERROR状态并离开组。定位提交会话的过程已扩展为查找守护线程,用于启动事件调度程序线程。感谢娄帅的贡献。(错误#107635,错误#34312482)

  • 复制: 当二进制日志发送方线程在启用心跳的情况下等待更新时,它有时会错过更新信号,因此直到下一个信号发出并被线程注意到时,更改才会被复制。

    我们感谢 Facebook 的贡献。(错误#104491,错误#33176377)

  • replication_optimize_for_static_plugin_config 启用系统变量以提高半同步复制的性能时,RAPID由于通知处理问题,该插件无法在服务器中使用。该问题现已解决。(缺陷号 34549470)

  • 包含许多前导零的字符串在将它们转换为十进制时被错误地标记为溢出,导致返回的值是给定精度和小数位数的最大十进制值。

    0我们通过在转换之前 用单个 , 替换这种情况下的所有前导零来解决此问题。(漏洞#34479194)

  • WSAPollWindows 上的poll()函数与类 Unix 系统上 的函数之间的差异导致Windows 上的线程池代码将无效的文件描述符或套接字视为准备好进行 I/O。(缺陷号 34478731)

  • 如果 MySQL 8.0.27 或更高版本的 MySQL 实例加入了在 MySQL 8.0.26 上运行的复制组, mysql_start_failover_channels_if_primary则删除成员操作以匹配组其余部分的成员操作配置。但是,如果实例升级为在 MySQL 8.0.27 或更高版本上运行,则不会恢复成员操作,除非 group_replication_reset_member_actions()在随后引导该组的服务器上发出。加入成员现在检查成员操作 mysql_start_failover_channels_if_primary是否对他们可用,如果是,则将其添加到他们的成员操作配置中。(漏洞#34464526)

  • SELECT服务器并不总是正确处理查询列表中 使用的常量表达式 。(缺陷号 34418412)

  • 在 中添加了一个缺失的错误检查 Json_table_column::fill_column()。(缺陷号 34416304)

  • 一些接受多个参数的字符串函数没有正确处理所有参数。(缺陷号 34393009)

  • 为保存结果YEAR的临时表创建 的类型的列并不总是保证具有正确的长度。UNION(缺陷号 34370933)

  • 如果一个视图(v1)访问了另一个视图(v2),如果v2被重新创建,则 SHOW COLUMNS FROM v1报告无效视图错误。仅当用户被授予具有角色的全局权限而不是表级权限时,才会出现此问题。如果不存在表级权限,则通过检查全局权限来修复它。(缺陷号 34341533)

  • replication_group_member_actions由于线程之间的冲突, 对 Performance Schema 表的查询 可能会失败。该问题现已解决。(缺陷号 34337673)

  • 在读取 const 表时在项目评估后添加了缺失错误检查。(缺陷号 34327798)

  • 在某些情况下,派生表的重新分析和克隆并不总是正确处理。(错误#34317258,错误#34408241)

  • 当存在多个查询块时,将条件下推到具有集合操作的派生表并不总是能正确处理。(缺陷号 34306361)

  • RSA 密钥创建期间的启动失败导致密钥为空或不完整。现在以故障安全方式生成密钥。(缺陷号 34274914)

  • 当比较两个带有显式 COLLATE子句的字符串值时,它们应该具有相同的排序规则,否则比较应该被拒绝,但这并不总是强制执行的。

    有关详细信息,请参阅 表达式中的排序规则强制性。(缺陷号 34274525)

  • 在服务器实例上启动 Group Replication 时可能会出现死锁,但配置不兼容等错误会导致成员立即离开。服务注册表现在通过避免该问题的替代过程来管理服务的注册和注销。(缺陷号 34194893)

  • CREATE USER由于意外的语法错误,无法在副本服务器上执行从二进制日志读取 的操作。(缺陷号 34178823)

  • 当使用而不是 (参见 SELECT 语句) 时 ,精度不匹配有时会发生在 对整数值 的CASTto操作中。FLOATSQL_SMALL_RESULTSQL_BIG_RESULT

    对于SQL_BIG_RESULT,该值根据 IEEE 32 位浮点值的固有精度被截断,这是正确的行为。使用 SQL_SMALL_RESULT,保留了原始整数值的精度;发生这种情况是因为该值被复制到仅支持双精度值的临时表中,这些值随后被复制回客户端。

    我们通过在将此类值复制到临时表时区分浮点值的类型来解决此问题,以便双精度值存储为 double 类型,单精度值存储为 float 类型。(缺陷号 34167787)

  • codespell在大部分源代码上 执行,并修复了代码注释中报告的拼写错误。(缺陷号 34163323)

  • 在某些情况下,在调用内部函数指针之前检查它时,会验证错误的指针。(缺陷号 34134738)

  • 访问路径和访问迭代器 eq_ref都有一个 use_order成员用于确定是否使用有序索引扫描。由于eq_ref 总是最多返回一行,因此没有必要对其进行排序;因此,use_order在这里没有任何用处,已从访问路径和相应的迭代器中删除。(缺陷号 34122706)

  • 改进了CMake选项,使其在加载单元测试时也能正常工作。(漏洞#34117732)ADD_GDB_INDEX

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

  • 删除了 GNU“黄金”链接器支持,包括关联的 USE_LD_GOLD CMake 选项。(缺陷号 34094324)

  • 在 MySQL 5.7 数据目录(在 MySQL 5.7 中被视为模式目录)中手动创建的目录在目录名称中包含特殊字符,或者在其名称中使用特殊字符创建的模式和表使用 `#mysql50#`前缀导致 DDL 在升级到 MySQL 8.0 后失败。?在MYSQL 8.0中,对象名添加到数据字典时,特殊字符被替换为问号字符( )。名称不匹配导致受影响对象上的 DDL 操作失败。如果遇到无效的模式和表名称,升级现在会停止并出现错误。

    在 MySQL 5.7 中,您可以使用mysqlcheck 将无效的模式和表名更新为有效的编码。要识别无效名称,请运行:

    mysqlcheck --check-upgrade --all-databases

    要修复无效名称,请运行:

    mysqlcheck --fix-db-names --fix-table-names --all-databases

    在 MySQL 5.7 中,具有特殊字符的目录名称也可以使用以下 SQL 语法更新为使用有效编码:

    ALTER DATABASE `directory_name` UPGRADE DATA DIRECTORY NAME;

    (缺陷号 34066605)

  • 使用 null-safe equals operator ( <=>) 的条件现在可以被执行者视为 equijoin 条件。使用此类条件的谓词不被视为等值连接谓词,而是作为连接后评估的额外谓词。(缺陷号 34063499)

  • 添加了对使用 OpenSSL 3 编译 MySQL Enterprise Encryption 组件的支持。(缺陷号 34043029)

  • 在源代码上执行codespell并修复代码注释中报告的拼写错误。(缺陷号 34006439)

  • 当一个或多个参数 GREATEST()为时间值时,它们传递给函数的顺序可能会影响结果。(缺陷号 33996054)

  • 包含嵌套子查询的派生表上的 with a 作为带谓词的子句的一部分 返回SELECT了不 正确的结果。(漏洞#33971286)LEFT JOINWHEREIN

  • 使用 OpenSSL 3.0 编译时调用 和 函数ERR_clear_error()导致 错误vio_ssl_write()ssl_handshake_loop()(缺陷号 33967647)

  • 服务器并不总是按预期处理嵌套视图。(缺陷号 33876690)

  • mysqlpump可能未获得使用派生表(由查询FROM子句生成的表)的正确权限,如果存在这些表,则会导致转储进程停止。派生表现在单独处理,并为它们设置权限。(缺陷号 33866103)

  • SELECT重复执行包含多个 ANDOR或 条件 的子查询 a 的存储例程 XOR会导致过度消耗,并可能最终耗尽虚拟内存。(缺陷号 33852530)

  • EXPLAIN ANALYZE提供有关查询计划中每个迭代器的估计成本和运行时间的信息。我们期望这些数字是累积的,因此给定迭代器的成本(或时间)包括该迭代器所依赖的任何迭代器的成本。例如,连接表 t1和表的估计成本t2,使用表扫描t1后跟主键查找t2,应该不小于扫描成本t1加上基数查找的成本t2

    对于一些涉及具体化或临时表的查询,这些数字不是累积的。此外,在具体化 UNION操作结果并随后对临时(具体化)表执行表扫描时,成本估算不正确。(错误#33834146,错误#34302461)

  • 用于比较两个字符串值的排序规则的强制取决于操作数的顺序。给定一个使用utf8mb4字符集的字符串和一个使用 的字符串,当左操作数为和 左操作数为 时,使用排序规则utf8mb3进行比较。 utf8mb4utf8mb4utf8mb3utf8mb3

    问题的根源在于用于强制转换 ASCII 字符串的特殊处理;由于两个字符串都是文字,因此会扫描它们的 ASCII 和非 ASCII 字符,并根据此设置 repertoire 属性。这意味着一个字符串可能被视为 ASCII 而另一个字符串则不是;当字符串被认为是 ASCII 并因此与它在比较之前被(错误地)转换 utf8mb4的字符串兼容时 。utf8mb3

    我们通过使用内部 MY_CS_PUREASCII属性而不是 MY_REPERTOIRE_ASCII; 来解决这个问题。MY_CS_PUREASCII严格来自字符集,而不是实际的字符串,这使得排序规则的确定具有确定性。现在在这种情况下,两个字符串都没有被识别为 ASCII,这会导致 在执行比较之前转换为,正如预期的那样utf8mb3utf8mb4(缺陷号 33801312)

  • 限制范围 connect_timeout已扩展到完整数据包读取。(缺陷号 33723597)

  • 添加了新的验证以确保事件计划程序按预期在服务器上自动重新启动。(漏洞#33711304)

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

  • 在没有游标的情况下执行准备好的语句时,如果先前的执行使用了游标,它可能会返回错误的结果。通过创建和保存两个查询结果对象解决了此问题,一个用于游标,一个用于不使用游标。这些对象是按需创建的,因此如果准备好的语句从未与游标一起使用,则永远不会创建特定于游标的查询结果对象。(缺陷号 33535746)

  • 带有参数的准备好的语句可能无法更新行,但具有相同数据的相同语句在作为查询发出时确实更新了行。解决该问题的方法是为参数分配默认数据类型,尽管这可能效率低下,因为没有可用于数据类型传播的上下文并且隐式给出了字符串类型。在这种情况下,最佳做法是将此类参数声明包装在CAST提供所需数据类型的子句中。(错误号 33521861)

  • 对于使用 FEDERATED 存储引擎的表,如果本地服务器上的连续查询之间的延迟超过远程服务器的等待超时(wait_timeout设置),则在本地服务器上返回数据包错误。来自远程服务器的超时错误现在由本地服务器正确处理,它重新连接并再次执行该语句。(缺陷号 33500956)

  • 处理了连接优化期间可能出现的意外情况。(缺陷号 31401468)

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

  • 执行后SET @@character_set_client = @@character_set_system,优化器提示未正确解析。(缺陷 #107820,缺陷 #34370403)

  • 当列不是字符串类型时,以布尔模式对表的列执行全文搜索的查询会MyISAM导致调试构建中的断言。这是因为在布尔模式下MyISAM 允许MATCH没有索引的列,因此也允许整数列,这些列会不断传播。使用除此之外的任何存储引擎对表进行的此类查询MyISAM 不受此问题的影响。

    这是通过在列不是字符串类型时禁用子句上的常量传播来解决的 MATCH,这样我们就可以安全地假设它只包含列引用。(错误#107638,错误#34311472)

  • 更正了评论中的错误my_time.cc。感谢 Dimitry Kudryavtsev 的贡献。(错误#107633,错误#34308417)

  • MySQL 8.0.24 对连接错误处理进行了更改,如果出现超出(exceed)等错误 max_allowed_packet导致 mysql客户端与服务器断开连接,则之后不会重置该错误以指示断开连接。后续查询返回原错误,并没有自动重连,因为 mysql客户端没有出现断开连接错误。现在重置错误以指示断开连接并允许客户端重新连接。(缺陷 #107605,缺陷 #34303841)

  • 在 MySQL 8.0.29 中修复错误后,如果在选项文件中提供了密码,如果在登录时指定了该选项,则mysql客户端不会提示输入密码-p 。客户端现在总是在指定选项时提示输入密码-p并使用指定的密码,即使替代选项是从选项文件中填充的。(错误#107205,错误#34134984)

  • 已弃用的服务器选项禁用加密连接的替代方案--ssl=off 没有按照文档或弃用警告中的说明工作。为此,将tls_version系统变量设置为空值 ( tls_version='') 现在可以正常工作。(错误#106459,错误#33858646)

  • 对列的聚合查询BIT 返回了一个格式化为位字符串的值,但也BINARY自动添加了标志。新验证现在检查并跳过设置 结果BINARY标志 BIT。(错误#106241,错误#33781442)

  • SHOW SLAVE STATUS并且SHOW SLAVE HOSTS在引入 SHOW REPLICA STATUSand之后SHOW REPLICA HOSTS比以前使用了更多的 CPU。(错误#105924,错误#33684069)

  • NO_SKIP_SCAN提示提到不用于表跳过扫描的特定索引时,所有其他可能的索引也将被忽略,因此,跳过扫描不用于表上的任何索引。

    NO_SKIP_SCAN发生这种情况是因为如果提示不适用于所有索引,则不会对 跳过扫描的所有可能键执行处理 。(错误#104670,错误#33251616)

  • 随着值列表长度的增加,查询使用的 CPU 时间越来越多。(错误#102037,错误#32311183)WHERE column IN (list)