Documentation Home
MySQL 8.0 发行说明  /  MySQL 8.0.26 的变化(2021-07-20,正式发布)

MySQL 8.0.26 的变化(2021-07-20,正式发布)

审核日志说明

  • 以前,MySQL Enterprise Audit 记录的每个事件都包含 SQL 语句文本。为了提供替代方案(因为语句可能包含敏感信息),审计日志过滤语言现在支持记录语句的摘要而不是其文字文本。例如,而不是记录此语句:

    SELECT * FROM orders WHERE some_sensitive_column=1234567

    审计日志插件可以记录这个摘要:

    SELECT * FROM `orders` WHERE `some_sensitive_column` = ?

    这类似于已为准备好的语句记录的内容,其中出现参数标记而不是实际数据值。

    要执行摘要日志记录,请使用审计过滤器定义,将语句文字文本替换为相应的摘要,如 事件字段值的替换中所述

    因为文本替换发生在早期审计阶段(在过滤期间),所以无论稍后写入的日志格式如何(即审计日志插件是否生成 XML 或 JSON 输出),都可以选择是记录语句文字文本还是摘要值。(缺陷号 31482609)

  • 对于 MySQL Enterprise Audit,新的 audit_log_format_unix_timestamp 系统变量允许time 在每个审计记录中包含一个字段。字段值是一个整数,表示 UNIX 时间戳值,指示生成审计事件的日期和时间。该time 字段仅支持 JSON 格式的日志文件。

  • 对于 MySQL Enterprise Audit,新的 audit_log_max_size系统变量启用了基于组合日志文件大小的审计日志文件修剪。要产生效果, audit_log_max_size要求audit_log_rotate_on_size 大于 0。如果为真,则修剪算法 audit_log_max_size与 结合使用 audit_log_prune_seconds,其中非零值 audit_log_max_size优先于 的非零值 audit_log_prune_seconds。具体参见审计日志文件的空间管理

认证注意事项

  • 以前,作为服务器发送给客户端的hello数据包的一部分,服务器发送的是服务器端身份验证插件的名称,而不是客户端插件的名称。服务器现在发送客户端名称,这更适合客户端的需要并且可能有助于避免额外的协议往返。

编译笔记

  • macOS: 现在可以在 ARM 上为 macOS 11 构建 MySQL(即适用于 Apple M1 系统)。(错误#32386050,错误#102259)

  • 在 openSUSE 15 和 SLES 15 上构建现在需要 GCC 9,可以在软件包gcc-9gcc9-c++.

    在 SLES 12 上构建现在需要 GCC 10,可在软件包 gcc-10gcc10-c++.

    libmysqlclient还建议在构建基于C API 库 的第三方应用程序时使用指定的 GCC 版本 。(错误#32886268,错误#32886439)

  • 在 Ubuntu 18.04(仿生)上构建现在需要 GCC 8,可以在软件包gcc-8g++-8. libmysqlclient还建议在构建基于C API 库的第三方应用程序时使用 GCC 8 。(缺陷号 32877062)

  • 现在可以使用 GCC 10 在 Solaris 上构建 MySQL,它成为默认和推荐的编译器。libmysqlclient还建议在构建基于C API 库的第三方应用程序时使用 GCC 10 。(缺陷号 32552988)

组件注释

  • 新的组件服务使服务器组件能够设置系统变量值。有关此服务的信息,请参阅 MySQL Server Doxygen 文档, 网址为https://mysql.net.cn/doc/index-other.html(搜索 s_mysql_mysql_system_variable_update_stringmysql_system_variable_update_string_imp)。

弃用和移除说明

  • TLSv1 和 TLSv1.1 连接协议现在已弃用,对它们的支持可能会在未来的 MySQL 版本中删除。(有关背景信息,请参阅 IETF 备忘录 弃用 TLSv1.0 和 TLSv1.1。)建议使用更安全的 TLSv1.2 和 TLSv1.3 协议建立连接。TLSv1.3 要求 MySQL 服务器和客户端应用程序都使用 OpenSSL 1.1.1 或更高版本进行编译。

    在服务器端,此弃用具有以下影响:

    • 如果为tls_versionor admin_tls_version系统变量分配了一个包含已弃用的 TLS 协议的值,则服务器会为每个已弃用的协议生成警告:

      • 如果分配发生在服务器启动期间,则警告会出现在错误日志中。

      • 如果赋值发生在运行时,警告将添加到执行 ALTER INSTANCE RELOAD TLS 语句的结果中。

    • 如果客户端使用已弃用的 TLS 协议成功连接,则服务器会将警告写入错误日志。

    在客户端,弃用没有明显效果。如果配置为允许弃用的 TLS 协议,则客户端不会发出警告。这包括:

    (缺陷号 32565996)

  • 该系统变量 transaction_write_set_extraction现已弃用,如果您尝试设置它或读取它的值,则会发出一条警告消息。系统变量将在未来的 MySQL 版本中删除。此系统变量用于具有多线程副本的复制源服务器,以指定用于散列为事务的写入集提取的写入的算法。XXHASH64算法是MySQL 8.0默认的,Group Replication需要的,在没有使用系统变量的情况下选择。

  • temptable_use_mmap变量现已弃用,并可能在未来的 MySQL 版本中删除。

  • MySQL 中的 TLS 支持一直在朝着使用命名的 TLS 参数集的通道模型发展,这些参数集适用于不同的安全端口或协议。例如,要查询特定 TLS 通道的状态,请使用 Performance Schema tls_channel_status表:

    mysql> SELECT VALUE FROM performance_schema.tls_channel_status
           WHERE CHANNEL = 'mysql_main' AND PROPERTY = 'Enabled';
    +-------+
    | VALUE |
    +-------+
    | Yes   |
    +-------+

    这使得整体上适用于 TLS 支持的整体参数不太适用,因此以下选项和系统变量现在已弃用,并可能在未来的 MySQL 版本中删除:

    默认情况下启用--ssl--admin-ssl选项,因此通常无需指定它们。作为以否定形式指定这些选项的替代方法,如果需要禁用主界面或管理界面的加密连接,请将相应的 TLS 版本系统变量设置为空值以指示不支持任何 TLS 版本。例如,服务器 my.cnf文件中的这些行禁用了两个接口的加密连接:

    [mysqld]
    tls_version=''
    admin_tls_version=''

错误处理

  • 写入服务器错误日志的客户端超时信息现在包括(如果可用)超时值以及客户端用户和主机。(错误#31581289,错误#100112)

活动安排说明

  • 如果启用了事件调度程序,则启用 super_read_only系统变量会阻止它更新数据字典表中的事件最后执行 时间戳。events这会导致 Event Scheduler 在将消息写入服务器错误日志后,在下次尝试执行计划的事件时停止。

    以前,如果启用 super_read_only导致 Event Scheduler 停止,那么在随后禁用之后 super_read_only,必须通过再次启用它来手动重新启动 Event Scheduler。为方便起见,服务器现在会在禁用read_only或 时根据需要自动重新启动事件调度程序 。super_read_only(缺陷号 31633859)

防火墙注意事项

  • 在 MySQL 8.0.23 中,MySQL Enterprise Firewall 实现了组配置文件,每个配置文件都可以应用于多个帐户,此外还有以前实现的每个帐户配置文件都适用于单个帐户。请参阅使用 MySQL 企业防火墙

    具有单个成员帐户的组配置文件在逻辑上等同于该帐户的帐户配置文件,因此可以专门使用组配置文件来管理防火墙,而不是混合使用帐户和组配置文件。对于新的防火墙安装,这是通过统一创建新配置文件作为组配置文件并避免帐户配置文件来实现的。对于已包含帐户配置文件的防火墙安装的升级,MySQL Enterprise Firewall 现在包含一个存储过程 sp_migrate_firewall_user_to_group(),用于将帐户配置文件转换为组配置文件。

    由于组配置文件提供了更大的灵活性,与帐户配置文件相关的防火墙的所有方面现在都已弃用,并可能在未来的 MySQL 版本中删除:

    • INFORMATION_SCHEMA表: MYSQL_FIREWALL_USERSMYSQL_FIREWALL_WHITELIST

    • mysql系统模式表: firewall_usersfirewall_whitelist

    • mysql系统架构存储过程: sp_reload_firewall_rules(), sp_set_firewall_mode()

    • 可加载函数: read_firewall_users(), read_firewall_whitelist(), set_firewall_mode()

    此外,如果服务器在启动时检测到帐户配置文件,它会为每个成功加载的帐户配置文件写一条警告。

    有关将帐户配置文件转换为组配置文件(您应该在方便时尽早执行)的信息,请参阅将 帐户配置文件迁移到组配置文件

包装说明

  • 包含curl而不是链接到系统curl库的二进制包已升级为使用curl7.77.0。(缺陷号 33077562)

  • 对于 Ubuntu 软件包, mysqld的 AppArmor 配置文件在 PID 和套接字文件名方面过于严格,并且对于未使用配置文件中的确切名称的服务器来说失败了。现在配置文件适用于文件所在的目录,使其能够适用于不同的文件名和多个服务器。(缺陷号 32857611)

  • dh-systemd软件包已从 Ubuntu 21.04 中删除,因此已从为该发行版构建的 MySQL 软件包中删除了对它的依赖。(缺陷号 32688072)

  • 对于 Debian 软件包,EnvironmentFile 添加了一个指令,使 systemd 服务能够从 /etc/default/mysql文件中读取环境变量(如果存在)。(错误#32082863,错误#101363)

  • Debian 软件包现在使用/run而不是 /var/run路径名。(缺陷号 31955638)

  • 捆绑lz4库已升级到 1.9.3 版。(漏洞#29747853)

  • 对于 Debian 软件包,update-alternatives 增加了 MySQL 配置文件的优先级,以确保它替换先前安装的发行版中的现有文件。(漏洞 #29606955)

可插拔认证

  • Linux: MySQL Enterprise Edition 现在支持一种身份验证方法,使用户能够使用 Kerberos 向 MySQL Server 进行身份验证,前提是提供或可以获得适当的 Kerberos 票证。它仅在运行 Linux 的 MySQL 服务器和客户端主机上可用,但可以访问在非 Linux 主机上运行的 Kerberos 服务。有关详细信息,请参阅 Kerberos 可插入身份验证

    authentication_kerberos这种身份验证方法在服务器端和authentication_kerberos_client客户端 使用一对插件 。服务器端 Kerberos 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版。这使来自任何发行版的客户端都可以连接到加载了服务器端插件的服务器。

服务器管理

  • 设置 innodb_strict_mode系统变量的会话值现在是受限操作,会话用户必须具有足够的权限才能设置受限会话变量。

    有关设置受限会话变量所需权限的信息,请参阅 系统变量权限。(缺陷号 32944980)

空间数据支持

X 插件说明

  • 当 X DevAPISession.run_sql()方法用于执行返回多个结果的查询时,由于缓存问题,该result.columns 属性未更新以反映活动结果中存在的列,尽管该 result.column_names属性已更新。(缺陷号 32887586)

  • 在升级过程中,X Plugin 记录了一条消息,指出一旦分配了 TCP 端口和 UNIX 套接字,它就可以连接了。但是,直到升级过程完成后才能真正接受连接。该消息现在仅在升级完成后发出。(缺陷号 32814997)

添加或更改的功能

  • Incompatible Change: 从 MySQL 8.0.26 开始,为大多数包含术语 master的剩余标识符提供了新的别名或替换名称,更改为 sourceslave,改为 replica;和mts(对于 多线程从属),更改为 mta(对于多线程应用程序”). 帮助文本也会在适用的地方更改为使用新名称。

    以下名称替换在性能模式表、进程列表和副本状态信息中可见。这些更改与早期版本不兼容。使用这些检测名称的监控工具可能会受到影响:

    • 检测锁(互斥锁),在带有前缀的 mutex_instancesPerformance events_waits_*Schema 表中可见wait/synch/mutex/

    • 读/写锁,在带有前缀的 rwlock_instancesevents_waits_*Performance Schema 表中可见wait/synch/rwlock/

    • 检测条件变量,在带有前缀的 cond_instancesPerformance events_waits_*Schema 表中可见wait/synch/cond/

    • 检测内存分配,在 memory_summary_*带有前缀的性能模式表中可见memory/sql/

    • threads 线程名称,在带有前缀 的性能模式表中可见thread/sql/

    • events_stages_*线程阶段,在带有前缀的性能模式表 中可见,在和 性能 模式表stage/sql/中没有前缀,语句的输出 ,信息模式 表和慢查询日志 threadsprocesslistSHOW PROCESSLISTprocesslist

    • events_statements_history*线程命令,在和 events_statements_summary_*_by_event_name Performance Schema 表中 可见, 前缀为, 在 Performance Schema 表statement/com/中不带前缀,语句的输出 ,Information Schema 表,以及语句 的输出threadsprocesslistSHOW PROCESSLISTprocesslistSHOW REPLICA STATUS

    如果不兼容的更改确实对您有影响,您可以将新的系统变量设置 terminology_use_previousBEFORE_8_0_26以使 MySQL 服务器使用先前列表中指定的对象的旧版本名称。这使得依赖旧名称的监视工具能够继续工作,直到它们可以更新为使用新名称。可以使用会话范围设置系统变量以支持单个功能,或将全局范围设置为所有新会话的默认值。使用全局范围时,慢速查询日志包含名称的旧版本。

    对于半同步复制,您可以选择使用新版本还是旧版本的系统变量和状态变量。提供了实现半同步复制的插件的新版本,一个用于源服务器,一个用于副本,将术语主从替换为源和副本,您可以安装这些版本而不是旧版本:

    • 源的rpl_semi_sync_master插件(semisync_master.so库)有一个新版本 rpl_semi_sync_sourcesemisync_source.so库)

    • 副本的rpl_semi_sync_slave插件(semisync_slave.so库)有一个新版本 rpl_semi_sync_replicasemisync_replica.so库)

    您不能在一个实例上同时安装新旧版本的相关插件。如果你使用新版本的插件,新的系统变量和状态变量可用,旧的不可用。如果您使用旧版本的插件,旧的系统变量和状态变量可用,但新的不可用。

    以下内部使用的项目被转换为使用新术语,但没有外部化给用户或监控工具,MySQL 服务器在内部处理任何必要的解决方案:

    • 源代码中的 C++ 文件名

    • C++ 文件中的标头保护

    • 调试符号

    • 副本在连接到复制源服务器时在复制协议握手中传递的用户变量(副本设置旧名称和新名称)

    以下类别的标识符有一个新别名,使用旧名称时会发出弃用警告,尽管旧名称继续有效。这两个名称在 Performance Schema 表和状态显示中都可用,并且在阅读这些时不会发出弃用警告。新的别名不受新系统变量的影响, terminology_use_previous设置后仍然可以使用:

    • 包含术语 masterslavemts的系统变量,除了一些已经弃用或计划弃用的,以及 NDB 定义的那些。如果使用 SET PERSIST 语句保留这些系统变量,则保留旧名称和新名称,而不管语句中指定的是哪一个。使用 RESET PERSIST 语句,两者都被重置。

    • 包含术语 masterslavemts的状态变量, NDB 定义的除外。

    • mysqld的 命令行选项包含术语masterslavemts,但一些已经弃用或计划弃用的选项以及 NDB 定义的除外。

    • mysqladmin的 命令行选项包含术语masterslavemts

    • 包含术语masterslavemts ”的mysqlbinlog的 命令行选项。

    • 包含术语masterslavemts ”的mysqldump的 命令行选项。

    • 包含术语 master的 SQL 函数。

    具有新别名(或在半同步复制的情况下,替换)的标识符的完整列表如下:

    • 系统变量:

      • master_verify_checksum现在有了别名source_verify_checksum

      • sync_master_info现在有了别名 sync_source_info

      • init_slave现在有了别名 init_replica

      • rpl_stop_slave_timeout现在有了别名rpl_stop_replica_timeout

      • log_slow_slave_statements现在有了别名log_slow_replica_statements

      • slave_max_allowed_packet现在有了别名replica_max_allowed_packet

      • slave_compressed_protocol现在有了别名replica_compressed_protocol

      • slave_exec_mode现在有了别名 replica_exec_mode

      • slave_type_conversions现在有了别名replica_type_conversions

      • slave_sql_verify_checksum现在有了别名replica_sql_verify_checksum

      • slave_parallel_type现在有了别名 replica_parallel_type

      • slave_preserve_commit_order现在有了别名 replica_preserve_commit_order

      • log_slave_updates现在有了别名 log_replica_updates

      • slave_allow_batching现在有了别名replica_allow_batching

      • slave_load_tmpdir现在有了别名 replica_load_tmpdir

      • slave_net_timeout现在有了别名 replica_net_timeout

      • sql_slave_skip_counter现在有了别名sql_replica_skip_counter

      • slave_skip_errors现在有了别名 replica_skip_errors

      • slave_checkpoint_period现在有了别名replica_checkpoint_period

      • slave_checkpoint_group现在有了别名replica_checkpoint_group

      • slave_transaction_retries现在有了别名replica_transaction_retries

      • slave_parallel_workers现在有了别名replica_parallel_workers

      • slave_pending_jobs_size_max现在有了别名 replica_pending_jobs_size_max

      • pseudo_slave_mode现在有了别名 pseudo_replica_mode

      • skip_slave_start现在有了别名 skip_replica_start

    • 如果newrpl_semi_sync_sourcerpl_semi_sync_replicaplugins用于半同步复制:

      • rpl_semi_sync_slave_enabled被替换为 rpl_semi_sync_replica_enabled

      • rpl_semi_sync_slave_trace_level被替换为 rpl_semi_sync_replica_trace_level

      • rpl_semi_sync_master_wait_for_slave_count 被 rpl_semi_sync_source_wait_for_replica_count 取代

      • rpl_semi_sync_master_enabled被替换为 rpl_semi_sync_source_enabled

      • rpl_semi_sync_master_timeout被替换为 rpl_semi_sync_source_timeout

      • rpl_semi_sync_master_trace_level被替换为 rpl_semi_sync_source_trace_level

      • rpl_semi_sync_master_wait_point被替换为 rpl_semi_sync_source_wait_point

    • 以下系统变量未更改:

      • ndb_slave_conflict_role(NDB 系统变量没有改变)

      • binlog_rotate_encryption_master_key_at_startup (“万能钥匙”是一个公认的术语)

      • slave_rows_search_algorithms(此系统变量已被弃用)

      • master_info_repository(此系统变量已被弃用)

    • 状态变量:

      • Slave_open_temp_tables现在有了别名Replica_open_temp_tables

      • Slave_rows_last_search_algorithm_used 现在有了别名 Replica_rows_last_search_algorithm_used

    • 如果新的 rpl_semi_sync_source 和 rpl_semi_sync_replica 插件用于半同步复制:

      • Rpl_semi_sync_slave_status被替换为 Rpl_semi_sync_replica_status

      • Rpl_semi_sync_master_status被替换为 Rpl_semi_sync_source_status

      • Rpl_semi_sync_master_clients被替换为 Rpl_semi_sync_source_clients

      • Rpl_semi_sync_master_yes_tx被替换为 Rpl_semi_sync_source_yes_tx

      • Rpl_semi_sync_master_no_tx被替换为 Rpl_semi_sync_source_no_tx

      • Rpl_semi_sync_master_wait_sessions被替换为 Rpl_semi_sync_source_wait_sessions

      • Rpl_semi_sync_master_no_times被替换为 Rpl_semi_sync_source_no_times

      • Rpl_semi_sync_master_timefunc_failures 被替换为 Rpl_semi_sync_source_timefunc_failures

      • Rpl_semi_sync_master_wait_pos_backtraverse 被替换为 Rpl_semi_sync_source_wait_pos_backtraverse

      • Rpl_semi_sync_master_tx_wait_time被替换为 Rpl_semi_sync_source_tx_wait_time

      • Rpl_semi_sync_master_tx_waits被替换为 Rpl_semi_sync_source_tx_waits

      • Rpl_semi_sync_master_tx_avg_wait_time 被替换为 Rpl_semi_sync_source_tx_avg_wait_time

      • Rpl_semi_sync_master_net_wait_time被替换为 Rpl_semi_sync_source_net_wait_time

      • Rpl_semi_sync_master_net_waits被替换为 Rpl_semi_sync_source_net_waits

      • Rpl_semi_sync_master_net_avg_wait_time 被替换为 Rpl_semi_sync_source_net_avg_wait_time

    • NDB 相关的状态变量没有改变。

    • 对于mysqld,上面列表中所有带别名和替换的系统变量的命令行版本都具有等效的命令行别名或替换,加上以下不是系统变量的命令行选项:

      • show-slave-auth-info有别名 show-replica-auth-info

    • 以下命令行选项未更改:

      • abort-slave-event-count(此命令行选项计划弃用)

      • disconnect-slave-event-count(此命令行选项计划弃用)

      • master-info-file(此命令行选项已弃用)

      • master-retry-count(此命令行选项已弃用)

    • 对于mysqladmin,选项 start-slave现在有别名 start-replica,选项 stop-slave现在有别名 stop-replica

    • 对于mysqlbinlog,该选项 read-from-remote-master现在具有别名 read-from-remote-source

    • 对于 mysqldump,以下命令行选项具有新的别名:

      • apply-slave-statements现在有了别名apply-replica-statements

      • delete-master-logs现在有了别名 delete-source-logs

      • dump-slave现在有了别名 dump-replica

      • include-master-host-port现在有了别名include-source-host-port

      • master-data现在有了别名 source-data

    • 内置的 SQL 函数MASTER_POS_WAIT 有一个新的别名SOURCE_POS_WAIT

  • InnoDB: 新的 innodb_segment_reserve_factor 系统变量允许配置保留为空页的表空间文件段页的百分比。有关详细信息,请参阅 配置保留文件段页面的百分比

    感谢 Facebook 的贡献。(错误#32312743,错误#102044)

  • 下载 Boost 的 URL 已更新。感谢 Marcelo Altmann 的贡献。(错误#32856104,错误#103611)

  • 克隆插件现在允许从供体 MySQL 服务器实例克隆到相同版本和版本的修补程序 MySQL 服务器实例。以前,修补程序服务器实例未被识别为相同的 MySQL 版本和发行版。(缺陷号 32523635)

  • 这些语句现在报告utf8mb3而不是utf8在编写字符集名称时: EXPLAIN, SHOW CREATE PROCEDURE, SHOW CREATE EVENT

    从数据字典检索的存储程序定义现在报告utf8mb3而不是 utf8字符集引用。这会影响从这些定义产生的任何输出,例如 SHOW CREATE语句。

    此错误消息现在报告utf8mb3而不是utf8在写入字符集名称时: ER_INVALID_CHARACTER_STRING。(错误#32233614、错误#32392077、错误#32392209、错误#32428538、错误#32428598)

  • 对于 Group Replication,单主模式下的组现在可以配置为保持超级只读模式,这样它只接受复制的事务,不接受来自客户端的任何直接写入。此设置意味着当一个组的目的是为另一个组提供辅助备份以实现容灾时,您可以确保辅助组与第一个保持同步。您可以将组配置为在选择新的主节点时保持超级只读模式,方法是禁用通常在主节点上删除该模式的操作。

    管理员可以使用新的组复制功能 group_replication_enable_member_action和 以这种方式配置组group_replication_disable_member_action,这可以启用和禁用组成员在特定情况下采取的操作。只要安装了 Group Replication 插件,这些功能也可以在不属于组的服务器上使用。成员操作在主节点上配置,并使用组消息传播到其他组成员和加入成员。另一个功能 group_replication_reset_member_actions可用于将成员操作配置重置为所有成员操作的默认设置。

  • 您现在可以选择一个替代 UUID 来构成 GTID 的一部分,当组复制的内部生成的视图更改事务 ( View_change_log_event) 写入二进制日志时使用这些 GTID。新的 Group Replication 系统变量 group_replication_view_change_uuid指定了一个 UUID,该 UUID 用于代替组名( group_replication_group_name系统变量)。备用 UUID 可以更轻松地将视图更改事件与组从客户端接收的事务区分开来。如果您的设置允许在组之间进行故障转移,并且您需要识别和丢弃特定于备份组的事务,这将很有用。请注意,该组的所有成员必须指定相同的备用 UUID,因此以这种方式设置的组不能包含 MySQL 8.0.26 以下版本的成员。

  • 在支持fdatasync()系统调用的平台上,新 innodb_use_fdatasync变量允许使用fdatasync()而不是 fsync()用于操作系统刷新。除非 fdatasync()后续数据检索需要,否则系统调用不会刷新对文件元数据的更改,从而提供潜在的性能优势。innodb_use_fdatasync可以使用语句动态设置 变量 SET

修正错误

  • 不兼容的更改: 在触发器主体中,INSERTUPDATE包含 或SET子句可能会引发断言或导致服务器退出。不再允许此类分配。(缺陷号 32803211)OLDNEW

  • 性能: 用于在列之间复制值的内部函数已得到改进,这样当值具有相似类型时,不再执行不必要的计算。使用此增强功能,使用临时表的查询应该明显更快。我们的内部测试表明,此类查询的执行速度比以前快了 11%;与往常一样,您的结果可能与这些不同,具体取决于环境、配置和其他因素。(缺陷号 32742537)

  • InnoDB: 为了减少错误日志中不必要的警告消息的数量,源代码中的 fil_space_acquire()函数 InnoDB已尽可能替换为 fil_space_acquire_silent()函数。(缺陷号 32944543)

  • InnoDB:源中 的TRX_FORCE_ROLLBACK_ASYNC标志 InnoDB,指示事务是异步回滚还是由拥有线程回滚,被发现是多余的并已被删除。(漏洞#32912595)

  • InnoDB:在 InnoDB 源中 使用ut_delete符号而不是 UT_DELETE宏导致禁用性能模式内存跟踪的构建失败 (-DDISABLE_PSI_MEMORY=ON)。(缺陷号 32910699)

  • InnoDB:源中的 字典系统mutex_entermutex_exit调用 InnoDB分别重命名为 dict_sys_mutex_enter()dict_sys_mutex_exit()。(缺陷号 32907980)

  • InnoDB: 遗留UNIV_INLINEUNIV_MATERIALIZE工件已从 InnoDB源中删除。 UNIV_HOTBACKUP已添加到某些头文件中的方法声明中。(缺陷号 32894165)

  • InnoDB:lock_sys分片 rw_lock索引使用函数生成的随机索引值 ,ut_rnd_interval()这对于低并发工作负载来说不是最优的。(缺陷号 32880577)

  • InnoDB:innodb_redo_log_encrypt 未正确处理变量 的字符串值设置 (缺陷号 32851525)

  • InnoDB:引入了 读写事务集 (trx_sys->rw_trx_set) 分片,每个都有一个专用的互斥锁,以减轻trx_sys->mutex事务集插入和删除引起的事务系统互斥锁 () 争用。相关的改进包括将事务集修饰符移动到不太关键的位置,消除 TrxUndoRsegs构造函数内部的堆分配,将事务状态 (trx->state) 和事务开始时间 (trx->start_time) 字段转换为std::atomic字段,以及新的断言代码来验证对事务进行操作的线程。(漏洞#32832196)

  • InnoDB:InnoDB修改了memcached GET命令 的记录缓冲区逻辑(缺陷号 32828352)

  • InnoDB:源中 的ut_list基本成员 InnoDB现在使用列表类型的元素部分定位列表节点,而不是在运行时将成员指针存储在列表的基本节点中,这会浪费资源。该补丁还包括其他 ut_list相关代码改进。(缺陷号 32820458)

  • InnoDB: 从 MySQL 5.6 升级到 MySQL 5.7 并在启用 undo log truncation 的情况下启动服务器后,innodb_undo_log_truncate=ON在启动 undo tablespace truncate 操作时发生死锁。死锁导致长时间的信号量等待和最终失败。从 MySQL 5.6 直接升级到 MySQL 5.7.35 或更高版本可避免此潜在问题。(缺陷号 32800020)

  • InnoDB: 引入了 PSI_memory_key 标识符的类型安全增强。Performance Schema 使用 PSI_memory_key 标识符来检测内存操作。通过此增强功能, 库函数能够在编译时报告类型错误。(缺陷号 32797838)ut::aligned_name

  • InnoDB: 优化buf_get_LRU_mutex()函数以避免从刷新列表中刷新时不必要地获取LRU互斥量。(错误#32797451,错误#103391)

  • InnoDB: 在调试版本中,对 Fil_shard::m_deleted_spaces(删除的表空间向量)的访问不受 Fil_shard互斥锁保护,导致失败。(缺陷号 32792816)

  • InnoDB:在具有 2GB RAM 的机器上 启用 innodb_dedicated_server会导致创建单个重做日志文件,从而导致启动失败。修改了 innodb_dedicated_server 自动配置逻辑以确保至少创建两个日志文件。

    感谢 Adam Cable 的贡献。(错误#32788772,错误#103372)

  • InnoDB: 在向表中添加过多列的操作后截断分区表时发生故障,超过了列限制。现在在ADD COLUMN允许操作之前评估添加的列数。(错误#32788564,错误#103363)

  • InnoDB: 在支持磁盘接近满的打孔的平台上,创建具有较大 AUTOEXTEND_SIZE设置的表空间可能会导致设备上没有空间故障和随后的 InnoDB恢复失败。(缺陷号 32771235)

  • InnoDB: 事务请求的表锁列表(trx->lock.table_locks),它是事务锁列表(trx->lock.trx_locks)的子集,已被删除。事务请求的表锁现在列在事务锁列表的开头。(缺陷号 32762881)

  • InnoDB: 恢复过程中出现故障,磁盘快满了,导致数据处于不一致状态。失败发生在fil_tablespace_redo_extend() 用于重做表空间扩展操作的函数中。(错误#32749974,错误#32748733)

  • InnoDB: 在脱机重新定位每个表的文件表空间并InnoDB使用该 innodb_directories选项 ALTER TABLE,使用该算法的操作因COPY存储引擎错误而失败。失败是由于重命名检查,它搜索数据目录而不是新目录位置。(缺陷号 32721533)

  • InnoDB: ut_allocator()解决了 C++ 标准模板库 (STL) 的合规性问题。(缺陷号 32715698)

  • InnoDB:源 中实例ut_allocator::allocate()std::vectorInnoDB无法跟踪隐式执行的内存分配和释放 std::vector。其他 C++ 标准模板库 (STL) 和类似 STL 的数据结构也存在同样的问题。(缺陷号 32715688)

  • InnoDB:源代码中 的 ut_allocator::construct()接口InnoDB是一个以 C++11 之前的风格实现的自定义接口,造成了不必要的开销。该接口不是必需的,已被删除。(缺陷号 32715381)

  • InnoDB:源中 的ut_list长度成员变量 InnoDB被原子字段替换,以允许无锁访问而没有未定义的行为。默认ut_list构造函数已替换为执行所有列表初始化的新构造函数。(缺陷号 32715371)

  • InnoDB:源中 的ut_allocator()内存不足报告机制InnoDB不可靠,已被删除。(缺陷号 32715359)

  • InnoDB: 性能模式元数据的隐式处理是为ut_allocator::allocate_large()ut_allocator::deallocate_large()函数InnoDB。此修改使 Performance Schema 元数据处理与类似分配函数的元数据处理保持一致。(缺陷号 32714144)

  • InnoDB: 停顿是由并发SELECT COUNT(*)查询引起的,其中并行读取线程的数量超过了机器核心的数量。为 MySQL 8.0.24 中的 Windows 版本提供了针对此问题的补丁。MySQL 8.0.26 补丁解决了其他受影响平台上的相同问题。(缺陷号 32678019)

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

  • InnoDB: 为了避免对 rec_get_offsets()确定记录中每个字段的偏移量的函数进行昂贵的调用,将偏移量缓存扩展到满足某些要求的索引,例如具有固定长度、无虚拟列、即时列等。(缺陷号 32673649)

  • InnoDB: 当使用 MySQL Enterprise Backup 恢复的数据目录启动服务器时,双写缓冲区(由 innodb_doublewrite变量控制)在下一次服务器重新启动之前保持禁用状态。(缺陷号 32642866)

  • InnoDB: 创建大量表时遇到打开的文件过多”错误。(缺陷号 32634620)

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

  • InnoDB: InnoDB由于页面跟踪系统恢复失败,恢复无法继续,这应该是非阻塞的。(缺陷号 32630875)

  • InnoDB:InnoDB机械缓存插件源 中解决了整数下溢问题 (错误#32620378,错误#32620398)

  • InnoDB: 当事务开始等待锁时, InnoDB锁系统向服务器提供有关当前持有锁的事务的信息,但在释放锁并将其分配给另一个等待事务后未能通知服务器。因此,如果第三个事务在初始等待事务之后提交,则复制应用程序线程协调器无法检测到预期事务提交顺序中可能发生的潜在死锁。(缺陷号 32618301)

  • InnoDB: 将记录插入唯一二级索引时,为防止并发事务将冲突记录插入受影响的范围而采取的索引记录锁包括对该范围后的第一条记录的不必要的间隙锁。(缺陷号 32617942)

  • InnoDB: InnoDB创建动态分配的过度对齐类型的代码已被 库函数取代。(漏洞#32601599)ut::aligned_name

  • InnoDB: 属于处理过度对齐类型动态存储的 API 的内存分配函数( 库函数)被扩展为支持使用 Performance Schema 的内存跟踪。源配置选项启用内存跟踪模块 。 ut::aligned_nameHAVE_PSI_MEMORY_INTERFACE

    API 中添加了一个aligned_zalloc()库函数,它为零初始化内存分配提供支持。(缺陷号 32600981)

    参考资料:另请参阅:Bug #32601599、Bug #32246061、Bug #32246200。

  • InnoDB:InnoDB现在支持以生成直方图统计为目的的数据 采样,InnoDB. 以前,仅使用READ UNCOMMITTED隔离级别执行采样。(缺陷号 32555575)

  • InnoDB:在使用行格式 定义的表上允许键前缀长度大于 767 字节 REDUNDANT的索引,超过了该行格式的索引键前缀长度限制。添加索引的 ALTER TABLE操作验证了 innodb_default_row_format 变量定义的行格式的索引键前缀长度,而不是表的实际行格式。此修复可确保针对正确的行格式验证索引键前缀长度。(错误#32507117,错误#102597)

  • InnoDB: 自适应哈希索引闩锁未提供有意义的闩锁位置信息。(缺陷号 32477773)

  • InnoDB: 删除了与服务器初始化时重做和撤消日志加密相关的依赖项。(缺陷号 32476724)

  • InnoDB: 在线缓冲池大小调整操作释放了先前的缓冲池页面哈希,与需要先前页面哈希的并发缓冲池查找冲突。(缺陷号 32460315)

  • InnoDB: 使用TempTable存储引擎(internal_tmp_mem_storage_engine=TempTable)时,由于存储索引列字段位置的内部变量溢出,列表中超过255个聚合函数SELECT 导致错误。(错误#32458104,错误#102468)

  • InnoDB: 在具有大型缓冲池的实例上执行撤消表空间截断操作时,工作负载停止。截断标记的撤消表空间的函数现在采用共享闩锁而不是独占闩锁,并且共享闩锁的使用时间更短。(错误#32353863,错误#102143)

  • InnoDB: 添加了一个编程接口来处理过度对齐类型的动态存储。(错误#32246200,错误#32246061)

  • InnoDB: 在某些情况下, InnoDB恢复期间的故障可能会导致已提交的更改丢失。恢复期间允许的检查点不处理页面刷新、刷新列表维护或对数据字典表缓冲区的持久更改,这是正确检查点操作所必需的。因此,在重做日志恢复完成并且数据字典动态元数据 (srv_dict_metadata) 被传输到数据字典表 (dict_table_t) 对象。如果重做日志在恢复期间或恢复后(但在数据字典动态元数据传输到数据字典表对象之前)由于此更改而用完空间,则 innodb_force_recovery可能需要重新启动,至少从 SRV_FORCE_NO_IBUF_MERGE设置开始,或者,失败的情况下,SRV_FORCE_NO_LOG_REDO 设置。如果 innodb_force_recovery在这种情况下重新启动失败,则可能需要从备份中恢复。(错误号 32200595)

  • InnoDB: 回滚段现在在启动期间并行初始化。以前,回滚段是串行初始化的。

    感谢郑来和腾讯云原生数据库团队提交的本次漏洞修复的贡献。(错误#32170127,错误#101658)

  • InnoDB: 在测试 innodb_log_writer_threads 变量配置时发生故障。失败是由竞争条件引起的。(缺陷号 32129814)

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

  • InnoDB: 在截断撤消表空间的清除线程和查询该INFORMATION_SCHEMA.FILES表的服务器线程之间发生了竞争条件。结果,被截断的撤消表空间在查询时没有出现在 撤消表空间文件位置INFORMATION_SCHEMA.FILES对表的依赖性而导致 MySQL Enterprise Backup 失败 INFORMATION_SCHEMA.FILES(错误#32104924,错误#32654667)

  • InnoDB: 当 DML 操作集中在单个表上时,清除工作由单个清除线程执行,如果 DML 操作涉及大对象值,这可能会导致清除操作变慢、清除滞后增加以及表空间文件大小增加。innodb_max_purge_lag为解决此问题,当清除延迟超过设置时,清除工作现在会在可用的清除线程之间自动重新分配 (缺陷号 32089028)

  • InnoDB: 填充表的函数 INFORMATION_SCHEMA.INNODB_TABLESPACES访问文件的空间并执行不受保护的 stat()操作和文件大小信息的检索。(缺陷号 32025344)

  • InnoDB:修改了源 代码中与trx_t::is_recovered标志InnoDB,以解决各种复杂性和正确性问题。其中一个解决的问题导致 XA 事务被错误地描述为“已恢复,当客户端会话在 之后与 XA 事务断开连接时会发生这种情况XA PREPARE。(缺陷号 31870582)

  • InnoDB:Indexed_cells成员函数 ( 的 TempTable 调试断言代码 cell_from_mysql_buf_index_read()未考虑长度为零的不可空列。(缺陷号 31091089)

  • InnoDB: 使用 InnoDB memcached 插件,尝试在单个 get 命令中检索多个值返回了不正确的值。(缺陷 #29675958,缺陷 #95032)

  • InnoDB: 引入trx_sys_t::serialisation_mutex是为了减少 trx_sys_t::mutex. 新的互斥锁在 trx_sys_t::serialisation_list分配事务号时保护 ,这以前由trx_sys_t::mutex.

    感谢翟伟祥的贡献。(缺陷 #27933068,缺陷 #90643)

  • 分区: 当表被分区 子句中TIMESTAMP使用带有时区偏移量的时间戳文字时,结果集中可能会省略分区。 WHERESELECT

    当在时间戳字面量中指定时区偏移量时,它应该被转换为没有时区偏移量的时间戳,然后与时间戳列进行比较,但这在所有情况下都没有正确完成,结果是可以在选择要为查询扫描的分区时修剪分区。

    我们通过确保在与列中的值进行比较之前始终按照所述转换带有时区偏移量的时间戳来解决此问题。(缺陷 #101530,缺陷 #32134145)

  • 复制: 当在复制通道的语句 SOURCE_CONNECTION_AUTO_FAILOVER=1 上设置该选项时语句不会停止监视通道上连接失败的监视线程,并且可能会错误地停止应用程序线程。(缺陷号 32892977)CHANGE REPLICATION SOURCE TOSTOP REPLICA IO_THREAD

  • Replication:设置 系统变量 replication_optimize_for_static_plugin_config 后,Group Replication和半同步复制的插件在服务器关闭时无法卸载干净。(缺陷号 32798287)

  • Replication: 在Group Replication的单主模式下,在数据序列化的过程中会创建不必要的事务数据副本。现在只需一步即可完成,以减少内存占用。(缺陷号 32781945)

  • 复制: MySQL 的半同步复制在向源发送回复后未正确清理连接人工制品,导致不匹配,这意味着必须重新建立连接。该问题现已解决。(缺陷号 32759421)

  • 复制:START GROUP_REPLICATIONSTOP GROUP_REPLICATION语句在组的视图更改发生的同时发出时,可能会发生死锁。(错误#32738137,错误#32836868)

  • 复制: 代码中不正确的默认值意味着复制组允许的 IP 地址白名单已隐式重新配置,尽管未提供任何值。(缺陷号 32714911)

  • 复制:STOP GROUP_REPLICATION如果在组成员上的复制通道试图提交事务时发出语句,则 可能会发生死锁服务器现在如果不能获取到相关的锁就立即回滚事务,而不是等待锁和提交完成而导致死锁。(漏洞#32633176)

  • 复制: 在多线程副本上,重试事务时,对活动事件的引用有时管理不当。(缺陷号 32590974)

  • 复制: 以前,如果复制事务上的原始提交时间戳比应用它的副本上的即时提交时间戳更新,则会将警告消息写入错误日志。如果复制滞后的波动与所涉及机器之间的时钟差异具有相似的值,则消息可能会不恰当地出现,这可以通过它们之间更好质量的连接来实现。在 Group Replication 故障转移过程中,可能会为每个事务返回一条消息,从而淹没日志。为避免这种情况,警告信息已被撤回。(缺陷号 32554807)

  • Replication: 对超过128个分区的表的最后一个分区进行DML操作后,MySQL Server和MySQL客户端(如mysqlbinlog)错误解析二进制日志中的事件信息,导致分区ID不准确。现在使用与字节顺序无关的事件读取器函数读取信息。(错误#32358736,错误#102191)

  • 复制: 在新的 MySQL 服务器安装中, mysql.gtid_executed系统表缺少STATS_PERSISTENT=0禁用持久统计信息的属性,该属性存在于其他与复制相关的表中。(缺陷号 32250735)

  • 复制: 当表中的同一行被同一事件多次更新时,复制应用程序的哈希扫描算法将省略检查 JSON 部分更新,这些更新在 binlog_row_value_options=PARTIAL_JSON设置时记录。这可能会导致复制停止并出现未找到密钥错误。(缺陷号 32221703)

  • 复制: 副本服务器现在在应用和提交与其关联的事务之前检查并验证 GTID 的事务 ID 部分。(缺陷号 32103192)

  • 复制:设置 了 Group Replication 系统变量 group_replication_consistency = AFTER后,如果视图更改事件被延迟到本地准备的事务完成之后,可能会对其应用不同的 GTID,从而导致复制错误。数据现在按照与接收到的顺序相同的顺序进行处理,以避免出现这种情况。(缺陷号 31872708)

  • 复制: 如果用于计算事务依赖性的写入集哈希中省略了唯一的辅助键,则复制可能会在多线程副本上停止,从而导致在多线程副本上执行事务时出错。写入集哈希现在始终包含唯一的辅助键,即使它们不包含在读取集和写入集中。(缺陷号 31636339)

  • 复制: 在多线程副本(带有slave_parallel_workers > 0)上,GTID 自动定位用于检查丢失事务的算法在其计算过程中为事件位置短暂设置一个低值 (4)。如果操作在那一刻停止,解决事务序列中的间隙的恢复过程可能会失败。当使用 GTID 自动定位时,解决间隙的过程实际上并不是必需的,因此在这种情况下该过程现在已被禁用。

    因此,在多线程副本上,当使用语句GTID_MODE = ON为实例 SOURCE_AUTO_POSITION设置和为通道设置时CHANGE REPLICATION SOURCE TO ,以下行为现在适用:

    • 一条START REPLICA UNTIL SQL_AFTER_MTS_GAPS 语句在找到第一个要执行的事件时只会停止应用程序线程,并且不会尝试检查事务序列中的间隙。

    • 如果CHANGE REPLICATION SOURCE TO事务序列中存在间隙,语句不会自动失败。

    这些更改的行为仅适用于使用 GTID 和 GTID 自动定位的多线程副本,而不适用于使用基于二进制日志位置的复制的副本。(错误#30571587,错误#97694)

  • Microsoft Windows: 写入 Windows 事件日志可能会失败。(缺陷号 32890918)

  • JSON: 从使用存储引擎的表中读取 JSON 值 CSV引发错误,例如Cannot create a JSON value from a string with CHARACTER SET 'binary'。发生这种情况是因为 CSV引擎使用 my_charset_binas 记录缓冲区的字符集,但 JSON值的创建包括对 的显式检查my_charset_bin,如果给出此字符集,则会引发错误。

    我们通过传递列的实际字符集而不是保存数据的缓冲区的字符集来处理这个问题,它始终是二进制的。(错误#102843,错误#32597017)

  • 当查询是 的一部分时,可以应用派生条件下推优化的查询并未如此优化 INSERT ... SELECT。(错误号 32959186)

  • 对于大量帐户和模式,访问权限信息的导入操作变得非常缓慢。(缺陷号 32934351)

  • 需要对全文索引扫描结果进行排序的查询在某些情况下未得到正确处理。(缺陷号 32924198)

  • 感谢王晓宇对代码的修正 PFS_notification_registry::is_empty()。(错误#32919118,错误#103788)

  • 在子查询中包含GROUP BYORDER BYLIMIT并使用游标访问的查询可能会导致服务器退出。(缺陷号 32918240)

  • 当使用--help--verbose选项调用时, mysqldauto.cnf在当前目录中创建一个 文件。(缺陷号 32906164)

  • 涉及将具有视图引用的条件向下推送到物化派生表的查询可能会导致服务器退出。(错误#32905044,错误#32324234)

  • 错误消息 ER_CANT_INITIALIZE_UDF可能会被截断。(缺陷号 32891703)

  • 在 MySQL 8.0.23 中执行的流聚合(GROUP BY已排序的数据)的简化中发现了回归。

    我们按如下方式解决此问题:当作为全文搜索主题的单个表上存在隐式分组时,我们现在强制插入临时表以在将临时表 MATCH()发送到之前实现临时表AggregateIterator,因为它会尝试保存和恢复它收到的行,但不能正确包含全文搜索信息,因为它是隐藏的。(缺陷号 32889491)

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

  • 对于-DBL_MAX字符串和双精度的转换,新的双精度值与原始值不同,并被拒绝为越界。(错误#32888982,错误#103709)

  • 现在,只要JSON_LENGTH() 函数包含可选path 参数,服务器就会将其重写为 JSON_LENGTH(JSON_EXTRACT(doc, path)). 这意味着JSON_LENGTH()现在支持路径中的通配符(例如$.*)和数组范围,如下所示:

    mysql> SELECT JSON_LENGTH('[1,2,3,4,5,6,7]', '$[2 to 4]') AS x;
    +------+
    | x    |
    +------+
    |    3 |
    +------+

    (缺陷号 32877703)

  • 对于通常用于 RPM 和 Debian 软件包的标志,新的 CMake选项控制是否将这些标志添加到这些平台上的独立构建中。默认是非 调试构建。这用于 强化构建;例如,通过添加 . (缺陷号 32876974)WITH_PACKAGE_FLAGS ON-D_FORTIFY_SOURCE=2

  • NULLIF()函数没有执行所有必要的错误检查。(缺陷号 32865008)

  • 对于依赖于其他视图的视图, SHOW CREATE VIEW在生成转储文件期间使用的语句的输出可能会在还原时导致错误。(错误#32854203,错误#103583)

  • 查询属性代码未正确处理大型 64 位数字。(缺陷号 32847269)

  • 从 Performance Schema 表中检索的信息 对于外键和 约束metadata_locks可能不正确。CHECK(错误#32832004,错误#103532)

  • 在为视图列生成唯一名称时,服务器现在只考虑那些名称可见的对象。(缺陷号 32821372)

  • 将条件下推到物化派生表时,派生表表达式的克隆将替换条件中的列(来自外部查询块)。当克隆项包含一个FULLTEXT函数时,它被添加到外部查询块而不是派生表查询块,这导致了问题。为了解决这个问题,我们现在使用派生查询块来克隆这些项目。(缺陷号 32820437)

  • 在语句中多次使用的公共表表达式,至少在子查询中使用一次,由于始终为真或始终为假,随后在解析过程中被删除。(错误#32813547,错误#32813554)

  • 如果针对在准备时持久但在首次执行时临时的表准备语句,则可能会引发断言。(缺陷号 32799797)

  • 空间函数使用的内部函数可以在释放内存后引用内存。(缺陷号 32793104)

  • impossible filter优化删除了相应 BKA 访问路径所需的 MRR 访问路径 。(缺陷号 32787415)

  • 如果构建了任何相应的服务器身份验证插件,则会自动启用 新的 CMake选项。因此,它的值取决于其他CMake选项,不应明确设置。(缺陷号 32778378)WITH_AUTHENTICATION_CLIENT_PLUGINS

  • MRR 迭代器通常NULL 通过检查过滤掉键impossible_null_ref(),但是当连接条件包含IS NULL谓词或使用 NULL-safe equals operator ≪=>时,优化器必须检查连接条件是否使用谓词项作为其连接条件的一部分,而不是HA_MRR_NO_NULL_ENDPOINTS在这种情况下设置内部标志 。现在我们使用位掩码检查键中的每一列是否拒绝NULL,在这种情况下我们可以设置 HA_MRR_NO_NULL_ENDPOINTS而无需进一步检查。(缺陷号 32774281)

  • 对于具有枚举类型的系统变量, 保留数值而不是符号名称。(缺陷号 32761053)SET PERSIST_ONLY var_name = DEFAULT

  • X DevAPI 操作 Collection.replaceOne 和 Collection.addOrReplaceOne 现在验证 _id文档中字段 的值是否与id为操作指定的参数匹配。如果不是,则返回错误。(缺陷号 32753547)

  • 对于使用 C API 执行准备语句的应用程序,查询属性不能用于没有参数的准备语句。(错误#32753030、错误#32790714、错误#32955044)

  • 的参数IN()并不总是转换为正确的字符集。(缺陷号 32746552)

  • 当无法评估参数时, 该LOCATE()函数无条件返回。NULL现在,当在确定为不可为 null 的表达式中使用时,该函数将返回零。(缺陷号 32746536)

  • my_well_formed_len_utf32()当出现无效长度的字符串时断言 的内部函数 。现在在这种情况下,该函数会报告一个无效的字符串。(缺陷号 32745294)

  • 函数TRIM()RTRIM()LTRIM()并不总是执行正确的错误检查。(缺陷号 32744772)

  • 内部解析器函数中的先前修复确保在无法解析生成的列时引发错误。当生成的列是CREATE TABLE语句的一部分时,这没有任何问题,但如果生成列的表是在 MySQL 5.7 数据库上生成的,然后升级到 MySQL 8.0,则会报告错误并终止升级。

    我们通过在报告导致函数错误的表时使用正确的指针来解决此问题 fix_generated_columns_for_upgrade()。(缺陷号 32738972)

  • 当查看列表中的汇总包装器 SELECT并尝试在列表中查找相同的项目时GROUP BY,服务器没有考虑到可能已在表达式周围添加了缓存。现在,在查找项目之前,任何此类缓存都会被解包。(错误#32729377,错误#32918400)

  • 如果还包含动态参数,则 使用 MIN()或 可能返回不正确结果的预准备语句。MAX()(错误#32713860,错误#103170)

  • 如果在 XA 事务被拒绝或由于死锁而被迫回滚后立即执行 DML 语句,复制可能会失败。(缺陷号 32707060)

  • 包含多个实例的查询 GROUPING()并不总是被正确处理。(缺陷号 32695103)

  • 执行时EXPLAIN ANALYZE,物化迭代器对每个 init()调用进行计数,即使是那些只保留现有数据的调用,也会导致物化与基础调用的数量相比显得成本太低。我们通过允许物化迭代器用它自己的数据覆盖调用和行计数来解决这个问题。(缺陷号 32688540)

  • 元数据锁定代码中的竞争条件可能导致服务器退出。(缺陷号 32686116)

  • 对覆盖全文索引的仅索引扫描可能会为多次调用 MATCH()函数的查询返回不正确的结果,具体取决于MATCH()计算调用的顺序。(缺陷号 32685616)

  • 包含准备好的语句的查询属性可能会导致语句执行失败。(缺陷号 32676878)

  • 基于 GTID 的复制中的复制事务包括 original_commit_timestamp显示事务何时在原始源服务器上提交,以及 immediate_commit_timestamp何时在副本上提交。以前, original_commit_timestamp没有为 Group Replication 的视图更改事件设置,这些事件由组同意,然后由每个组成员生成和应用,因此时间戳在可视输出中显示为零。为了提高可观察性,组成员现在为与视图更改事件关联的事务设置本地时间戳值。(缺陷号 32668567)

  • 在系统表上执行 DDL 语句可能会导致服务器退出。(缺陷号 32665990)

  • 使用该 --online-migration 选项,mysql_migrate_keyring可以在与迁移服务器建立连接期间退出。(缺陷号 32651203)

  • mysql_migrate_keyring未能强制执行源密钥库和目标密钥库必须不同的条件。(缺陷号 32637784)

  • 系统缓存大小检查在 Ubuntu 上可能不准确。(错误#32619199,错误#102926)

  • 服务器未正确处理某些 在子句MATCH ... AGAINST中具有全文索引的列上使用的查询。HAVING(缺陷号 32617181)

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

  • 基于 GTID 的复制中的复制事务包括 original_commit_timestamp显示事务何时在原始源服务器上提交,以及 immediate_commit_timestamp何时在副本上提交。以前,Group Replication 服务器original_commit_timestamp 在提交本地生成的事务时设置了,但没有设置immediate_commit_timestamp. 为了提高可观察性,组成员现在设置此时间戳。如果事务起源于组,则 original_commit_timestampimmediate_commit_timestamp都是由 Group Replication 生成的,并且相等。如果事务源自组外, original_commit_timestamp则保留并immediate_commit_timestamp设置 an。(漏洞#32613896)

  • 内部函数Item_func_match::eq() 在使用 Item_func_match_predicate. 添加断言的期望是 Item_func_match对象不会与Item_func_match_predicate对象进行比较,但后来发现 ONLY_FULL_GROUP_BY当谓词在HAVING子句中时,这可能会在检查期间发生。

    我们通过删除断言来解决这个问题,以便函数返回 false。(缺陷号 32611913)

  • SELECT在主键列上使用 DISTINCTwith aGROUP BY ... WITH ROLLUP返回的结果与该列不是主键时返回的结果不同。(缺陷号 32565875)

  • SELECT列表中的一个项目来自一个被发现是常量的表时,可以在添加ROLLUP 包装器之前在它周围添加缓存,导致它在组列表中找不到(没有这样的包装器)。这是通过解包缓存解决的。(缺陷号 32559356)

  • 如果准备好的语句参数长于 8KB 并且下一个参数表示一个值,则 C 客户端库可能会产生格式错误的通信数据包错误。NULL(缺陷号 32558782)

  • 当比较不同类型的参数时,参数被视为常量,服务器可能会插入自己的隐藏项缓存以节省重复转换(和可能的警告)。这在任何语句的输出中都不可见,例如 EXPLAIN.

    由于在 ROLLUP设置比较后解析运行并可能替换参数,这可能导致比较结果不正确,因此出现了一个问题。现在,当这种情况发生时,我们表示比较需要重新考虑其缓存,并且不可能重新使用陈旧的值。(缺陷号 32548377)

  • 在可加载函数的实现中对析构函数的不正确引用计数可能会引发调试构建的断言或报告该函数对于非调试构建不存在。(错误#32528898,错误#102649)

  • MySQL 源代码分发现在捆绑了 Google Test 源代码,不再需要下载它来运行基于 Google Test 的单元测试。因此, WITH_GMOCKCMake选项已被删除,如果指定则将被忽略。 ENABLE_DOWNLOADS

    此更改还纠正了一些构建问题,即源分发错误地包含一个空 source_downloads目录,并且 CMake在启用时没有失败 WITH_UNIT_TESTS但未找到 Google 测试源。(对于后一个问题,它不会再发生,因为源始终存在。)(Bug #32512077、Bug #27326599、Bug #29935278)

  • 当外部批量密钥访问和块嵌套循环(或散列连接)在查询中同时发生时,两者都在计划解释中恢复为嵌套循环以访问路径。在某些情况下会出现问题,其中非相等连接条件已被推送到一种特殊类型的 BKA 索引条件,并且通过转换为常规索引查找(不检查 BKA 条件),可以删除应该的条件已经检查过了。

    我们通过删除 BKA 索引条件来解决这个问题;由于它的使用非常罕见,因此在大多数实际查询中的潜在收益非常低,删除它会显着降低复杂性。(缺陷号 32424884)

  • SHOW CREATE USERmysql.user如果手动更改系统表的结构,可能会导致服务器意外退出 。(错误#32417780,错误#31654586)

  • 对于较大的 group_concat_max_len系统变量值,使用该 GROUP_CONCAT()函数的准备好的语句可能会在执行过程中不必要地重新准备。(错误#32413530,错误#102344)

  • 在重新执行作为优化的一部分执行遍历和替换的准备好的语句或存储过程时,更改未正确回滚。(错误#32384324,错误#32573871)

  • 如果发生连接超时,使用异步 C API 函数的客户端程序可能会泄漏内存。感谢 Facebook 为解决此问题所做的贡献。(错误#32372038、错误#102189、错误#32800091、错误#103409、错误#33171164、错误#104461)

  • 公开的动态统计缓存 INFORMATION_SCHEMA可以在事务中间更新,然后才知道事务是否会提交,可能缓存与未提交状态相对应的信息。(缺陷号 32338335)

  • 在隐式事务开始时重新准备准备好的语句可能会导致 ER_GTID_NEXT_TYPE_UNDEFINED_GROUP 错误。(错误#32326510,错误#102031)

  • USING HASH已从性能模式线程池表的定义中删除,因为性能模式不支持哈希索引。(缺陷号 32194617)

  • 如果系统时区具有 DST 转换,则将 具有显式时区偏移量的日期时间文字插入到TIMESTAMP列中可能会产生错误的时间。time_zone=SYSTEM(错误#32173664,错误#101670)

  • 在设置ORDER BY窗口函数时,包含子查询的窗口定义与ORDER BY. (缺陷号 32103260)

  • 现在不允许对 系统变量 使用SET PERSISTor语句。此系统变量必须在使用后清除,然后才能发出语句,因此不应将其持久保存到 MySQL 服务器实例的选项文件中。(缺陷号 31983203)SET PERSIST_ONLYgroup_replication_force_membersSTART GROUP_REPLICATION

  • FEDERATED如果 MySQL 安装有表 ,则从 MySQL 5.7 升级到 8.0 会失败。(缺陷号 31973053)

  • 持久化与组件相关的系统变量可能会导致不必要的未知变量错误消息。(缺陷号 31968366)

  • 将大量数据加载到具有全文搜索索引的表中时发生内存不足错误。在将数据插入全文搜索辅助表时,并未考虑分配给全文搜索缓存的所有内存。(缺陷号 31576731)

  • 整数和小数之间的精度UNION可能计算不正确,导致结果中的整数被截断。(漏洞 #31348202,漏洞 #99567)

  • InnoDB向错误日志写入不必要的警告,指示无法计算表统计信息。(缺陷号 30865032)

  • 联机构建索引时,虚拟列上的二级索引已损坏。

    对于UPDATE语句,我们按如下方式修复:如果索引记录的虚拟列值设置为NULL,那么我们从聚簇索引记录中生成该值。(缺陷号 30556595)

  • DROP DATABASE对于具有大量表(一百万)的数据库,可能会导致内存不足的情况。(漏洞#29634540)

  • 系统system_time_zone变量在服务器启动时从服务器主机设置和mysqld环境初始化,但如果服务器主机时区更改(例如,由于夏令时),system_time_zone 则不会反映更改。现在可以了。(漏洞 #29330089,漏洞 #94257)

  • 对于 Ubuntu 上的升级,如果找到现有 my.cnf文件,则会将其重命名为 my.cnf.bak并发出警告。(漏洞 #24486556,漏洞 #82639)

  • 布尔系统变量可以分配负值。(缺陷 #11758439,缺陷 #50643)

  • 准备好的语句并不总是使用索引扩展(请参阅索引扩展的使用)。(缺陷 #103711,缺陷 #32897525)

    参考资料:另请参阅:Bug #103710、Bug #32897503。

  • 启用后, prefer_ordering_index 优化器开关会对准备好的语句的性能产生负面影响。(缺陷 #103710,缺陷 #32897503)

    参考资料:另请参阅:Bug #103711、Bug #32897525。

  • 连续的INSERT()函数调用有时会产生无效NULL 的结果。(错误#103513,错误#32824978)

  • 由于处理中的回归,一些NOT IN子查询没有返回正确的结果NULL。(缺陷 #103331,缺陷 #32773801)

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

  • 每当SELECT ... FOR UPDATE NOWAIT语句无法获得记录锁时,一条消息Got error 203 when reading table ...将被写入错误日志,尽管这是一种相对常见的情况,其日志记录导致磁盘空间的过度使用.

    感谢 Brian Yue 的贡献。(错误#103159,错误#32705614)

  • 0 - (MAX(BIGINT) + 1)回来了 -(MAX(BIGINT) + 1)。现在返回一个超出范围的错误。(错误#103093,错误#32693863)