Documentation Home
MySQL 8.0 发行说明  /  MySQL 8.0.19 的变化(2020-01-13,正式发布)

MySQL 8.0.19 的变化(2020-01-13,正式发布)

有关升级、降级、平台支持等的一般信息,请访问https://mysql.net.cn/doc/relnotes/mysql/8.0/en/

重要的

如果在服务器配置步骤中选择了 MySQL Enterprise Firewall,则使用 MySQL Installer 安装的 MySQL 8.0.19 会阻止服务器启动。如果服务器启动操作失败,单击“取消”结束配置过程并返回仪表板。您必须卸载服务器。

解决方法是在未 选择 MySQL Enterprise Firewall 的情况下运行 MySQL Installer 。然后使用手动安装说明安装 MySQL Enterprise Firewall(请参阅 安装或卸载 MySQL Enterprise Firewall)。此问题已在 MySQL 8.0.20 中得到纠正。

账户管理注意事项

  • MySQL 现在允许管理员配置用户帐户,这样由于密码不正确导致的连续登录失败过多会导致临时帐户锁定。每个帐户所需的失败次数和锁定时间是可配置的,使用and 语句的FAILED_LOGIN_ATTEMPTSand PASSWORD_LOCK_TIME选项 。请参阅 密码管理。(漏洞 #27733694,漏洞 #90169)CREATE USERALTER USER

审核日志说明

  • ANALYZE TABLE语句现在产生read审计事件。(漏洞 #29625461)

  • 审核日志连接事件现在包括客户端传递的任何连接属性。新式 XML 日志文件格式和 JSON 格式支持连接属性日志记录,但不支持旧式 XML 格式。请参阅 审核日志文件格式

编译笔记

  • Microsoft Windows:在 Windows 上,用于从命令行构建 的最低CMake版本现在是 3.15。(错误#30332632,错误#96954)

配置注意事项

  • 新选项FPROFILE_GENERATECMake选项可用于使用 GCC 试验配置文件引导优化 (PGO)。有关使用它们的信息,请参阅 MySQL 源代码分发。这些选项已经通过 GCC 8 和 9 以及 Clang 进行了测试。 FPROFILE_USE cmake/fprofile.cmake

    启用FPROFILE_USE还启用 WITH_LTO(链接时间优化)。(错误#30089834、错误#96314、错误#30133324、错误#96410、错误#30164113、错误#96486)

  • Innodb_system_rows_read, Innodb_system_rows_inserted, 添加了状态变量,用于计算属于系统创建的模式Innodb_system_rows_deleted 的表上的行操作 。InnoDB新的状态变量类似于现有的 Innodb_rows_read, Innodb_rows_inserted, 状态变量,它们对 属于用户创建的和系统创建的模式的表的 Innodb_rows_deleted操作进行计数。InnoDB

    relay_log_info_repository 新的状态变量在和master_info_repository 变量设置为 的复制环境中很有用,由于在属于系统创建的模式的、 和 表TABLE上执行的操作,导致从站上的行操作计数更高。为了有效比较主行和从属行操作计数,现在可以使用新状态变量提供的计数数据排除对系统创建模式中表的操作。 slave_master_infoslave_replay_log_infoslave_worker_infomysql

    感谢 Facebook 的贡献。(漏洞 #27724674,漏洞 #90148)

弃用和移除说明

  • thread_pool插件在 Performance Schema 表的整数列的定义中使用了显示宽度。这导致警告写入错误日志,因为现在不推荐使用整数列显示宽度。(缺陷号 30597673)

  • MySQL 8.0.17 中不推荐使用整数数据类型的显示宽度规范,现在在其输出中包含数据类型定义的语句不再显示整数类型的显示宽度,但以下情况除外:

    • 类型是TINYINT(1)。MySQL 连接器假设TINYINT(1) 列起源于BOOLEAN列;这一例外使他们能够继续做出这种假设。

    • 类型包括ZEROFILL属性。

    此更改适用于表、视图和存储例程,并影响SHOW CREATE语句 DESCRIBEINFORMATION_SCHEMA表的输出。

    对于DESCRIBE语句和 INFORMATION_SCHEMA查询,在以前的 MySQL 8.0 版本中创建的对象的输出不受影响,因为已经存储在数据字典中的信息保持不变。此异常不适用于从 MySQL 5.7 升级到 8.0,为此重新创建所有数据字典信息,以便数据类型定义不包括显示宽度。(错误#30556657,错误#97680)

  • 设置hash_join 优化器开关(参见 optimizer_switch系统变量)不再有任何效果。这同样适用于HASH_JOINNO_HASH_JOIN优化器提示。优化器开关和优化器提示现在都已弃用,并且会在未来的 MySQL 版本中删除。

    这也解决了一个问题,即 SELECT DISTINCT ... WITH ROLLUP并不总是返回所有不同的行。(错误#27549694,错误#30471809)

  • 在 MySQL 5.7.14 中,mysqlx为 X Protocol 的 StmtExecute请求引入了 namespace 参数,取代了该 xplugin参数,因此被弃用。X Plugin 继续支持已弃用的 xplugin命名空间以实现向后兼容性。在 MySQL 8.0.19 中,xplugin命名空间现已被删除。如果xplugin从此版本开始使用命名空间,则会返回一条关于未知命名空间的错误消息。MySQL 8.0.19 不再使用 X 插件的 Mysqlx_stmt_execute_xplugin状态变量,该变量计算StmtExecute 为命名空间收到的请求数。xplugin

  • YEAR(2)MySQL 5.7.5 中删除 了对数据类型的支持,只留下YEARYEAR(4)作为年值数据的有效规范。因为YEARYEAR(4)在语义上相同,所以不需要指定显示宽度,所以 YEAR(4)现在已弃用,并且在未来的 MySQL 版本中将删除对它的支持。在其输出中包含数据类型定义的语句不再显示 的显示宽度YEAR。此更改适用于表、视图和存储例程,并影响SHOW CREATE语句 DESCRIBEINFORMATION_SCHEMA表的输出。

    对于DESCRIBE语句和 INFORMATION_SCHEMA查询,在以前的 MySQL 8.0 版本中创建的对象的输出不受影响,因为已经存储在数据字典中的信息保持不变。此异常不适用于从 MySQL 5.7 升级到 8.0,为此重新创建所有数据字典信息,以便数据类型定义不包括显示宽度。

    (未记录的)UNSIGNED属性 YEAR现在也已弃用,并且在未来的 MySQL 版本中将删除对它的支持。

错误处理

  • 有关 XA 崩溃恢复的错误消息已修改为指示 XA 上下文,以将它们与非 XA 崩溃恢复消息区分开来。(错误#30578290,错误#97743)

  • 以前,服务器返回此错误消息以尝试使用LOAD DATA LOCAL禁用LOCAL功能:The used command is not allowed with this MySQL version。这是误导,因为错误条件与 MySQL 版本无关。服务器现在返回错误代码 ER_CLIENT_LOCAL_FILES_DISABLED 和此消息:加载本地数据已禁用;这必须在客户端和服务器端都启用。(错误#30375698,错误#29377985,错误#94396)

SQL 函数和运算符注释

  • 以前,可加载函数不考虑字符集或字符串参数或返回值的排序规则。实际上,字符串参数和返回值被视为二进制字符串,这意味着只有包含单字节字符的字符串参数才能被可靠地处理。

    可加载函数的行为在默认情况下仍然相同,但用于编写可加载函数的接口已经扩展,使它们能够确定字符串参数的字符集和排序规则,并返回具有特定字符集和排序规则的字符串。这些功能对于可加载函数的编写者来说是可选的,他们可以根据需要利用它们。请参阅 可加载函数字符集处理

    在与 MySQL 一起分发的可加载功能中,与以下功能和扩展相关的功能已被修改以利用新功能:MySQL Enterprise Audit、MySQL Enterprise Firewall、MySQL Enterprise Data Masking and De-Identification、MySQL Keyring(通用 -仅用于密钥环功能)和组复制。修改仅适用于有意义的地方。例如,返回加密数据的函数旨在返回二进制字符串,而不是字符串。

    可加载函数的字符集功能是使用mysql_udf_metadata 组件服务实现的。有关此服务的信息,请参阅 MySQL Server Doxygen 文档, 网址为https://mysql.net.cn/doc/index-other.html(搜索 s_mysql_mysql_udf_metadataudf_metadata_imp)。MySQL Keyring 函数的源代码在社区源代码分发中可用,并且可以作为第三方可加载函数编写者的示例进行检查,他们希望将自己的函数修改为字符集感知。

INFORMATION_SCHEMA 注释

钥匙圈笔记

  • 一种新的SECRET密钥类型可用,旨在使用 MySQL 密钥环对敏感数据进行通用存储。密钥环在存储和检索时将数据加密和解密 SECRET为字节流。所有密钥环SECRET插件都支持密钥类型。请参阅支持的密钥环密钥类型和长度

日志记录

  • SIGUSR1信号现在导致服务器刷新错误日志、一般查询日志和慢速查询日志。for 的一种用途SIGUSR1是在无需连接到服务器的情况下实现日志轮换(刷新日志需要具有 RELOAD特权的帐户)。服务器对 的响应SIGUSR1是对 的响应的一个子集,SIGHUP可以 SIGUSR1用作更 轻量级的信号来刷新某些日志,而不会产生其他SIGHUP影响,例如刷新线程和主机缓存以及将状态报告写入错误日志。请参阅MySQL 中的 Unix 信号处理

包装说明

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

  • 与 MySQL 捆绑的zstd库已从版本 1.3.3 升级到 1.4.3。MySQL 使用该 zstd库来支持连接压缩。(缺陷号 30236685)

  • 对于包含 OpenSSL 共享库的包类型, lib/private如果包中有需要 OpenSSL 的 MySQL 私有库,它们现在也包含在下面。(漏洞#29966296)

SQL 语法说明

  • 重要变化: MySQL 现在根据 SQL 标准支持显式表子句和表值构造函数。这些现在已经分别作为 TABLE语句和 VALUES语句实现,这里分别进行简要描述:

    • TABLE table_name等同于, 并且可以在 接受等价语句的任何地方使用;这包括联接、联合、 语句、 语句、 语句和子查询。 SELECT * FROM table_nameSELECTINSERT ... SELECTREPLACECREATE TABLE ... SELECT

      你可以使用ORDER BYwith TABLE,它也支持 LIMITwith optional OFFSETTABLE这些子句在语句中的作用与它们在.中的作用相同SELECT。以下两个语句产生相同的结果:

      TABLE t ORDER BY c LIMIT 10 OFFSET 3;
      
      SELECT * FROM t ORDER BY c LIMIT 10 OFFSET 3;
    • VALUESVALUES关键字后跟一系列行构造函数 ( ROW()) 组成,以逗号分隔。它可用于以符合 SQL 的方式向 INSERT语句或 REPLACE语句提供行值。例如,下面两个语句是等价的:

      INSERT INTO t1 VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9);
      
      INSERT INTO t1 VALUES (1,2,3), (4,5,6), (7,8,9);

      您还可以像选择 VALUES表一样从表值构造函数中进行选择,请记住,这样做时必须提供表别名。使用列别名,您还可以选择单独的列,如下所示:

      mysql> SELECT a,c FROM (VALUES ROW(1,2,3), ROW(4,5,6)) AS t(a,b,c);
      +---+---+
      | a | c |
      +---+---+
      | 1 | 3 |
      | 4 | 6 |
      +---+---+

      您可以SELECT 在联接、联合、子查询和您通常希望能够使用此类语句的其他构造中使用此类语句。

    有关详细信息和示例,请参阅TABLE 语句VALUES 语句,以及 INSERT ... SELECT 语句CREATE TABLE ... SELECT 语句JOIN 子句UNION 子句子查询。(错误号 77639)

  • 以前,不可能LIMIT 在递归公用表表达式 (CTE) 的递归SELECT部分使用。 LIMIT在这种情况下现在支持,以及一个可选的OFFSET子句。此处显示了此类递归 CTE 的示例:

    WITH RECURSIVE cte AS  (
      SELECT CAST("x" AS CHAR(100)) AS a FROM DUAL
      UNION ALL
      SELECT CONCAT("x",cte.a) FROM cte
        WHERE LENGTH(cte.a) < 10
        LIMIT 3 OFFSET 2
    )
    SELECT * FROM cte;

    此语句在mysql客户端 中产生以下输出 :

    +-------+
    | a     |
    +-------+
    | xxx   |
    | xxxx  |
    | xxxxx |
    +-------+

    以这种方式指定LIMIT可以使 CTE 的执行比在最外层执行更有效SELECT,因为只生成请求的行数。

    有关详细信息,请参阅 递归公用表表达式。(缺陷 #92857,缺陷 #28816906)

  • CHECK约束在 MySQL 8.0.16 中实现时,ALTER TABLE支持 DROP CHECKALTER CHECK 语法作为标准 SQL 的 MySQL 扩展来修改检查约束,但不支持更通用的(和 SQL 标准)DROP CONSTRAINTALTER CONSTRAINT语法来修改任何类型的现有约束。现在支持该语法;约束类型由约束名称确定。

  • MySQL 现在支持在要插入的行及其列的语句的VALUESSET子句中 使用别名。INSERT INTO ... ON DUPLICATE KEY UPDATE考虑这样一个语句:

    INSERT INTO t
        VALUES (9,5), (7,7), (11,-1)
        ON DUPLICATE KEY UPDATE a = a + VALUES(a) - VALUES(b);

    使用new插入行的别名,您现在可以重写语句,在ON DUPLICATE KEY UPDATE子句中引用行别名,如下所示:

    INSERT INTO t
        VALUES (9,5), (7,7), (11,-1) AS new
        ON DUPLICATE KEY UPDATE a = a + new.a - new.b;

    使用相同的行别名,以及列别名 mn插入行的列,您可以省略行别名并仅使用列别名,如下所示:

    INSERT INTO t
        VALUES (9,5), (7,7), (11,-1) AS new(m,n)
        ON DUPLICATE KEY UPDATE a = a + m - n;

    行别名必须与表名不同;列别名必须彼此不同。

    有关更多信息和示例, 请参阅INSERT ... ON DUPLICATE KEY UPDATE 语句。

sys架构注释

线程池注释

X 插件说明

  • X 插件无法在带有 GCC 9 的 Debian 上编译。 --no-as-needed添加了链接器选项以提供解决该问题的方法。(缺陷号 30445201)

  • 使用 X 协议查询信息架构表 TRIGGERS可能会导致返回错误或不返回某些行。(缺陷号 30318917)

添加或更改的功能

  • Microsoft Windows: 以前, mysqlsystem命令行客户端的 (\!) 命令 仅适用于 Unix 系统。它现在也适用于 Windows。例如, or可用于清除屏幕。(缺陷 #11765690,缺陷 #58680)system cls\! cls

  • JSON:JSON_SCHEMA_VALID()指定CHECK约束并遇到验证失败时,MySQL 现在会提供有关此类失败原因的详细信息。ER_JSON_SCHEMA_VALIDATION_ERROR_WITH_DETAILED_REPORT 实现了一个包含此信息的新错误 当 语句被服务器拒绝 通过发出 该信息在mysql客户端中查看。SHOW WARNINGSINSERT

    有关更多信息和示例,请参阅 JSON_SCHEMA_VALID() 和 CHECK 约束。有关更多一般信息,另请参阅 CHECK 约束

  • 到复制从站的复制连接,以及用于分布式恢复的组复制连接,现在具有用于 TLSv1.3 协议的完整客户端配置选项。在 TLSv1.3 支持可用但这些配置选项不可用的 MySQL 版本中,如果 TLSv1.3 用于这些连接类型,则连接中的客户端(复制从属或启动分布式恢复的组复制加入成员)可以不被配置。这意味着连接中的服务器(作为分布式恢复的捐赠者的复制主机或组复制现有成员)必须允许使用至少一个默认启用的 TLSv1.3 密码套件。从 MySQL 8.0.19 开始,

    新的配置选项如下:

    (缺陷号 29960735)

  • Debian 软件包现在包含更通用的 systemd 支持,可以更好地支持手动执行mysqld。(缺陷 #29702050,缺陷 #95163)

  • Group Replication 插件使用内部会话与 MySQL Server 交互以执行 SQL API 操作。以前,这些会话计入 max_connections服务器系统变量指定的客户端连接限制。如果在启动组复制或尝试执行操作时服务器已达到此限制,则操作不成功并且组复制或服务器本身可能会停止。从 MySQL 8.0.19 开始,Group Replication 与 MySQL Server 的交互使用一个新的组件服务来单独处理内部会话,这意味着它们不计入 max_connections限制,如果服务器达到此限制也不会被拒绝。(漏洞 #29635001)

  • 重复键错误信息已扩展为包括键的表名。以前,重复键错误信息仅包括键值和键名。感谢 Facebook 的贡献。(错误#28686224,错误#925308)

  • mysql客户端以交互模式运行时,该--binary-as-hex选项现在默认启用。此外, 当隐式或显式启用该选项时 , status(或)命令的输出包括此行:\s

    Binary data as: Hexadecimal

    要禁用十六进制表示法,请使用 --skip-binary-as-hex (错误 #24432545)

  • MySQL 现在支持带有时区偏移量的日期时间文字,例如'2019-12-11 10:40:30-05:00''2003-04-14 03:30:00+10:00''2020-01-01 15:35:45+05:30';在将此类值插入 TIMESTAMPDATETIME列时,这些偏移量会得到遵守但不会存储;也就是说,在检索值时不显示偏移量。

    时区偏移量的支持范围是 -13:59+14:00,包括在内。日期时间文字不支持时区名称,例如'CET'or 'America/Argentina/Buenos_Aires',包括特殊值。'SYSTEM'此外,在此上下文中,小于 10 的小时值需要前导零,并且 MySQL 拒绝偏移量'-00:00'为无效。

    带有时区偏移量的日期时间文字也可以用作准备语句中的参数值。

    作为这项工作的一部分,系统变量的数值允许范围已更改time_zone,因此现在也 包括在内。 -13:59+14:00

    有关其他信息和示例,请参阅 DATE、DATETIME 和 TIMESTAMP 类型以及 MySQL 服务器时区支持。(漏洞 #83852,漏洞 #25108148)

  • 从 MySQL 8.0.19 开始,支持对通过 X 协议连接发送的消息进行压缩。如果服务器和客户端同意使用压缩算法,则可以压缩连接。默认情况下,X 协议宣布支持 deflatelz4zstd压缩算法。您可以通过设置新的 mysqlx_compression_algorithms系统变量以仅包含您允许的变量。如果客户端在能力协商期间不请求压缩,则 X 协议始终允许未压缩的连接。请注意,X Protocol 的允许压缩算法列表独立于 MySQL Server 宣布的压缩算法列表运行,并且 X Protocol 不会回退到使用 MySQL Server 的压缩设置。您可以使用新的 X 插件状态变量监控 X 协议的消息压缩效果。

  • 对于多线程从站( slave_parallel_workers设置为大于 0 的值的复制从站),设置 slave_preserve_commit_order=1 确保事务在从站上执行和提交的顺序与它们在从站的中继日志中出现的顺序相同,从而在从站上保留相同的事务历史记录和主人一样。以前,此设置需要在从站上启用二进制日志记录和从站更新日志记录,以及相关的执行成本和磁盘空间要求。现在, slave_preserve_commit_order=1 可以在没有二进制日志和没有从属更新日志记录的从属上设置。这使您能够保留从服务器上的提交顺序,并避免事务序列中的间隙,而无需二进制日志记录的开销。

    如果正在使用基于语句的复制,并且事务和非事务存储引擎都参与在主服务器上回滚的非 XA 事务,则可能会限制在从服务器上保留提交顺序。通常,在主服务器上回滚的非 XA 事务不会复制到从服务器,但在这种特殊情况下,事务可能会被复制到从服务器。如果确实发生这种情况,则没有二进制日志记录的多线程从服务器不会处理事务回滚,因此在这种情况下,从服务器上的提交顺序与事务的中继日志顺序不同。

  • MySQL 8.0.18 版本引入了 PRIVILEGE_CHECKS_USER为复制通道指定帐户的功能(使用CHANGE MASTER TO语句),MySQL 在应用复制事务时针对该帐户进行权限检查。帐户的使用 PRIVILEGE_CHECKS_USER有助于保护复制通道,防止未经授权或意外使用特权或不需要的操作。当通过权限检查保护复制通道时,强烈建议使用基于行的二进制日志记录。

    在 MySQL 8.0.19 中, REQUIRE_ROW_FORMAT为复制通道添加了一个新设置,这使得该通道只接受基于行的复制事件。您可以指定 REQUIRE_ROW_FORMAT使用 CHANGE MASTER TO语句为通过特权检查保护的复制通道强制执行基于行的二进制日志记录,或者提高不受这种方式保护的通道的安全性。通过仅允许基于行的复制事件, REQUIRE_ROW_FORMAT可以防止复制应用程序执行创建临时表和执行LOAD DATA INFILE请求等操作,从而保护复制通道免受某些已知攻击向量的侵害。基于行的二进制日志记录(binlog_format=ROW) 必须在 REQUIRE_ROW_FORMAT设置时在复制主服务器上使用。

    Group Replication 已经需要基于行的二进制日志记录,因此从 MySQL 8.0.19 开始,Group Replication 的通道是使用REQUIRE_ROW_FORMAT set 自动创建的,并且您无法更改这些通道的选项。该设置也适用于升级时的所有组复制通道。

    mysqlbinlog有一个新 选项,它为mysqlbinlog的输出--require-row-format强制执行基于行的复制事件 使用此选项生成的事件流将被使用该 选项保护的复制通道接受。 REQUIRE_ROW_FORMAT

  • MySQL 在为表分区构造表空间名称和文件名时使用分隔符字符串。“ #p#分隔符字符串位于分区名称之前,#sp# 分隔符字符串位于子分区名称之前,如下所示

    schema_name.table_name#p#partition_name#sp#subpartition_name
    table_name#p#partition_name#sp#subpartition_name.ibd

    从历史上看,分隔符字符串在区分大小写的文件系统(例如 Linux)上是大写的(#P#和),在不区分大小写的文件系统(例如 Windows)上是小写的(和)。为了避免在区分大小写和不区分大小写的文件系统之间迁移数据目录时出现问题,分隔符字符串现在在所有文件系统上都是小写的。不再使用大写分隔符字符串。 #SP##p##sp#

    此外,无论设置如何,基于用户指定的分区或子分区名称生成的分区表空间名称和文件名(可以指定为大写或小写)现在都以小写形式生成(并在内部存储) lower_case_table_names以确保不区分大小写。例如,如果创建一个名为 name 的表分区,则生成PART_1的表空间名称和文件名都是小写的:

    schema_name.table_name#p#part_1
    table_name#p#part_1.ibd

    在升级期间,MySQL 现在会在必要时检查和修改:

    • 磁盘和数据字典中的分区文件名确保小写分隔符和分区名称。

    • 对数据字典中的元数据进行分区,以解决之前错误修复引入的相关问题。

    • InnoDB先前错误修复引入的相关问题的统计数据。

    在表空间导入操作期间,检查磁盘上的分区表空间文件名并在必要时修改以确保小写分隔符和分区名称。

    参考资料:另请参阅:Bug #26925260、Bug #29823032、Bug #30012621、Bug #29426720、Bug #30024653。

  • InnoDB为了生成直方图统计数据, 添加了对数据高效采样的支持 。当存储引擎不提供自己的存储引擎时,MySQL 使用的默认采样实现需要全表扫描,这对于大表来说代价高昂。InnoDB采样实现通过避免全表扫描来提高采样性能。 sampled_pages_readsampled_pages_skipped INNODB_METRICS计数器可用于监视InnoDB数据页的 采样。请参阅 直方图统计分析

修正错误

  • 重要更改: 以下字符串函数的字符集解析已更改:

    以前,这些函数的所有参数的字符集信息都是聚合的,这可能导致结果格式不正确。这也导致了问题 LPAD(),它假定输入和输出都是格式正确的。现在列出的三个函数中的每一个都始终使用 所采用的字符集 str,并在执行时将所有其他参数转换为该字符集;如果任何此类转换失败,该函数将返回错误。(缺陷号 30114420)

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

  • 重要变化: 子查询实现不再需要内部和外部类型的严格匹配。当以下条件之一为真时,现在可以具体化不同的类型:

    • 内部类型是数字(因为总是有办法将外部类型转换为数字)

    • 内部类型是临时的(因为总有办法将外部类型转换为临时类型)

    • 两种类型都是字符串

    (漏洞 #13960580)

  • NDB Cluster: 某些 NDB 日志记录选项的密码屏蔽不完整。(缺陷 #97335,缺陷 #30453137)

  • InnoDB: 启动时某些内部数据结构的初始化取决于从 max_connections设置派生的内部变量。 使用 启动后修改设置 InnoDB时无法调整内部数据结构的大小 。(缺陷号 30628872)max_connectionsSET PERSIST

  • InnoDB: os_file_get_parent_dir使用 GCC 9.2.0 编译 MySQL 时遇到警告。(漏洞 #30499288,漏洞 #97466)

  • InnoDB: 尝试使用空引用访问大对象 (LOB) 值引发断言失败。为防止出现此问题,添加了一项检查以确定 LOB 引用在被访问之前是否为空。(缺陷号 30499064)

  • InnoDB: 升级数据目录后发生断言失败。准备好的 XA 事务仍然存在,这阻止了撤消表空间的升级。包含准备好的事务更改的撤消表空间必须保持活动状态,直到提交或回滚所有准备好的 XA 事务。

    准备好的 XA 事务还阻止了在重启后完成显式撤消表空间截断操作。(缺陷号 30489497)

  • InnoDB: 尝试将 Linux 上具有大写表名(分区或其他)的 MySQL 5.7 实例升级到 macOS 上的 MySQL 8.0 引发断言失败。MySQL 8.0 分区文件格式改变,无法将数据目录迁移到不同平台, lower_case_table_names升级时更改设置,会导致升级失败。在这些情况下不会出现故障,而是会报告错误。(错误#30450968,错误#30450979)

  • InnoDB: 在 macOS 上,尝试将具有大写表名的 MySQL 5.7 实例升级到 MySQL 8.0 时失败。大写表名称未规范化为小写。报告了以下错误: Table is not found in InnoDB dictionaryError in fixing SE data errors。(缺陷号 30450944)

  • InnoDB: 在 Windows 上,尝试将具有大写分区表名称的 MySQL 5.7 实例升级到 MySQL 8.0 时失败。打开表返回空指针,导致关闭表时出现段错误。(缺陷号 30450918)

  • InnoDB: 在 Windows 上,尝试将具有大写分区表名称的 MySQL 5.7 实例升级到 MySQL 8.0 时引发mysqld异常。(缺陷号 30447790)

  • InnoDB: 在 Windows 上,尝试将包含以大写名称定义的通用表空间的 MySQL 5.7 实例升级到 MySQL 8.0 时发生故障。报告了以下错误: Error in fixing SE dataFailed to Populate DD。(缺陷号 30446798)

  • InnoDB: 在 LOB 相关代码中引入本地小事务 (mtrs) 导致恢复期间断言失败。(缺陷号 30417719)

  • InnoDB: 尝试将 Windows 上具有大写分区表名称的 MySQL 5.7 实例升级到 Linux 上的 MySQL 8.0 时发生故障。MySQL 8.0 中的分区文件格式更改阻止了数据目录迁移到不同的平台。现在报告错误而不是失败。(缺陷号 30411118)

  • InnoDB: 重复更新相同的压缩 LOB 数据导致表空间文件的大小增加。(缺陷号 30353812)

  • InnoDB: 达到temptable_max_ram 限制时,TempTable 存储引擎错误地报告了内存不足错误,而不是回退到基于磁盘的存储。(错误#30314972,错误#96893)

  • InnoDB: 导入加密表并重启服务器后,尝试访问该表时返回以下错误: ERROR 3185 (HY000): Can't find master key from keyring, please in the server log if a keyring plugin is加载并初始化成功。表空间密钥在使用目标主密钥加密后未写入磁盘。(缺陷号 30313734)

  • InnoDB:InnoDB dict_create_foreign_constraints()删除了解析 SQL 语句和执行外键相关 DDL 检查 的内部随着 MySQL 8.0 中数据字典的引入以及随后将外键相关的 DDL 检查转移到 SQL 层,该功能变得多余。

    删除该 dict_create_foreign_constraints()功能还解决了以下外键问题:

    • 解析器 不允许完全限定的引用表名称中的 点 ( . ) 周围有空格。InnoDB

    • ALTER TABLE不允许 在同一语句中添加外键和删除分区 。解析器没有检测到新表InnoDB版本不再分区。

    • 外键约束无法引用名为AUX的架构中的表。解析引用表名的函数无法识别对 AUX 等特殊名称进行编码。

    • 外键定义中的条件注释被忽略。

    ALTER TABLE此外,还向 SQL 层添加了一项检查,以检测在执行语句 的早期阶段是否尝试在表上创建多个同名外键 。(错误#30287895、错误#22364336、错误#28486106、错误#28703793、错误#16904122、错误#92567、错误#11754659、错误#46293)

  • InnoDB: 比较函数在尝试合并空间索引的非叶页时发现两条记录相等。该函数无法处理这种意外情况,导致长时间的信号量等待和最终的断言失败。(缺陷号 30287668)

  • InnoDB: 如果后续调用者试图在释放页面之前为同一页面获取锁存器,则释放大对象 (LOB) 页面所需的本地获取锁存器可能会导致死锁。类似地,在回滚相关操作期间对压缩或未压缩 LOB 采取的闩锁可能会由于闩锁顺序问题而导致死锁。(缺陷号 30258536)

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

  • InnoDB: 清除压缩 LOB 页面的清除线程与使用删除标记记录的更新线程之间的竞争条件导致断言失败。(缺陷号 30197056)

  • InnoDB: 由于使用不同DATA DIRECTORY子句定义源表和目标表而失败的表空间导入操作报告了描述性不足的模式不匹配错误。此外,如果 .cfg文件不存在,相同的操作将引发断言失败。在导入操作因数据目录不匹配而终止之前,现在在这两种情况下都会报告一条信息更丰富的错误消息。(错误#30190199、错误#30190227、错误#20644698、错误#76142)

  • InnoDB: 尝试清除大于缓冲池的 LOB 值时清除操作失败。(缺陷号 30183982)

  • InnoDB: 将外部存储的 LOB 数据移动到内联存储的更新操作无法将旧的 LOB 数据标记为可清除。(漏洞 #30178056,漏洞 #96466)

  • InnoDB: 索引键部分排序信息未存储到 .cfg使用的元数据文件中 ALTER TABLE ... IMPORT TABLESPACE。因此假定索引键部分排序顺序为升序,这是默认值。因此,如果导入操作中涉及的一个表是使用DESC索引键部分排序顺序定义的,而另一个表不是,则记录可能会按意外的顺序排序。为解决此问题, .cfg更新了文件格式以包含索引键部分排序信息。(缺陷号 30128418)

  • InnoDB:btr_cur_will_modify_tree()检测修改记录是否需要修改树结构 的函数使用的条件 (缺陷号 30113362)

  • InnoDB: 由于在启动时进行表空间文件扫描以检索空间 ID,因此在具有大量表的实例上启动速度很慢。仅当表空间文件数超过 50,000 时才启动多线程扫描,并且读取三个表空间页面以检索空间 ID。为了缩短启动时间,现在为表空间文件扫描分配了额外的线程,并且只读取第一个表空间页面以检索空间 ID。如果在表空间的第一页上未找到空间 ID,则读取三页以确定空间 ID,如前所述。(漏洞 #30108154,漏洞 #96340)

  • InnoDB: 在不区分大小写的文件系统上启动失败,错误指示为同一表空间 ID 找到多个文件。由于路径具有不同的字母大小写,文件路径比较无法识别 innodb_data_home_dir并且 datadir(缺陷号 30040815)

  • InnoDB:在 Linux 上使用分区表升级 MySQL 8.0.13 实例并 设置为 MySQL 8.0.14 或 MySQL 8.0.15mysql.innodb_index_statsmysql.innodb_table_stats持久优化器统计表 时发生存储引擎错误 lower_case_table_names=1持久优化器统计表包含重复的条目。(缺陷号 30012621)

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

  • InnoDB: CREATE TABLESPACE失败,错误表明表空间已经存在。该错误是由于前面的 CREATE TABLESPACE操作失败,其中 DDL 失败,但由于在事务提交之前禁用回滚,相关更改未回滚。事务提交成功后回滚现在被禁用。(缺陷 #29959193,缺陷 #95994)

  • InnoDB: 未跟踪属于导入表空间的已更改页面。(漏洞#29917343)

  • InnoDB: 在不区分大小写的文件系统上从 MySQL 5.7 升级到 MySQL 8.0 时,由于表空间名称冲突,升级过程中全文搜索辅助表的重命名失败。(漏洞#29906115)

  • InnoDB: 回滚INSERT插入大于缓冲池的 LOB 值的操作导致死锁。(缺陷 #29846292,缺陷 #95572)

  • InnoDB: 通过禁止会话临时表的不必要的隐式到显式二级索引锁转换来解决代码回归问题。(缺陷号 29718243)

  • InnoDB: 当游标位于损坏的页面上并清除删除标记的记录时,表空间导入操作引发断言。导入操作现在终止并报告错误,而不是在遇到损坏的页面时断言。(缺陷 #29454828,缺陷 #94541)

  • InnoDB: 删除标记的行能够在部分回滚完成之前获取外部读锁。外部读锁在部分回滚期间阻止了隐式锁到显式锁的转换,导致断言失败。(漏洞#29195848)

  • InnoDB: 在撤消表空间截断操作正在进行时发生服务器退出后,在启动时打印警告消息,指出无法为撤消表空间页面恢复双写页面。不再为正在被截断的撤消表空间打印警告消息。(缺陷号 28590016)

  • InnoDB: 在只读模式(innodb_read_only=ON)下, SHOW CREATE TABLE输出不包括有关外键约束的信息。(缺陷 #21966795,缺陷 #78754)

  • 分区: 从 MySQL 8.0.16 或更低版本升级具有子分区表的数据库然后执行时ALTER TABLE ADD COLUMN,会发生断言或错误。(漏洞 #30360695,漏洞 #97054)

  • 分区: 分区表从 MySQL 5.7 升级到 8.0 时,分区函数使用前缀键时,忽略前缀长度,而是考虑全列长度。因此,该表可能会被错误地拒绝升级,因为它的分区字段长度被发现太大。(漏洞 #29941988,漏洞 #95921)

  • 分区: ALTER TABLE ... EXCHANGE PARTITION可能导致索引损坏。这是因为服务器假定在分区表中创建索引的顺序与未分区表的顺序相同。这导致交换了错误的索引数据。(漏洞 #29706669)

  • Replication: 当成员加入或重新加入复制组时,如果Group Replication检测到分布式恢复过程中出现错误(在此期间加入成员从现有在线成员接收状态转移),它会自动切换到新的捐赠者,并且重试状态转移。加入成员在放弃前重试的次数由 group_replication_recovery_retry_count 系统变量设置。Performance Schema 表 replication_applier_status_by_worker 显示导致上次重试的错误。以前,只有在组成员配置了并行复制应用程序线程(由 slave_parallel_workers系统变量)。如果群组成员配置了单个applier线程,每次重试后都会通过内部RESET SLAVE操作清除错误,因此无法查看。SHOW SLAVE STATUS无论是单个应用程序线程还是多个应用程序线程,命令的输出也是如此。RESET SLAVE现在重试分布式恢复后不再执行该 操作,因此始终可以查看导致上次重试的错误。(错误#30517160、错误#30517172、错误#97540)

  • 复制: 如果从属在相关表中的列多于主,则在对复制通道执行特权检查时会引发断言。检查现在引用事件中的列数,而不是表定义中的列数。(缺陷号 30343310)

  • 复制: 当复制组成员离开组时,无论是因为 STOP GROUP_REPLICATION发布还是由于错误,组复制现在停止二进制日志转储线程,以便前组成员无法将不需要的二进制日志数据发送到留在组中的成员团体。(缺陷号 30315614)

  • 复制:保存在表中 的复制连接参数 mysql.slave_relay_log_info现在在服务器崩溃或故意重启的情况下保留在发布之后RESET SLAVE但发布之前START SLAVE。此操作适用于PRIVILEGE_CHECKS_USER 复制权限检查的帐户设置(在 MySQL 8.0.18 中引入)和REQUIRE_ROW_FORMAT 设置(在 MySQL 8.0.19 中引入)。请注意,如果 relay_log_info_repository=FILE 在服务器上设置(这不是默认设置且已弃用),则在这种情况下不会保留复制连接参数。(缺陷号 30311908)

  • 复制: 当通过指定 PRIVILEGE_CHECKS_USER不应具有 ACL 特权的帐户GRANT,复制到通道的语句会导致复制应用程序停止。在这种情况下,行为是正确的,但提出了断言。该断言现已被删除。(缺陷号 30273684)

  • 复制: 当组复制在使用克隆操作进行配置、执行 RESET MASTER或从中继日志中删除部分事务后启动时,RESET SLAVE ALL在内部用于清除服务器上任何不需要的状态。但是,在 MySQL 8.0.18 中,这会导致 PRIVILEGE_CHECKS_USER为组复制通道指定的任何帐户被删除。 RESET SLAVE现在改为使用,不会删除帐户。(缺陷号 30262225)

  • 复制: 对于多线程复制从站, 当相关对象不存在时slave_preserve_commit_order=1 现在保留带有子句的语句顺序IF EXISTS以前,这些更新可能在中继日志中先于它们的事务之前提交,这可能导致从从属中继日志中执行的事务序列中出现间隙。(缺陷号 30262096)

  • 复制: 当对复制通道进行权限检查时,sql_require_primary_key 没有检查设置系统变量会话值所需的权限。现在进行检查。(缺陷号 30254917)

  • 复制: 当失败的复制组成员试图重新加入少数组但被禁止这样做时,可能会发生内存泄漏。(漏洞 #30162547,漏洞 #96471)

  • 复制: 当一个组成员重新加入一个复制组时,它通过检查其 group_replication_applier通道的中继日志以查找它已经从该组接收到的任何事务并应用这些事务来开始分布式恢复过程。加入的成员然后从现有的在线成员启动状态传输,这可能从远程克隆操作开始。以前, group_replication_applier当远程克隆操作开始时,通道并没有明确停止,因此应用程序可能仍在应用现有事务,这可能会导致错误。这group_replication_applier通道现在在请求远程克隆操作之前停止,并在分布式恢复过程继续从捐赠者的二进制日志进行状态传输时重新启动。(漏洞 #30152028,漏洞 #96447)

  • 复制: 如果STOP GROUP_REPLICATION在成员的 XCom 端口被阻塞时发出,则 XCom 线程挂起并且关闭未完成。XCom 现在在这种情况下终止。(缺陷号 30139794)

  • 复制: 当 Group Replication 在单主模式下运行,并且选择了一个新的主服务器时,此时记录的消息现在提供了新选择的主服务器的 gtid_executed集合,以及复制应用程序检索到的 GTID 集合。(缺陷号 30049310)

  • 复制: 从属状态日志 mysql.slave_relay_log_info(中继日志信息日志)和mysql.slave_worker_info(从属工作者日志)现在在本地或远程克隆操作期间从捐赠者复制到接收者。从属状态日志包含可用于在克隆操作后正确恢复复制的信息,包括重新启动复制的中继日志位置、 PRIVILEGE_CHECKS_USER帐户设置和新REQUIRE_ROW_FORMAT设置。请注意,中继日志本身并没有从捐赠者复制到接收者,只有关于它们的信息保存在这些表中。另请注意,如果 relay_log_info_repository=FILE 在服务器上设置(这不是默认设置并且已弃用),从属状态日志不会被克隆;它们仅在TABLE设置时被克隆。

    在此补丁之前,以下与复制相关的行为发生在已由克隆操作提供的复制从站上:

    • 如果默认复制通道是从站上的唯一通道,它将无法启动,因为由于缺少中继日志信息,它被认为未初始化。

    • PRIVILEGE_CHECKS_USER已应用于捐助者复制通道的 任何帐户设置都不存在,必须重新指定。

    • 使用 GTID 自动定位(由语句中的MASTER_AUTO_POSITION 选项指定CHANGE MASTER TO)的复制通道能够自动恢复复制。

    • 使用基于二进制日志文件位置的复制(由语句中的 MASTER_LOG_FILEMASTER_LOG_POS选项 指定CHANGE MASTER TO)的复制通道必须具有MASTER_LOG_FILEMASTER_LOG_POS在重新启动复制之前手动重新应用选项以便正确恢复。如果通道配置为在服务器启动时自动开始复制,则在没有重新应用选项的情况下,它们将尝试从头开始复制。因此,他们可能会尝试复制已通过克隆操作复制到从属设备的数据,从而导致复制停止并可能损坏从属设备上的数据。

    使用此补丁,以下与复制相关的行为现在发生在已由克隆操作提供的复制从站上:

    • 默认复制通道现在可以始终在克隆操作后启动,如果它被配置为这样做的话。

    • 所有频道现在都有捐赠者的 PRIVILEGE_CHECKS_USER账户设置和 REQUIRE_ROW_FORMAT设置。

    • 使用 GTID 自动定位(由语句中的MASTER_AUTO_POSITION 选项指定CHANGE MASTER TO)的复制通道仍然能够自动恢复复制。对于使用 GTID 自动定位的组复制通道,现在使用语句的内部等效项 RESET MASTER来确保复制以最佳方式恢复。

    • 使用基于二进制日志文件位置的复制的复制通道现在在克隆后具有正确的 MASTER_LOG_FILEMASTER_LOG_POS适当的选项。因为中继日志本身没有被克隆,这些通道现在尝试在重新启动复制之前使用克隆的中继日志信息执行中继日志恢复过程。对于单线程从站(slave_parallel_workers设置为 0),中继日志恢复应该在没有任何其他问题的情况下成功,使通道能够正确恢复复制。对于多线程从站(slave_parallel_workers大于0),relay log recovery很可能会失败,因为它通常不能自动完成,但是会发出提示性的错误信息,数据不会被破坏。

    (错误#29995256,错误#30510766)

  • 复制: 当系统变量设置为限制从站上中继日志的大小时,多线程复制从站可能会发生内部死锁 relay_log_space_limit,并且协调器线程获取与此限制和日志结束位置相关的锁。(漏洞#29842426)

  • 复制: 如果复制组成员意外停止并立即重新启动(例如,因为它是用 启动的 mysqld_safe),它会自动尝试重新加入组,如果 group_replication_start_on_boot=on 已设置。以前,如果重新启动和重新加入尝试发生在该成员的前任被逐出该组之前,该成员将无法重新加入。现在在这种情况下,Group Replication 自动使用 Group Communication System (GCS) 功能为成员重试 10 次重新加入尝试,每次重试之间有 5 秒的间隔。这应该涵盖大多数情况,并留出足够的时间让前任从小组中被驱逐,让成员重新加入。请注意,如果 group_replication_member_expel_timeout 系统变量设置为在成员被驱逐之前指定更长的等待时间,则自动重新加入尝试可能仍然不会成功。(漏洞 #29801773)

  • 复制:CHANGE MASTER TO如果使用未指定主日志文件名和主日志位置 的语句设置复制从属 START SLAVE发出之前关闭,然后使用 --relay-log-recovery设置的选项重新启动,复制不会启动。发生这种情况是因为在尝试中继日志恢复之前接收器线程尚未启动,因此中继日志中没有可用的日志轮换事件来提供主日志文件名和主日志位置。在这种情况下,从属现在跳过中继日志恢复并记录警告,然后继续开始复制。(缺陷 #28996606,缺陷 #93397)

  • macOS: 在 macOS 上,配置 MySQL -DWITH_SSL=system导致 mysql_config输出错误地包含静态 SSL 库的内部CMake名称。(漏洞 #30541879,漏洞 #97632)

  • macOS: 使用 Ninja 在 macOS 上构建可能会失败,并多次尝试创建符号链接时出错。(缺陷号 30368985)

  • 微软Windows; JSON: 在 Windows 平台上,用于多值索引的内存在包含它的表被删除后不会被释放。(缺陷号 30227756)

  • Microsoft Windows: 在 Windows 上,-DWITH_SSL=system 如果安装了 Strawberry Perl,则无法找到已安装的 OpenSSL 标头。(缺陷号 30359287)

  • Microsoft Windows: 在 Windows 上,-DWITH_SSL=system 如果指向系统 OpenSSL 库的路径名包含空格,则该选项不起作用。现在已经处理了。此外, 与在其他平台上-DWITH_SSL=yes一样对待 -DWITH_SSL=system(缺陷 #30261942,缺陷 #96739)

  • Microsoft Windows: MSVC 2019 为编译错误生成了乱码源文件名。已实施配置中的解决方法CMake 来纠正此问题。(缺陷 #30255096,缺陷 #96720)

  • JSON:JSON通过将字符串元素替换为包含与字符串表示形式相同的字节序列的二进制字符串来 更新列中的值utf8mb4无效。

    这个问题的根本原因是 MySQL 8.0.17 中多值索引的实现引入了 JSON 字符串和 JSON 不透明值之间的比较行为的变化,在此之前,JSON 字符串和 JSON 不透明值永远不会被认为是相等的. 更改后,如果它们的二进制数据匹配,则认为它们相等。

    对这一变化的分析表明不需要它;此外,新行为与现有的 JSON 值比较文档相冲突。此问题已通过恢复原始行为得到修复。(缺陷号 30348554)

  • JSON: 使用的视图JSON_TABLE()未保留编码 JSON 路径参数的字符集。这意味着,如果使用与定义它的字符集不同的有效字符集评估视图,它可能会产生错误的结果。这是通过确保JSON_TABLE()在这种情况下保留原始字符集来解决的。(缺陷号 30310265)

  • JSON: 在 JSON 列上添加功能索引更改了用于比较字符串的排序规则,导致选择该列的同一查询返回的结果与没有索引时获得的结果不同。(漏洞 #29723353)

  • JSON: 如果第一个参数 JSON_TABLE()const在存储过程执行期间,而不是准备期间,则在随后再次执行语句时不会重新计算,导致第一次执行后每次返回空结果程序。(缺陷 #97097,缺陷 #30382156)

  • JSON: 在某些情况下,比如当查询使用 时FORCE INDEX,读取表的成本是 DBL_MAX;这被四舍五入到 2e308打印时,这对于 JSON 解析器来说太大了,因此无法使用查询提取部分优化器跟踪,例如SELECT JSON_EXTRACT(trace, '$**.table_scan') FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE. 现在在这种情况下,大于1.5e308的值会向下舍入并打印为1e308。(缺陷 #96751,缺陷 #30226767)

  • 从 MySQL 5.7 升级到 MySQL 8.0 后, CLONE INSTANCE 操作失败并出现以下错误:ERROR 3862 (HY000): Clone Donor Error: 1016 : Can't open file: './undo001'。升级过程留下了孤立的内存中撤消表空间。感谢 Satya Bodapati 的贡献。(错误#30602218、错误#97784、错误#30239255、错误#96637)

  • MySQL 优化器的散列连接算法使用连接缓冲区来存储中间结果。如果此缓冲区溢出,服务器将使用一种溢出到磁盘的算法,该算法将哈希连接操作数之一写入一个临时文件,以从容地处理此问题。如果其中一个操作数是一个表,该表是推式连接操作的成员,则此策略与所有子结果行使用嵌套循环读取的推式连接要求相冲突,只要它们的推式连接祖先之一是推式连接中的当前行连接评估,这在某些情况下可能会导致返回不正确的查询结果。(缺陷号 30573733)

  • 对表的访问 INFORMATION_SCHEMA.VIEWS未正确限制为正确的用户。(缺陷号 30542333)

  • 在散列连接期间创建用于查找的散列值时,服务器不遵守该PAD SPACE 属性,这意味着在使用排序规则'foo''foo '不匹配 。PAD SPACE这是通过将所有字符串填充到与最长可能字符串相同的长度来解决的,其中最长可能字符串是从 or 中的数据类型长度说明符推导 出来 N的 。(缺陷号 30535541)CHAR(N)VARCHAR(N)

  • 当从辅助引擎检索包含 DECIMAL列的大型结果集时,将列值转换为字符串以便通过文本协议传输成为瓶颈。正如内部测试所反映的那样,负责此类转换的函数的性能在某些情况下提高了 50%。(缺陷号 30528427)

  • FORMAT_PICO_TIME() 调用该函数来处理多行时,一旦 NULL在一行中找到一个参数,之后的每个结果都将设置为NULL。(缺陷号 30525561)

  • 当 Performance Schema 事件被计时时, 对于计时器开始值和结束值相等的事件,表中报告的事件持续时间可能不是 0。(缺陷号 30525560)events_xxxNULL

  • 向带括号的查询添加一个LIMIT子句会抑制括号内的锁定子句。例如,此查询不会锁定表:

    (SELECT ... FOR UPDATE) LIMIT ...;

    在带括号的查询之外添加LIMIT子句旨在覆盖 LIMIT括号内的子句。但是,括号内的外部也LIMIT被抑制了。ORDER BY例如,对于此查询,ORDER BY被抑制了:

    (SELECT ... ORDER BY ... LIMIT a) LIMIT b;

    现在内部锁定和ORDER BY子句不会被外部LIMIT子句抑制。(错误#30521098,错误#30521803)

  • 当优化器在常量表上提取条件以进行早期评估时,它不包括WHERE 评估成本高昂的条件,包括涉及存储函数的条件。当提取的条件评估为真时,因为它只涉及常量表,整个WHERE条件被错误地删除。现在在这种情况下,在删除任何条件之前执行昂贵条件的检查WHERE 。(缺陷号 30520714)

  • 当使用横向具体化派生表 DISTINCT时,派生表没有按预期为每个外部行重新具体化。(缺陷号 30515233)

  • EXPLAIN ANALYZE使用 . 的公用表表达式无法正常工作WITH RECURSIVE。(缺陷号 30509580)

  • GNU gold loader 可能会导致某些平台上的内存耗尽。现在它仅在 Intel 64 位平台上默认使用。(漏洞 #3050​​4760,漏洞 #96698)

  • 一些 Linux 平台 EXPLAIN ANALYZE由于使用系统调用libstdc++而不是 clock_gettime(). (缺陷号 30483025)

  • 在 Solaris 11.4 上,无法构建 LDAP 身份验证插件。(缺陷号 30482553)

  • 使用MEMBER OF() 运算符的查询并不总是得到正确处理。(缺陷号 30477993)

  • 由于 VC++ 2013 错误的 Boost 解决方法已修复,因此在 Visual Studio 下 Boost 编译失败。解决方法现在已针对使用 MySQL 的 Boost 编译进行了修补。(缺陷 #30474056,缺陷 #97391)

  • 当从辅助引擎检索包含许多整数的大型结果集时,将整数转换为字符串以便通过文本协议发送可能会成为瓶颈。为避免此问题,执行此类转换的内部函数的性能已得到改进。(缺陷号 30472888)

  • Docker 包缺少 LDAP 身份验证插件。(缺陷号 30465247)

  • 更正了 mysys/my_handler_errors.h错误消息中的拼写错误。感谢 Nikolai Kostrigin 的贡献。(缺陷 #30462329,缺陷 #97361)

  • 启用时的 GTID 表更新 innodb_force_recovery导致调试断言失败。(缺陷 #30449531,缺陷 #97312)

  • MySQL 无法针对 Protobuf 3.10 进行编译。(错误#30428543,错误#97246)

  • 系统启动期间缓冲的日志行可能会丢失。(缺陷 #30422941,缺陷 #97225)

  • 如果mysql.user重命名系统表,服务器可能会退出。(缺陷号 30418070)

  • 撤销未指定主机名的角色可能会导致服务器退出。(缺陷号 30416389)

  • 当半连接内的其他表依赖于该表时,判断是否拉出半连接表时,只考虑那些作为基表的半连接表;嵌套连接中的那些被忽略。(缺陷号 30406241)

    参考资料:另请参阅:Bug #12714094、Bug #11752543、Bug #43768。

  • Ubuntu 平台上的 AppArmor 配置文件无法读取 OpenSSL 配置。(缺陷号 30375723)

  • 某些 Fedora 30 软件包缺少过时信息,这些信息可能会导致升级现有 MySQL 安装时出现问题。(错误#30348549,错误#96969)

  • 仅更改语句中的默认加密会 ALTER SCHEMA导致架构默认字符集和排序规则重置为系统默认值。(错误#30344462,错误#96994)

  • 同时使用AUTO_INCREMENTDEFAULT值表达式(不允许的组合)声明的列可能会引发断言或导致服务器退出。(缺陷号 30331053)

  • SHOW GRANTS对于匿名用户,在某些情况下可能会导致服务器退出。(缺陷号 30329114)

  • GREATEST()并且 LEAST()并不总是正确处理时间值。(缺陷号 30326848)

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

  • 分区对象中的子分区列表未序列化,因此未包含在序列化字典信息 (SDI) 中。为了解决这个问题,添加了对子分区字典信息的序列化和反序列化的支持。此错误的补丁还包括次要的 SDI 代码重构和格式更改。由于格式更改,SDI 版本号增加了。(漏洞 #30326020,漏洞 #96943)

  • 在执行 之后ANALYZE TABLE,给定查询的优化器跟踪在之前执行另一个查询时有所不同,但在ANALYZE TABLE. (缺陷号 30321546)

  • innodb_buffer_pool_instances 如果已使用SET PERSIST或设置,则在服务器启动时未正确初始化PERSIST_ONLY。(缺陷号 30318828)

  • 低值max_allowed_packet导致以下错误:ERROR 1153 (08S01) at line 1: Got a packet bigger than 'max_allowed_pa​​cket' bytes。修改了错误消息以指示 max_allowed_packet克隆操作所需的最小值。(错误#30315486,错误#96891)

  • 当服务器代码试图向客户端发送旨在写入错误日志的错误代码时,可能会引发断言。这些实例通过发送旨在发送给客户端的代码来修复。(缺陷号 30312874)

  • CREATE VIEW当视图定义的主体包含一个连接和多个子选择时,并不总是成功。(缺陷号 30309982)

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

  • SLES 12 RPM包的依赖信息不正确,导致MySQL安装失败。(缺陷号 30308305)

  • GEOMETRY当从hash join chunk文件中 恢复数据到一个GEOMETRY列时,服务器并没有将数据复制到该列,而是存储了一个指向该数据的指针,该指针驻留在一个临时缓冲区中,这意味着该GEOMETRY列一旦指向随机数据该缓冲区被重用。GEOMETRY现在,服务器在执行散列连接时总是将数据从此缓冲区复制到 列中。(缺陷号 30306279)

  • 使用该算法的某些ALTER TABLE操作COPY未正确处理具有表达式默认值的列。(漏洞 #30302907,漏洞 #96864)

  • CONV()函数并不总是能够正确处理返回正确数量的字符。(缺陷号 30301543)

  • 解析器递归检查不足以防止堆栈溢出。(缺陷号 30299881)

  • 移除一个子查询因为它出现的条件总是false本来是在解析的时候执行的,但是当子查询不涉及任何表的时候,服务器边解析边执行。这导致后续检查无法确认子查询仅被解析而尚未优化。现在在这种情况下,服务器还会检查子查询是否已经执行。(缺陷号 30273827)

  • 对于调试版本,尝试向一个空的临时表添加一个包含无效表达式 default 的列会引发断言。(缺陷号 30271792)

  • 迭代器树的构造可能会产生非层次结构;例如,当 bcfroma LEFT JOIN b LEFT JOIN c也构成半连接的右侧时,就会发生这种情况。迭代器执行器通过在整个查询之上添加一个 weedout 来解决这个问题,这意味着迭代器与行 ID 交互也是必要的,他们需要存储和恢复它们。并非在所有此类情况下都这样做,从而导致错误的结果。现在,在构造任何受影响的迭代器之前,一旦知道正在执行此操作,就会始终将添加顶级除草器传达给迭代器。(缺陷号 30267889)

  • 消除了 SQL 层和数据字典之间的外键处理代码重复。一个副作用是一些错误消息现在更加翔实和清晰。(漏洞 #30267236,漏洞 #96765)

  • 在启动期间,服务器可能会不正确地处理持久变量的不正确选项值,从而导致服务器退出。(缺陷号 30263773)

  • 在一些涉及物化半连接的查询中,当使用迭代器执行器时,条件是在物化之外评估的,导致使用低效的查询计划,有时还会产生错误的结果。(缺陷号 30250091)

  • ALTER TABLE重命名约束中使用的列的语句CHECK可能会导致不正确的错误消息。(缺陷号 30239721)

  • 对于SELECT语句, 锁定子句之前的子句是合法的,但解析器拒绝了它。(缺陷 #30237291,缺陷 #96677)INTO var_name

  • FLUSH TABLES WITH READ LOCKLOCK INSTANCE FOR BACKUP当先前在同一会话中执行一条语句并且ALTER DATABASE在另一个会话中针对为该语句指定(隐式或显式)的同一数据库运行并发语句时,会导致死锁FLUSH TABLES WITH READ LOCK。(缺陷号 30226264)

  • 对于未使用经典客户端/服务器协议的连接,慢速查询日志记录可能会导致服务器退出。(缺陷号 30221187)

  • 添加没有显式名称的外键的语句在作为准备好的语句重新执行时或在存储程序中失败时会出现无根据的重复外键名称错误。(漏洞 #30214965,漏洞 #96611)

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

  • INSERT ... ON DUPLICATE KEY UPDATE如果多个会话对具有AUTO_INCREMENT列但未指定值的表 执行并发语句AUTO_INCREMENT,则插入可能会因唯一索引冲突而失败。(漏洞 #30194841,漏洞 #96578)

  • 客户端程序可以从插件库外部加载身份验证插件。(错误#30191834,错误#30644258)

  • 在表扫描和索引查找之间切换时, AlternativeIterator没有重置处理程序,这可能导致断言失败。(缺陷号 30191394)

  • 设置open_files_limit为较大的值,或在操作系统 rlimit 的值较大但不等于时设置它 RLIM_INF可能会导致服务器内存不足。作为此修复的一部分,服务器现在将有效值 open_files_limit限制为最大无符号整数值。(漏洞 #30183865,漏洞 #96525)

  • INFORMATION_SCHEMA根据指定的字母大小写, 对完全限定表的引用 可能会失败INFORMATION_SCHEMA。(缺陷号 30158484)

  • 执行时间超过 35 天的慢速查询可能会导致mysql.slow_log需要REPAIR TABLE 操作的系统表损坏。(缺陷 #30113119,缺陷 #96373)

  • MySQL 不支持将 systemd 通知消息发送到使用NOTIFY_SOCKET 环境变量指定的套接字,如果该变量命名为抽象命名空间套接字。(缺陷号 30102279)

  • 使用SET PERSIST_ONLY将布尔系统变量设置为数值导致服务器无法重新启动。(错误#30094645、错误#30298191、错误#96848)

  • 上一个问题的修复以 TABLE_LIST不幸的方式组合了两个构造函数。其中之一从表示临时表的对象创建了一个TABLE_LIST对象TABLE。以前,表名与别名相同;这已更改为从 TABLE对象复制名称。由于对于临时表来说,表名是一个文件路径,所以有可能超过MDL_key名称的限制,导致断言失败。通过重新引入以修复之前的方式运行的专用构造函数来修复。(缺陷号 30083125)

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

  • 对于UNIX_TIMESTAMP()存储函数中发生的错误,后续函数调用的小数秒数可能不正确。(错误#30034972,错误#96166)

  • 当公用表表达式包含非确定性表达式(例如使用 RAND()的表达式)并且公用表表达式在外部查询中被多次引用时,在某些情况下它会被合并。这导致公用表表达式为每个引用返回不同的结果。现在在这种情况下,公用表表达式不会合并,而是具体化。(缺陷号 30026353)

  • 在带有 lower_case_table_names=1 设置的 Linux 上启动的 MySQL 调试版本中,从 MySQL 8.0.16 就地升级后丢弃分区表的表空间导致严重错误。数据字典中存储的分区表空间名称无效,MySQL 8.0.17为分区表空间准备的元数据锁键与表中存储的键不匹配 mysql.tablespaces。(缺陷号 30024653)

  • KILL QUERY可以杀死预期的声明之后的声明。(漏洞#29969769)

  • 使用lower_case_table_names=2, SHOW TABLES可能无法显示具有大写名称的表。(漏洞#29957361)

  • 为生成列尝试升级具有无效表达式的表而报告的错误消息没有提供足够的信息。错误消息现在包括生成的列名和用于创建生成列的表达式。(错误#29941887,错误#95918)

  • 尝试显示无法解析的视图可能会导致服务器退出而不是错误。(漏洞#29939279)

  • 不正确地检查 CREATE TABLE语句的时间文字可能会导致服务器退出。(缺陷 #29906966,缺陷 #95794)

  • 在系统资源暂时不可用时尝试为并行读取操作生成线程会引发系统错误。(缺陷号 29874480)

  • 将意外值写入 mysql.global_grants系统表可能会导致服务器退出。(漏洞#29873343)

  • 表中的LAST_EXECUTED值在 INFORMATION_SCHEMA.EVENTSUTC 中错误报告,而不是在事件时区中。(缺陷 #29871530,缺陷 #95649)

  • 通过 keyring_encrypted_file_password 在服务器启动时在命令行上进行设置,系统实用程序可以看到密码值。(缺陷号 29848634)

  • 从 MySQL 5.7 升级到 MySQL 8.0 时更改 lower_case_table_names设置可能会由于模式或表名字母大小写不匹配而导致失败。如果 lower_case_table_names=1是,则升级过程现在会检查表和模式名称,以确保所有字符都是小写的。如果发现表或模式名称包含大写字符,则升级过程会失败并出现错误。有关相关信息,请参阅 准备安装以进行升级。(缺陷 #29842749,缺陷 #95559)

  • 如果LOCK TABLES语句生效,锁定表的元数据更改可能会导致性能模式或SHOW会话变量查询挂起 opening_tables。(漏洞 #29836204,漏洞 #92387)

  • 使用表格 SELECT的 条件导致不可能的范围导致服务器意外退出。(漏洞#29770705)WHEREA AND (B OR C [OR ...])

  • 对于 JSON 格式的审计日志记录,该id字段现在可以包含大于 65535 的值。以前,随着日志记录活动的增加,每秒可以执行超过 65536 个查询,超过了 id值允许的 16 位。(漏洞#29661920)

  • 不完整的连接数据包可能导致客户端无法正确初始化身份验证插件名称。(缺陷号 29630767)

  • 来自解析器的内存不足错误可以被忽略,导致服务器退出。(漏洞 #29614521)

  • 在 Linux 上,当禁用并重新启用性能模式文件检测时,可能会引发断言。(漏洞 #29607570)

  • PRIMARY KEY对于在 语句中 定义为 a 的列CREATE TABLE,忽略作为表达式给出的默认值。(缺陷 #29596969,缺陷 #94668)

  • 在 MySQL 8.0.16 中添加的TABLE_ENCRYPTION_ADMIN 权限在升级过程中被错误地授予了系统定义的mysql.session用户。(缺陷 #29596053,缺陷 #94888)

  • 对于使用 OpenSSL 加密的连接,性能模式未报告套接字级别的网络 I/O。IDLE此外,性能模式未报告在服务器处于某种状态时执行的网络 I/O 。(错误#29205129,错误#30535558,错误#97600)

  • 当查询使用合并到外部查询块中的子查询时(由于派生表的半连接转换或合并),并且子查询本身包含一个带有聚合函数的子查询,该子查询的聚合查询块不同于其基本查询块,查询有时可能无法返回任何行,除非第二次执行或以FLUSH TABLES. 这是因为在合并时,关于使用的表的信息和聚合函数的聚合信息没有正确更新。在引发此错误报告的情况下,这意味着包含标量子查询的比较操作被视为执行常量,因此范围优化器尝试对其进行评估,并且标量子查询包含MIN() 引用外部引用的函数还没有被阅读。因此,当聚合器对象被填充时,它基于未初始化的数据,导致不可预测的结果。(漏洞#28941154)

  • 更改mandatory_roles 系统变量可能会导致SHOW GRANTS并发会话产生不正确的结果。(漏洞#28699403)

  • 初始化失败keyring_aws导致 SSL 套接字初始化失败。(漏洞#28591098)

  • 在某些情况下,启用 read_onlyor super_read_only系统变量不会阻止没有SUPER权限的用户执行并发 DDL 语句。(漏洞 #28438114,漏洞 #91852)

  • 当前GROUP BY计划已改进,以便允许每个间隙属性具有相等谓词的析取。来自不同属性的谓词必须仍然相互连接才能利用此增强功能。

    我们感谢 Facebook 的贡献。(错误#28056998,错误#15947433)

  • 在某些情况下,和 函数的BIGINT参数被解析为错误的类型。(漏洞 #27125612)FLOOR()CEILING()

  • 按照设计, mysqlpump 会退出而不是转储包含无效视图的数据库,但如果存在无效视图但不在要转储的任何数据库中,它也会失败。(漏洞 #27096081)

  • 外键信息现在是从数据字典中检索的,而不是从InnoDB. (缺陷号 25583288)

  • 如果语句包含在条件注释(例如 or )中,则忽略表的CREATE TABLEALTER TABLE 语句中 使用的外键定义。(错误#21919887,错误#78631)InnoDB/*!50101 ... *//*! ... */

  • --log-raw选项现在可在运行时作为log_raw系统变量使用。系统变量在启动时设置为选项值,并且可以在运行时设置以更改密码屏蔽行为。(错误#16636373,错误#68936)

  • EXPLAIN ANALYZE没有执行SELECT列表中的子查询,因此在计算时间或成本时没有考虑它们。(缺陷 #97296,缺陷 #30444266)

  • 包含外部引用的内部标量子查询使用 SELECT右侧的嵌套表达式集返回的结果与使用SELECT等效的单个表达式时的结果不同。(缺陷 #97063,缺陷 #30381092)

  • 具体化子查询可能会产生不同的结果,具体取决于它是否使用索引。(缺陷 #96823,缺陷 #30289052)

  • 当查询由于超过使用MAX_EXECUTION_TIME 提示指定的时间而终止时,产生的错误因查询的阶段而异。特别是,如果查询在文件排序期间终止,则引发的错误是 ER_FILSORT_ABORT,即使在这种情况下查询应始终以 退出 ER_QUERY_TIMEOUT。这使得捕获此类错误并正确处理它们变得不必要地困难。

    此修复程序删除了错误代码 ER_FILSORT_ABORTER_FILESORT_TERMINATED. (缺陷 #96537,缺陷 #30186874)

  • 如果存储过程有一个名为 memberarray的参数,并且在没有引用参数名称的情况下定义它,则定义它的数据库无法升级到 8.0.17 或 8.0.18。(缺陷 #96288,缺陷 #30084237)

    参考资料:另请参阅:Bug #96350、Bug #30103640。

  • COALESCE()or 之类的函数IFNULL()被传递了一个 BIGINT列值时,将此函数的负返回值转换为 UNSIGNED意外产生的零。

    感谢 Oleksandr Peresypkin 的贡献。(缺陷 #95954,缺陷 #29952066)

  • EXPLAIN输出显示 为在索引列上Select tables optimized away使用的查询,但如果在用户函数中调用同一列,则显示 。(缺陷 #94862,缺陷 #29596977)MAX()MAX()Using index