Documentation Home
MySQL 8.0 发行说明  /  MySQL 8.0.29 的变化(2022-04-26,全面上市)

MySQL 8.0.29 的变化(2022-04-26,全面上市)

重要的

此版本不再可供下载。它被删除是因为一个严重的问题,该问题可能导致 InnoDB添加了列的表中的数据被错误地解释。请改为升级到 MySQL 8.0.30。

认证注意事项

  • 增加了 FIDO 验证器数据的最大大小。(漏洞#33655192)

字符集支持

编译笔记

  • InnoDB: 解决相关问题后,重新启用了 C4100、C4127、C4245 和 C4389 MSVC++ 4 级编译器警告。(错误#33437498,错误#33571677)

  • GCC 11 现在是支持在 EL7 或 EL8 上构建 MySQL 的编译器。该编译器在 devtoolset-11(EL7) 或 gcc-toolset-11(EL8) 包中可用。libmysqlclient还建议在构建基于C API 库的第三方应用程序时使用 GCC 11 。(缺陷号 33730302)

  • 无法使用 Bison 3.8.1 或更新版本编译服务器。(缺陷号 33488047)

弃用和移除说明

  • 重要更改:TIME以前,MySQL 允许在、 DATEDATETIME和 中使用任意定界符和任意数量的分隔符,和 TIMESTAMP中的日期和时间值之前、之后和之间使用任意数量的空格。此行为现​​在已弃用,您应该期望在未来的 MySQL 版本中将其删除。在此版本中,使用任何非标准或过多的定界符或空白字符现在会触发形式为“定界符”在日期时间值“ ”的位置 中位于行 的警告是多余的并且已弃用DATETIMETIMESTAMPcharposvaluerownum,然后是Please remove,或者在可以建议合适的替换的情况下,首选标准 ' replacementchar'

    仅针对文字值中遇到的第一个非标准定界符或空白字符返回弃用警告。此处显示了一个示例:

    mysql> SELECT DATE"2020/02/20";
    +------------------+
    | DATE"2020/02/20" |
    +------------------+
    | 2020-02-20       |
    +------------------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 4095
    Message: Delimiter '/' in position 4 in datetime value '2020/02/20' at row 1 is
    deprecated. Prefer the standard '-'. 
    1 row in set (0.00 sec)

    在严格模式下,此类警告不会升级为错误。

    有关详细信息和示例,请参阅 日期和时间上下文中的字符串和数字文字

  • 复制: 系统replica_parallel_type 变量现已弃用;每当读取或设置此变量,或在中设置等效选项时 my.cnf,服务器现在都会发出弃用警告,如下所示:

    mysql> SELECT @@replica_parallel_type; SHOW WARNINGS\G
    +-------------------------+
    | @@replica_parallel_type |
    +-------------------------+
    | LOGICAL_CLOCK           |
    +-------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    *************************** 1. row ***************************
      Level: Warning
       Code: 1287
    Message: '@@replica_parallel_type' is deprecated and will be removed in a future
    release. 
    1 row in set (0.00 sec)

    --replica-parallel-type您应该期望在未来的 MySQL 版本中删除 此变量和等效的服务器选项 。

  • 系统myisam_repair_threads 变量和myisamchk --parallel-recover选项已弃用;期望在 MySQL 的未来版本中删除对两者的支持。

    1(默认值)以外的值 myisam_repair_threads会产生警告。

  • 服务器系统变量 query_prealloc_sizetransaction_prealloc_size现在已弃用,设置其中一个或两个在 MySQL 服务器中不再有任何影响。预计它们会在未来的 MySQL 版本中被删除。

    有关详细信息,请参阅文档(服务器系统变量) 中对这些变量的描述。

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

  • mysqld--abort-slave-event-count--disconnect-slave-event-count 选项,以前用于测试,生产设置中通常不需要,已被弃用。期望它们在 MySQL 的未来版本中被删除。

SQL 函数和运算符注释

  • 基于将值与 a NULL进行比较的表达式的聚合函数并未正确忽略 NULL。(错误#33624777,错误#105762)

  • 当在优化期间评估聚合函数时,假定WHERE条件已经被评估;因此,它可以被删除。在删除之前,优化器 WHERE通过调用 来验证条件是否具有任何与表无关的条件 make_cond_for_table()。当条件被认为是昂贵的(例如,它使用存储过程)时,会错误地假设存在与表无关的条件。我们通过在调用中排除昂贵的条件来解决这个问题make_cond_for_table()

    此外,评估成本高昂的常量条件(例如f() = 1函数 f()不使用任何表的地方)通常会导致不正确的结果。在大多数情况下,如果一个条件对于执行来说是不变的,那么在优化 WHERE条件时会对其进行评估,如果认为它太昂贵则跳过它。当前问题是由于在优化隐式分组查询时跳过条件而出现的。为避免这种情况,我们现在在聚合之前评估此类条件。(缺陷号 33305617)

  • 函数使用的列 在修复其参数时DEFAULT() 未在内部标记。READ(缺陷号 33142135)

优化器注释

  • 如果正在加载的表的列 在语句内使用的子查询LOAD DATAWHERE子句中使用 SET ,则该列被报告为 unknown. (缺陷号 33714885)

  • 执行索引查找 ( eq_ref) 的聚合查询在某些情况下可能会返回错误的结果。当执行计划使用流聚合而不是临时表中的聚合时,就会出现这种情况。

    我们通过禁用eq_ref聚合节点下的缓存来解决此问题。(漏洞#33491183)

    参考资料:此问题是 Bug #100614、Bug #31790217 的回归。

  • 派生物化表条件下推优化现在可以与大多数联合一起使用。这意味着现在可以将外部 WHERE条件下推到物化派生表或视图的查询表达式的每个查询块。

    假设我们创建表t1t2,然后创建v 基于这两个表的视图,使用如下所示的 SQL 语句:

    CREATE TABLE t1 (
      id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
      c1 INT, 
      KEY i1 (c1)
    );
    
    CREATE TABLE t2 (
      id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
      c1 INT, 
      KEY i1 (c1)
    );
    
    CREATE OR REPLACE VIEW v AS
         SELECT id, c1 FROM t1
         UNION ALL
         SELECT id, c1 FROM t2;

    现在,当SELECT * FROM v WHERE c1 = 12执行查询时,条件c1 = 12被下推到视图的两个查询块 v,如下所示 EXPLAIN

    mysql> EXPLAIN FORMAT=TREE SELECT * FROM v WHERE c1 = 12\G
    *************************** 1. row ***************************
    EXPLAIN: -> Table scan on v  (cost=1.26..2.52 rows=2)
        -> Union materialize  (cost=2.16..3.42 rows=2)
            -> Covering index lookup on t1 using i1 (c1=12)  (cost=0.35 rows=1)
            -> Covering index lookup on t2 using i1 (c1=12)  (cost=0.35 rows=1)
    
    1 row in set (0.00 sec)

    现在可以为大多数UNION查询完成此操作。有关例外情况和其他信息,请参阅 派生条件下推优化。(错误#24012、错误#36802、错误#106006、错误#11746156、错误#11748590、错误#13650627、错误#30587347、错误#33318096、错误#33738597)

性能模式注释

  • 新的 Performance Schema 工具收集有关查询是否在 引擎PRIMARYSECONDARY 引擎上处理的信息,引擎所在的PRIMARY位置 InnoDBSECONDARY 引擎是 HeatWave。此工具旨在与带有 HeatWave 的 MySQL 数据库服务一起使用。

    添加了两个新的 Performance Schema 表列:

    execution_engine还向MySQL Schema sys.processlist的 视图中添加了 一列。sys.x$processlistsys

安全说明

SQL 语法说明

  • IF NOT EXISTS现在支持语句CREATE FUNCTIONCREATE PROCEDURE和 的选项CREATE TRIGGER

    对于CREATE FUNCTION,当用于创建存储函数时,对于CREATE PROCEDURE,如果已经存在同名例程,则此选项可防止发生错误。对于 CREATE FUNCTION,当用于创建可加载函数时,该选项可防止在已存在具有该名称的可加载函数的情况下发生错误。对于CREATE TRIGGER,如果在同一个表和同一个模式中已经存在同名触发器,则该选项可防止发生错误。这是为了提高这些语句在脚本编写、快速(重新)部署、复制和其他可能重复使用的实例中的易用性。

    CREATE DATABASE此增强功能使这些语句的语法与、CREATE TABLECREATE USER和 的语法更加一致CREATE EVENT,所有这些语句都已经支持IF NOT EXISTS。这也为、和IF EXISTS已经支持的选项提供了补充。 DROP PROCEDUREDROP FUNCTIONDROP TRIGGER

    有关详细信息,请参阅存储的对象以及函数名称解析。另请参见 CREATE TABLE ... SELECT 语句的复制。(错误 #15287,错误 #11745440)

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

测试套件说明

  • 现在 heap-use-after-free使用选项检查空指针以减少 Valgrind 下的错误--async-client。(缺陷号 33702755)

XA 交易单据

  • 在某些情况下,组复制会遇到问题,因为无法提交在另一个连接上准备的 XA 事务。为了解决这些问题,MySQL 现在支持分离的 XA 事务;一旦准备好,XA 事务就不再连接到当前会话。这是作为执行的一部分发生的XA PREPARE。准备好的 XA 事务可以由另一个连接提交或回滚,然后当前会话可以启动另一个 XA 或本地事务,而无需等待准备好的 XA 事务完成。

    xa_detach_on_prepare通过将此版本中引入 的系统变量设置为 ,可以禁用对此功能的支持,并恢复经典行为 OFF。默认值为ON,这是推荐的,尤其是在复制设置中。

    您应该知道,当启用分离的 XA 事务支持 ( xa_detach_on_prepare = ON) 时,无法在 XA 事务中使用临时表。

    有关详细信息,请参阅XA 事务状态以及服务器实例配置。(错误#100163,错误#31599926)

X 插件说明

  • 经典 MySQL 协议和 X 协议的 Unix 套接字锁定文件之间的格式差异意味着如果存在其他协议的文件,则服务器无法启动。对于无法手动删除文件的实例(例如 MySQL 数据库服务实例),协议现在对文件使用相同的格式。(缺陷号 31468581)

添加或更改的功能

  • InnoDB:#define为了提高代码质量和方便调试,源中的 实例 InnoDBconstexpr说明符或内联函数取代。

  • InnoDB: InnoDB现在支持 ALTER TABLE ... DROP COLUMN使用 ALGORITHM=INSTANT.

    只支持ALGORITHM=INSTANT 修改数据字典中元数据的操作。表数据不受影响,使操作即时进行。如果未明确指定,ALGORITHM=INSTANT则默认由支持它的 DDL 操作使用。

    在 MySQL 8.0.29 之前,即时添加的列只能添加为表的最后一列。从 MySQL 8.0.29 开始,即时添加的列可以添加到表中的任意位置。

    即时添加或删除的列会创建一个新的行版本。最多允许 64 行版本。表中添加了一个新 TOTAL_ROW_VERSIONSINFORMATION_SCHEMA.INNODB_TABLES 来跟踪行版本数。

    有关支持的 DDL 操作的更多信息 ALGORITHM=INSTANT,请参阅 在线 DDL 操作

  • 复制: 服务器自动清除二进制日志文件现在使用 binlog_expire_logs_auto_purge 此版本中引入的系统变量进行控制。默认情况下,启用自动清除(binlog_expire_logs_auto_purge设置为 ON);要禁用它,请将此变量的值设置为OFF

    清除前等待的时间间隔由 binlog_expire_logs_seconds和 控制expire_logs_days。将这两个系统变量都设置为 0 会停止自动清除,即使 binlog_expire_logs_auto_purge设置为 ON.

  • Microsoft Windows: 在 Windows 上添加了 jemalloc 支持,并为官方 MySQL 二进制文件启用了它。新的WITH_WIN_JEMALLOCCMake 选项接受一个目录,该目录包含 和/或 jemalloc.dll相同目录的目录,其用于内存管理操作。如果未找到或未导出所需函数,则使用标准内存 INFORMATION 级别的日志消息记录是否找到并使用了 jemalloc。 mysqld.exemysqld-debug.exejemalloc.dll

  • clone_delay_after_data_drop 变量允许在远程克隆操作开始时删除接收方 MySQL 服务器实例上的现有数据后立即指定延迟时间。延迟旨在为接收方主机上的文件系统提供足够的时间,以便在从捐赠方 MySQL 服务器实例克隆数据之前释放空间。某些文件系统在后台进程中异步释放空间。在这些文件系统上,在删除现有数据后过早地克隆数据可能会因空间不足而导致克隆操作失败。最长延迟时间为 3600 秒(1 小时)。默认设置为 0(无延迟)。(缺陷号 32826134)

  • group_replication_set_as_primary函数指定指定的组成员作为新的主要成员并覆盖选举过程。以前,该函数等待现有主节点上的所有活动事务结束,包括使用该函数后的传入事务,然后才将当前主节点设置为只读并更改为新的主节点。等待时间没有上限。

    一个可选的timeout参数现在可让您设置运行事务的超时时间。您可以为使用该函数时正在运行的事务设置从 0 秒(立即)到 3600 秒(60 分钟)的超时。超时没有默认设置,因此如果您不设置它,该函数的先前行为仍然适用,等待时间没有上限。当超时到期时,对于任何尚未到达其提交阶段的事务,客户端会话将断开连接,以便事务不会继续。允许完成提交阶段的事务。当您设置超时时,它还会阻止新事务从那时起在主服务器上启动。START TRANSACTIONBEGIN语句)会受到超时、断开连接和传入事务阻塞的影响,即使它们不修改任何数据也是如此。为了允许在函数运行时检查主函数,允许执行不修改数据的单个语句,如 一致性规则下允许的查询中所列。

  • MySQL 服务器现在能够安全地存储包含敏感数据(如私钥或密码)的持久系统变量值,并限制对这些值的查看。目前没有 MySQL 服务器系统变量被标记为敏感,但新功能允许包含敏感数据的系统变量在未来安全地持久化。必须在 MySQL Server 实例上启用密钥环组件以支持持久化系统变量值的安全存储,而不是不支持该功能的密钥环插件。

    在存储持久化系统变量的操作系统文件中,敏感系统变量的名称和值以加密格式存储,连同生成的用于解密它们的文件密钥。生成的文件密钥又使用存储在密钥环中的主密钥进行加密。升级到 MySQL 8.0.29 后,mysqld-auto.cnf 选项文件的格式保持不变,直到第一次发出 SET PERSISTorSET PERSIST ONLY语句,此时它被更改为新的格式,即使涉及的系统变量不敏感。在新格式中,旧版本的 MySQL 服务器无法读取选项文件。

    如果密钥环组件支持在用于设置值时不可用,则 新系统变量 persist_sensitive_variables_in_plaintext 控制是否允许服务器以未加密格式存储敏感系统变量的值。SET PERSIST默认设置 , ON如果密钥环组件支持可用,则对值进行加密,如果不支持,则以未加密的方式(带有警告)持久保存它们。如果无法解密加密的系统变量值,此设置还允许服务器启动,在这种情况下,将使用它们的默认值。什么时候 persist_sensitive_variables_in_plaintext设置为OFF,这是最安全的设置,如果密钥环组件支持不可用,则无法保留敏感的系统变量值,如果无法解密加密的系统变量值,则服务器不会启动。

    敏感系统变量的值在处理时也受到保护。如果SET针对敏感系统变量发出语句,则redacted在将其记录到通用日志和审计日志之前,将重写查询以用“”替换该值。新权限允许持有者查看 Performance Schema 表、 、 和 SENSITIVE_VARIABLES_OBSERVER中敏感系统变量的值,发出 语句以返回它们的值,并在连接的会话跟踪器中跟踪它们的变化。没有此权限的用户无法查看这些系统变量值。 global_variablessession_variablesvariables_by_threadpersisted_variablesSELECT

  • 使用密钥管理互操作性协议 (KMIP) 进行安全通信的密钥环keyring_okv插件与 MySQL 的密钥环服务一起使用,将密钥环数据存储在与 KMIP 兼容的后端密钥环存储产品中,例如 Oracle Key Vault、Gemalto SafeNet KeySecure Appliance、Townsend Alliance Key Manager 和 Entrust KeyControl。该插件现在允许您指定多个备用服务器,以便在主服务器不可用时提供到后端密钥环存储产品的备份连接。您最多可以添加 64 个备用服务器,方法是编辑该 okvclient.ora文件以在值中将服务器的 IP 地址和端口号指定为以逗号分隔的列表STANDBY_SERVER 多变的。该插件遍历备用服务器,直到它可以建立连接,每次连接尝试等待 20 秒。因此,您应该确保备用服务器列表保持简短、准确和最新,并删除不再有效的服务器,因为它们会显着影响keyring_okv 插件的连接时间,从而影响服务器启动时间。

  • 现在,在解析、解析和执行访问或更新此类变量的 SQL 语句的服务器代码中,更好地实施了对系统变量访问的隔离。

  • MySQL 服务器现在默认支持 SSL 会话重用,并通过超时设置来控制服务器维护会话缓存的时间,该会话缓存建立允许客户端请求新连接的会话重用的时间段。所有 MySQL 客户端程序都支持会话重用。有关服务器端和客户端配置信息,请参阅 重用 SSL 会话

    此外,C 应用程序现在可以使用 C API 功能为加密连接启用会话重用(请参阅 SSL 会话重用)。

修正错误

  • InnoDB: 尝试清除具有即时添加列的表的撤消记录时发生故障。(缺陷号 33924532)

  • InnoDB: 不允许高优先级事务在中断时停止等待或在等待锁时超时,防止死锁被解决。在阻塞事务也是高优先级的情况下,现在允许高优先级事务在中断时停止等待或在超过锁定等待超时时间时超时。如果一个阻塞事务不是高优先级的,高优先级事务等待阻塞事务释放它的锁。(缺陷号 33856332)

  • InnoDB: 删除了 Windows 上使用的 AIO 同步队列。同步文件 I/O 读写函数 (SyncFileIO::execute) 已修改为处理为普通 I/O 和重叠 I/O 打开的文件,就像它在 Linux 上所做的那样。(缺陷号 33840645)

  • InnoDB: 在使用立即添加的列截断表的所有分区后,表版本元数据未重置。(缺陷号 33822729)

  • InnoDB:打印有关信号量等待的警告 的srv_error_monitor_thread()函数未能按预期处理长信号量等待。为解决此问题,已将阻塞调用移至更合适的位置。简化和改进了相关的监控线程代码,并为多个服务器线程添加了缺少的关闭信号。

    InnoDB 启用和禁用标准监视器现在独立于用户可设置的 innodb_status_output变量执行。此更改解决了InnoDB在特定情况下启用监视器但未设置回其先前值的问题。感谢 Yuhui Wang 的贡献。(错误#33789526,错误#93878)

  • InnoDB:rec_convert_dtuple_to_rec_old() Valgrind 测试发现InnoDB 源代码 中存在一个差一错误 (缺陷号 33784672)

  • InnoDB:修改了源中函数 的UNIV_DEBUG变体 以改进 Valgrind 错误检测。(缺陷号 33783709)mem_heap_alloc()InnoDB

  • InnoDB: 快速关闭在关闭所有文件之前没有等待所有活动的 I/O 操作完成。(缺陷号 33768584)

  • InnoDB: Clang 警告报告错误放置的 @return命令。(缺陷号 33734011)

  • InnoDB:分区切换时 新记录锁数组(m_prebuilt->new_rec_locks[]) 的值未正确同步,导致锁被释放或未按预期释放导致断言失败。(缺陷号 33724166)

  • InnoDB: 当写请求完成时更新双写缓冲区的函数中的竞争条件导致长信号量等待错误。(缺陷号 33712370)

  • InnoDB: 函数错误地假设更改索引列中的记录总是需要在二级索引中创建新记录,导致与锁相关的断言失败。为了解决这种情况和其他类似情况, lock_rec_convert_impl_to_expl()现在仅当实际持有隐式记录锁时才使用将隐式记录锁转换为显式记录锁的函数。(缺陷号 33657235)

  • InnoDB:InnoDB解决了 源代码中 的许多 Doxygen 问题(缺陷号 33603036)

  • InnoDB: 缺少对索引实例的空指针检查导致失败。(缺陷号 33600109)

  • InnoDB: 在增量备份失败后启动服务器,错误指示页面跟踪不可用。(漏洞#33521528)

  • InnoDB:恢复 期间出现断言失败InnoDB 。失败是由于在可以重置空闲列表和索引列表之前在本地微型事务中释放页面后发生服务器退出。在恢复期间遍历了跨越释放页面的空闲列表和索引列表。(缺陷号 33454557)

  • InnoDB: Bbtr_insert_into_right_sibling()-tree函数,当游标在页面末尾时,将一个元组插入右兄弟页面,由于不正确的锁函数调用导致ACID违规。(缺陷号 33405696)

  • InnoDB: 当使用COMPACTREDUNDANT行格式时,可能会创建一个超过最大行大小的表,这最终可能导致插入数据时出现“行大小太大”错误。BLOB 前缀未包含在操作期间执行的记录大小检查中CREATE TABLE 。(缺陷号 33399379)

  • InnoDB: 检索主加密密钥 ( ) 的函数get_master_key()尝试获取master_key_id_mutex尚未初始化的主密钥 ID 互斥量 ( )。(缺陷号 33067891)

  • InnoDB:lock_sec_rec_read_check_and_lock锁定系统功能中删除了冗余且昂贵的检查,该功能用于在二级索引记录上放置锁。(缺陷号 33059387)

  • InnoDB: 存储TempTable引擎没有正确处理文件已满错误。(缺陷号 32929392)

  • InnoDB:操作中 遇到DDL日志错误 ALTER TABLE ... ALGORITHM=COPY,没有处理,导致后续ALTER TABLE ... ALGORITHM=INPLACE操作失败。(缺陷号 32716838)

  • InnoDB: 清除线程处理了未加载表空间的加密表的撤消记录,导致失败。(缺陷号 32586721)

  • InnoDB: 一个线程发布了一个异步I/O操作并关闭了自己,​​导致操作系统文件操作错误。(缺陷号 30567295)

  • InnoDB:AUTO_INCREMENT超过最大整数列值时生成了 不正确该错误是由于未考虑最大列值造成的。AUTO_INCREMENT 在这种情况下应该返回之前的有效值(错误#87926,错误#26906787)

  • InnoDB: 修改了事务锁优先级,以便持有共享锁并等待升级到独占锁的事务优先于等待同一行上的独占锁的另一个事务。也就是说,已经持有共享锁的事务先被授予排他锁。在这种情况下,在同一行上持有共享锁的其他一些事务仍然可以阻止授予排他锁。

    优化了事务锁系统源中的lock_rec_find_set_bitlock_rec_has_expl函数。(错误#21356,错误#11745929)

  • 分区:.ibd在某些情况下,如果分区文件丢失 ,与 MySQL 服务器建立连接可能会失败(缺陷号 33459653)

  • 分区: 在 MySQL 8.0.17 中完成的工作将所有NOT INNOT EXISTS子查询转换为反连接后,在修剪表分区时不考虑由此转换产生的嵌套外部连接的内部部分。(缺陷号 33060953)

  • 复制: 在设置了复制组中 group_replication_consistency=AFTER,如果选择了一个新的主节点,然后重新启动了先前的主节点,则新的主节点离开该组并显示一条错误消息。已调整延迟视图更改和事务准备的处理以防止出现这种情况。(缺陷号 33755920)

  • 复制: 组复制在自动重新加入过程中检查得太迟,重新加入的成员是唯一允许在错误状态下进入组的实例类型。该问题现已解决。(漏洞#33615493)

  • 复制: 组复制可以在组配置操作运行时记录有关成员加入的警告消息,在没有加入成员的情况下,只有视图更改。现在只在适当的时候记录消息。(缺陷号 33378364)

  • 复制: Group Replication 现在记录当连接到本地 XCom 实例出现问题时返回的操作系统错误,因此更容易解决防火墙阻止连接等问题。(错误#33189767,错误#104523)

  • 复制: 为了帮助防止主选举陷入困境,组复制停止等待任何在选举期间离开组的成员的确认。如果确认等待确认的所有成员都离开了,Group Replication 声明初选成功完成。以前,如果主要成员是离开的成员之一,则主要更改会被错误地表述为在无法发生时已经发生。现在,如果主要成员在选举期间离开,Group Replication 会将主要选举声明为不成功的选举,没有主要更改。(缺陷号 33059773)

  • 复制: 网络提供者停止时造成的死锁可能导致STOP GROUP_REPLICATION某些组成员无限期等待。(缺陷号 33044886)

  • Microsoft Windows: 在 Windows 上,添加了 WinFlexBison 支持。(缺陷号 33788290)

  • 在 EL6/EL7 上,mysql-community-server-debug 安装并未因安装商业软件包而过时。(缺陷号 33956760)

  • 当针对由 cmake 构建系统复制的共享库(例如非系统 OpenSSL)进行构建时,MySQL 服务器不会在 ARM 上构建 EL7。现在--page-size设置为 getconf 报告的。(缺陷号 33904267)

  • 具有特权的匿名用户PROCESS无法从 processlist表中选择行。(缺陷号 33869388)

  • 范围优化器没有考虑会话内存限制。(缺陷号 33869004)

  • 在对子查询进行排序时,同一个文件排序操作可能会执行多次,输入不同,因此最长的附加列可能会在执行之间发生变化,但在必要时不会重新分配该列的缓冲区。现在,当先前分配的缓冲区足够大时,我们重新使用它,否则我们分配一个新的。(缺陷号 33865094)

  • 从在多个查询块中具体化和使用的公用表表达式获得无效结果,其中,在使用 CTE 的第一个查询块中,有多个可能的键定义,这导致内部函数 JOIN::finalize_derived_keys()移动了使用的键进入位置零,第二个查询块使用 CTE 操纵一个索引,该索引占据与为第一个查询块选择的键的原始位置相同的位置。这是 MySQL 8.0.22 中仅准备一次 DML 语句的工作的意外副作用。

    有关详细信息,请参阅WITH(公用表表达式)。(缺陷号 33856374)

  • 改进了执行存储过程和存储函数时的错误处理。(漏洞#33851256)

  • 从视图中选择的触发器并不总是产生预期的结果。(缺陷号 33847722)

  • 加载时区信息时执行的计算需要负值my_time_t. 通常,该类型的最小值为零,对应于 UNIX 纪元的开始(1970-01-01 00:00:00,没有时区偏移),这反映在常量 中MYTIME_MIN_VALUE。这个最小值在所有情况下都无法正确设置 TIME_ZONE_INFO数据结构,因为某些时区偏移量是负数。my_time_t此修复程序在填充时区信息数据库缓存时允许负值。(缺陷号 33837691)

  • SET PERSIST如果 MySQL 实例意外停止或在使用语句记录系统变量设置 后不久重新启动,则配置文件mysqld-auto.cnf可能为空,在这种情况下,服务器无法重新启动。持久化的系统变量现在被写入一个备份文件,只有mysqld-auto.cnf在验证写入成功后才将其重命名为,使原始 mysqld-auto.cnf文件仍然可用。重新启动时,如果找到具有有效内容的备份文件,服务器将从该文件中读取。否则将 mysqld-auto.cnf使用该文件并删除备份文件。(缺陷号 33830493)

  • filesort在计算排序键时并不总是正确检查字符串值的长度。(缺陷号 33830073)

    参考资料:此问题是 Bug #29739778 的回归。

  • 包含GROUP_IDMEMBER_ID列的主键已添加到 mysql.firewall_membership表中。(缺陷号 33824544)

  • 在 MySQL 8.0.20 中修复了 rows matched更新可更新视图时值不一致的问题,该视图WITH CHECK OPTION仅针对单个表的更新处理了此问题。在此版本中,我们还修复了多表 UPDATE语句的问题。(缺陷号 33815426)

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

  • MySQL Server 的链接 ProtoBuf 库已更新至版本 3.19.4。在https://github.com/protocolbuffers/protobuf/releases中描述了新 Protobuf 版本中修复的问题 。(缺陷号 33813846)

  • 可以将无效字符插入 utf32列中。(缺陷号 33810558)

  • 重新安装 MySQL Enterprise Firewall 插件导致失败。失败是由于在插件完全初始化之前调用更新先前持久化的防火墙系统变量。(缺陷号 33809478)

  • VARCHAR使用或 连接列的 散列连接DECIMAL返回过多的行。此处显示了一个使用示例 VARCHAR

    # Create and populate table
    CREATE TABLE t(a VARCHAR(10), b VARCHAR(10));
    INSERT INTO t VALUES ('x', 'xx'), ('xx', 'x');
    
    # No indexes, so uses a hash join
    SELECT * FROM t AS t1, t AS t2 WHERE t1.a = t2.a AND t1.b = t2.b;

    在修复之前,刚刚显示的查询返回了四行;现在它按预期返回两行。(缺陷号 33794977)

  • INFORMATION_SCHEMA.KEY_COLUMN_USAGE 表没有列出不可见的键列。(缺陷号 33781534)

  • 服务器在访问从视图创建的视图后未执行正确的清理。(缺陷号 33777821)

  • 在一个分组查询中WITH ROLLUP,使用一个窗口函数对列表中已经存在的聚合SELECT进行排序,在解析窗口的排序子句时,一个额外的(和不必要的)聚合被添加为隐藏列。(缺陷号 33769911)

  • 对于有效的非常量值(从数据库行读取的数据而不是硬编码值) ,数据屏蔽mask_ssn() 函数返回了“字符串参数宽度太大”错误。此外,未对零长度常量和非常量值(空字符串)或太小的常量值执行验证。这些问题已针对所有使用长度边界输入字符串的数据屏蔽函数得到解决。(缺陷号 33759276)

  • ROLLUP在某些情况下使用ORDER BY窗口函数处理不正确。(缺陷号 33753245)

  • 更正了 Doxygen 评论中的一些问题。(错误#33734001、错误#33734035、错误#33734062、错误#33734075、错误#33734104、错误#33734117、错误#33734129、错误#33734143、错误#33734155、错误#33734181、错误#34138、错误#37、73)

  • 无法解析的语句(例如,由于语法错误)不再写入慢速查询日志。(缺陷号 33732907)

  • 描述 MySQL Enterprise Thread Pool 初始配置的消息现在作为 SYSTEM 消息而不是信息性消息发布,因此它在默认日志记录级别可见。(缺陷号 33729821)

  • 与会话跟踪相关的预锁定优化在某些情况下导致递归锁定。(缺陷号 33728209)

  • 当涉及IN子查询的联合也使用ORDER BY子句时,并不总是能正确处理它。(缺陷号 33725507)

  • 当使用命令行选项请求密码提示时, mysqlpump客户端实用程序可能会意外停止。如果在此过程中遇到错误,则会在客户端退出之前返回适当的错误消息。(缺陷号 33688141)

  • 实施标准包政策,为以下平台提供单独的 debuginfo RPM:SLES/openSUSE,以及社区 EL6 和 EL7。EL6 和 EL7 的商业版本现在使用 RelWithDebInfo 构建类型而不是 Debug 构建,这大大减小了它们的大小。(错误#33663811、错误#33684418、错误#33664929)

  • 无法在mysqld启用跟踪日志的情况下运行。(缺陷号 33653824)

  • 当该--fido-register-factor选项在启动时用于 FIDO 设备注册时, mysql客户端可能会在语句中使用不正确的语法ALTER USER,从而导致失败。该问题现已解决。(缺陷号 33650498)

  • 搜索SET列值时,作为第一个参数传递给的用户变量 FIND_IN_SET()不会产生与以相同方式使用的常量值相同的结果。

    示例:考虑如下所示 t1创建和填充的表:

    CREATE TABLE t1 (c1 SET('a', 'b', 'c', 'd'));
    
    INSERT INTO t1 (c1) VALUES ('a, c, d'), ('c');

    显示的值varstr在以下查询的输出的两行中应该相同,但不是:

    SET @a = 'c';
    
    SELECT FIND_IN_SET(@a, c1) AS var, FIND_IN_SET('c', c1) AS str FROM t1;

    现在我们确保在这种情况下返回匹配项在用于列定义的集合中的位置,无论查找的值是常量还是列值。(缺陷号 33635637)

  • SET PASSWORD使用支持它的身份验证方法 的操作会产生警告而不是预期的错误。(缺陷号 33635445)

  • 如果在 MySQL 服务器启动时未指定插件目录,并且用户尝试注册 FIDO 设备,则 mysql客户端意外停止。现在已经处理了这种情况,并报告了相应的错误。(漏洞#33631144)

  • MySQL 8.0.27 中所做的更改将 EXPLAIN复合访问路径的输出(包括过滤和排序)从表路径内部移动到MATERIALIZE访问路径,但未包含INDEX_RANGE_SCAN在复合访问路径中。在某些情况下,这可能会导致未定义的行为。(漏洞#33611545)

    参考资料:此问题是 Bug #32788576 的回归。

  • 无法撤销 DROP对性能模式的特权。(缺陷号 33578113)

  • 内部CreateIteratorFromAccessPath() 函数已被重写,不再使用递归;这有望在执行查询时显着减少堆栈使用。(缺陷号 33569770)

  • 尝试 FIDO 设备注册时出现质询-响应错误时,mysql客户端可能会意外停止。该问题现已解决。(缺陷号 33568944)

  • 准备好的语句或存储函数执行 的INFORMATION_SCHEMA.FILESor 查询返回了陈旧数据。INFORMATION_SCHEMA.TABLES数据更改后报告缓存数据。(错误#33538106,错误#105450)

  • 查询在满足以下所有条件时返回错误结果:

    • 结果集包含一个具有不确定元素的列。

    • 该列未引用表格。

    • 有隐式分组。

    • 查询计划使用了来自临时表的聚合。这个临时表是空的。

    t给定一个包含 column 的空表c1,该语句INSERT INTO t SELECT MAX(t.c1), RAND(0) AS x FROM t提供了此类查询的示例;通过插入到同一个表中,我们确保查询计划从临时表聚合。临时表有一列 for c1,(单个)结果行c1从临时表的第一行中选取。如果临时表为空,则没有第一行,c1变为0;这导致插入(NULL, 0) 而不是,例如,(NULL, 0.155)插入 t

    我们通过不将此类列存储在临时表中来解决此问题。(缺陷号 33535379)

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

  • 在 MySQL 8.0.27 中更改密码处理后,如果 mysql客户端被 Ctrl + C中断,则可能会发出密码提示,要求用户输入密码才能执行中断。现在,在响应提示时提供密码(以及在启动时在命令行上提供密码时)时会记录密码,因此为中断建立的新连接可以自动使用它。(缺陷号 33514253)

  • 内部keyread标志指示只读取索引条目而不是完整的行。当在初始化期间为索引合并扫描设置此标志时,它随后在初始化作为索引合并扫描的一部分选择的各个范围扫描时被重置,这表明读取行而不是索引条目。我们通过在读取索引条目时将选择的索引设置为覆盖索引来解决此问题。(缺陷号 33499071)

  • 克隆页面压缩表时数据复制停止,其中捐赠主机上的压缩数据大小等于接收主机上的可用磁盘空间。在接收主机上打出的孔小于页面大小,导致磁盘碎片限制了可用于克隆数据的空间量。修改了在接收主机上处理页面压缩表的过程,以减少碎片并提高数据复制速度。

    为了提高刷新率,克隆插件现在在 fsync支持打孔的文件系统上刷新页面压缩表时使用 flush 方法。(缺陷号 33482747)

  • 在创建视图时,当子查询被认为是常量时,可能会在解析期间对其进行评估。(缺陷号 33438883)

  • 名义上,在 EXPLAIN FORMAT=TREE输出中,我们仅将行数写为整数。对于零结果,很难确定这是 0.49 还是 0.00001,因此在这种情况下我们增加足够的精度以获得一位前导数字。(缺陷号 33426283)

  • VALUES在某些情况下没有按规定运行。(缺陷号 33414289)

  • 在调试版本中,当在或 的上下文中使用时 ,类型的用户变量的某些组合会 MYSQL_TYPE_DOUBLE命中断言。(缺陷号 33406728)CAST()CONVERT()

  • 设置多个等式时,优化器在不需要时添加了外部引用。(缺陷号 33394701)

  • 用于 MySQL 构建的 Boost 库的最低支持版本现已提高到 1.77.0。(缺陷号 33353637)

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

  • 从类中删除了 冗余init和 功能代码。(错误#33339129,错误#104915)checkout_access_mapsSecurity_context

  • sys 架构视图 schema_unused_indexes未正确更新。

    schema_unused_indexes从 检索未使用的索引信息 table_io_waits_summary_by_index_usage,如果索引用于查询表中不存在的行,则不返回任何数据。

    从此版本开始, schema_unused_indexes即使未找到该行也会更新。(缺陷号 33302400)

  • 一些使用公用表表达式的查询未被正确处理EXPLAIN。(缺陷号 33300271)

  • 服务器没有为某些复杂查询正确获取索引统计信息。(缺陷号 33270516)

  • 在某些情况下,执行时TRUNCATE TABLE performance_schema.status_by_thread;可能会出现竞争条件。

    我们感谢 Facebook 对此修复做出的贡献。(缺陷号 33165726)

  • 页面清理器线程在等待对大型表的全文索引创建操作所持有的索引页的独占锁时超时。(缺陷号 33101844)

  • 对于InnoDB表,二级索引被扩展为包含表的主键;也就是说,所有属于主键的列都被标记为属于所有二级索引的一部分。一个例外是当二级索引被定义为唯一时,服务器不使用主键扩展。这可能会导致在为动态范围扫描设置读取集时出现问题。我们通过确保在唯一二级索引的情况下将所有主键部分包含在读取集中来解决此问题。(缺陷号 33101025)

    参考资料:此问题是 Bug #30417361 的回归。

  • 引用不存在的表的现有外键约束可能会在创建或重命名表后导致连接错误。(缺陷号 33054071)

  • VALUES在执行语句期间 为空创建值列表 时INSERT ,添加了一个隐藏元素,随后导致调试版本中的断言。VALUES为了解决这个问题,我们现在在创建列表 时跳过所有隐藏元素。

    有关详细信息,请参阅INSERT ... ON DUPLICATE KEY UPDATE 语句。(缺陷号 32774799)

  • SELECT列出作为表达式一部分的项目的 别名ORDER BY未以与独立别名相同的方式解析,因此 已正确解析,但未正确解析 。(缺陷号 32695670)ORDER BY aliasORDER BY function(alias)

  • 来自空的或不存在的密钥环源(由指定 keyring_file_data)的离线密钥环迁移似乎成功完成,没有警告。密钥环迁移过程现在会在获取密钥时检查错误。如果在指定的密钥环源中未找到密钥,则会向错误日志写入一条警告消息,指示该密钥环没有密钥。(缺陷号 32327411)

  • 当删除一个始终为真的条件时,引用视图的子查询被删除,即使子查询本身在查询的其他地方被引用。(缺陷号 31946448)

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

  • 如果语句与 包含派生表EXPLAIN的多表语句一起使用,可能会导致服务器退出。UPDATE(缺陷号 31884434)

  • 如果mysqldump--order-by-primary用于带有该选项的多个表, 则会发生内存泄漏。分配给每个表的行排序的内存现在在每个表之后释放,而不是只释放一次。(错误#30042589,错误#96178)

  • mysqld_safe日志消息文本错误已得到纠正。感谢中国移动的 Bin Wang 做出的贡献。(错误#106590,错误#33903639)

  • 等效查询可能会返回不同的结果,因为执行路径略有不同。例如, Item::val_int_from_string()字符串 Item_string::val_int()到整数的转换应该使用相同的算法。(错误#106517,错误#33881339)

  • 更新了 CMake 规则以处理已弃用的 PermissionsStartOnlysystemd 选项。在 systemd 231(2016 年 7 月)中添加了备用可执行文件前缀,而在 systemd 240(2018 年 12 月)中弃用了 PermissionsStartOnly。现在在可用的地方使用首选的可执行文件前缀。(错误#106468,错误#33862323)

  • 在 MySQL 8.0.22 中完成了为物化派生表实现条件下推的工作之后,在某些情况下,带有聚合函数的隐式分组查询返回一个空集而不是NULL. (错误#106414,错误#33838439)

  • 准备好并执行的查询(例如'SELECT ?' 使用DATETIMEDATETIMETIMESTAMP作为绑定参数)可能会返回错误的列类型。通过恢复先前重新准备此类查询的逻辑来为每个动态参数提供其文字值,该问题已得到解决。(错误#106352,错误#33813951)

    参考资料:此问题是 Bug #32915973 的回归。

  • 空安全比较 ( ≪=>) 未正确评估 TIMESTAMP触发器中的列。(错误#106286,错误#33790919)

    参考:这个问题是 Bug #32942327 的回归。

  • DECIMAL值写入哈希连接缓冲区时,首先对值进行规范化。在某些情况下,此规范化可能会无意中更改值,从而使值落入错误的哈希桶并导致从连接返回不正确的结果。

    问题在于标准化以导致某些值丢失一些最低有效数字的方式删除了前导零。我们通过计算所需精度并传递计算值而不是更改原始值来解决此问题。(错误#106272,错误#33787914)

  • WHERE条件为 、具有 列 、和 以及列并 创建为 的查询未返回正确结果。进一步的调查表明,在这种情况下,当 to 的第二个或第三个参数 是 时,比较结果是相反的,导致它评估 as for和 for 。(错误#106267,错误#33788832)c NOT BETWEEN NULL AND COALESCE(a, b)DATETIMEabcacNOT NULLBETWEENNULLNULLFALSEFALSENULL

  • 0 ( FALSE) 和NULLcould return 之间的 NULL 安全比较TRUE,即使负责评估此类对象的实现永远不会产生NULL并且应该始终返回 FALSE。(错误#105773,错误#33630225)

  • 构造函数使用主线程内存根来分配键,而不是使用与分配对象本身QUICK_RANGE相同的内存根 。QUICK_RANGE当使用查询计划的范围检查执行多个查询时,这会导致意外的高内存使用率。(错误#105331,错误#33516707)

    参考资料:另请参阅:Bug #28805105、Bug #28857990。

  • SELECT DISTINCTVARCHAR 当使用 TempTable 存储引擎 ( ) 时,当列包含一个空字符串和一个由单个空白字符组成的字符串时,在该列上返回 2 个不同的值。使用 排序规则时,此行为不正确;选择不同的值时应该忽略尾随空格。 internal_tmp_mem_storage_engine = TempTableutf8_binPAD SPACE

    对于使用存储引擎创建的临时表 TempTable,这两个字符串被散列为不同的值,因为 TempTable散列函数总是将零长度数据散列为0. (在刚才描述的情况下,空字符串被散列为,0 而来自另一个字符串的空格字符用于生成非零散列值。)

    现在通过删除TempTable存储引擎散列函数中对零长度数据的任何特殊处理来解决此问题。

    感谢 Brian Yue 的贡献。(错误#105316,错误#33506241)

  • SELECT COUNT(*)使用多值索引报告了错误的行数。(错误#104898,错误#33334928)

  • 测试程序因Too many connectionsmain.ssl-big失败 。

    我们感谢 Facebook 的贡献。(错误#104377、错误#33139204、错误#33165693)

  • MySQL 支持的两种直方图,singleton 和 equi-height,之前将它们的桶集合分别存储在一个 map 和一个 set 中。此版本更改了两种直方图类型,现在它们将存储桶存储在动态数组中,这减少了空间开销并加快了选择性估计,因为在对存储桶执行二进制搜索时减少了间接性。

    因为这两种类型的直方图都是通过按排序顺序插入桶来构造的,并且桶是按排序顺序序列化为 JSON 的,所以切换到动态数组时不需要额外的工作。(错误#104109,错误#33045204)

  • 有符号变量和无符号变量之间的无效转换导致 form 查询的结果不正确SELECT ALL t1.c1,t2.c1 FROM t1,t2 WHERE t1.c1 > t2.c1。(错误#102025,错误#32302724)

  • 从这个版本开始,性能模式是排序规则感知的(Bug #98545,Bug #30881109)

  • ROLE在 的列中 插入大于 32 字节的数据时,可能会发生断言错误setup_actors。从此版本开始,该ROLE列从 CHAR(32) 增加到 CHAR(96)。(错误#74678,错误#19947842)