Documentation Home
MySQL 8.0 发行说明  /  MySQL 8.0.17 的变化(2019-07-22,正式发布)

MySQL 8.0.17 的变化(2019-07-22,正式发布)

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

审核日志说明

  • 加密的 MySQL Enterprise Audit 日志文件的加密和解密操作使用存储在 MySQL 密钥环中的密码。以前,只存储一个密码。生成新密码使旧密码无法访问,致使 MySQL Enterprise Audit 无法读取使用旧密码加密的日志文件。MySQL Enterprise Audit 现在在密钥环中实现密码历史记录,其中包括密码存档和过期功能。审计日志插件在每个加密的日志文件名中包含读取文件所需的密码 ID。要启用过期和删除密钥环中的旧存档密码, audit_log_password_history_keep_days 可以使用新的系统变量。看 配置审核日志记录特征

C API 说明

  • 进行了这些 C API 更改:

    • HOSTNAME_LENGTH已从 60 更改为 255,并从include/mysql_com.h 移至include/my_hostname.h

    • USER_HOST_BUFF_SIZE已从 include/mysql_com.h移至 sql/auth/auth_common.h

    (缺陷号 29590300)

字符集支持

  • utf8mb4字符集有一个新的二进制排序 规则utf8mb4_0900_bin,它与现有的utf8mb4_bin二进制排序规则不同,如下所示:

    • 对于整理权重,utf8mb4_bin使用代码点,可能添加前导零字节,而 utf8mb4_0900_bin使用 utf8mb4编码字节。两种排序规则的排序顺序相同,但排序 utf8mb4_0900_bin要快得多。

    • 的填充属性utf8mb4_binPAD SPACE,而 utf8mb4_0900_bin它是NO PAD。因此,涉及的 utf8mb4_0900_bin操作不会添加尾随空格,并且涉及带有尾随空格的字符串的比较对于两种排序规则可能不同。

    有关详细信息,请参阅 Unicode 字符集

组件注释

  • 提供了一个新的mysql_current_thread_reader组件服务,使组件能够获取当前线程的句柄。例如,该服务允许组件通过将其线程句柄传递给其他服务来访问当前会话的属性。有关此服务的信息,请参阅 MySQL Server Doxygen 文档的组件子系统部分,该文档位于 https://mysql.net.cn/doc/index-other.html

配置注意事项

  • 目录下的源文件mysys_ssl已经移到mysys目录下,mysys_ssl不再建库。(缺陷号 29488066)

  • MySQL 配置现在要求最低 CMake版本为 3.5.1。(错误号 29337090)

  • 整个 MySQL 主机名的最大允许长度已从之前的 60 个字符的限制提高到 255 个 ASCII 字符。这适用于,例如,数据字典、 mysql系统架构、性能架构 INFORMATION_SCHEMAsys架构中与主机名相关的列;声明的 MASTER_HOST价值 CHANGE MASTER TO;语句输出中的 Host列;SHOW PROCESSLIST帐户名中的主机名(例如在帐户管理语句和 DEFINER属性中使用);和主机名相关的命令选项和系统变量。

    注意事项:

    • 允许的主机名长度的增加会影响在主机名列上具有索引的表。例如,mysql系统模式中索引主机名的表现在具有显式ROW_FORMAT 属性DYNAMIC以容纳更长的索引值。

    • 一些文件名值配置设置可能是基于服务器主机名构建的。允许的值受底层操作系统的限制,它可能不允许文件名足够长以包含 255 个字符的主机名。这会影响 general_log_filelog_errorpid_filerelay_logslow_query_log_file系统变量以及相应的选项。如果基于主机名的值对于操作系统来说太长,则必须提供明确的更短的值。

    • 尽管服务器现在支持 255 个字符的主机名,但使用该 --ssl-mode=VERIFY_IDENTITY 选项建立的与服务器的连接受到 OpenSSL 支持的最大主机名长度的限制。主机名匹配属于SSL证书的两个字段,最大长度如下: Common Name:最大长度64;主题备用名称:根据 RFC#1034 的最大长度。

    预期主机名最多为 60 个字符的应用程序应进行调整以解决此更改。(错误#13548245、错误#63814、错误#27925782、错误#90601、错误#27955121、错误#29584642、错误#29602081、错误#94907)

调试说明

  • MySQL 服务器是一个多线程应用程序,它使用大量内部锁定原语,例如互斥体。为了能够检测锁获取死锁并强制运行时执行不受死锁影响,MySQL 现在支持 LOCK_ORDER 工具。这使得锁顺序依赖图能够被定义为服务器设计的一部分,并且服务器运行时检查以确保锁获取是非循环的并且执行路径符合该图。LOCK_ORDER 支持包括:

    • lock_order_dependencies.txt定义服务器锁定顺序依赖关系图 的文件。

    • 一个CMake选项,用于配置 MySQL 是否使用 LOCK_ORDER 工具构建。 WITH_LOCK_ORDER

    • 在服务器执行期间配置 LOCK_ORDER 工具操作的一组系统变量。

    • mysql-test-run.pl 的一个--lock-order选项,用于 控制在测试用例执行期间是否启用 LOCK_ORDER 工具。

    要使用 LOCK_ORDER 工具,您必须在启用工具的情况下从源代码构建 MySQL。请参阅LOCK_ORDER 工具。它旨在用于调试服务器,而不是用于生产用途。

弃用和移除说明

  • X DevAPI: 对于Collection对象,以下方法已被弃用,并计划在未来的版本中删除:

    • Collection.find().where()

    • Collection.modify().where()

    • Collection.remove().where()

    任何Collection依赖该 .where()方法的代码都应该更新,.where()方法中的表达式应该直接在适当.find().remove()、 和.modify() 方法中提供。

  • mysql_upgrademysql_upgrade_info程序在之前升级过程中创建的文件 只能由执行mysql_upgrade程序的操作系统用户修改,导致升级错误。现在发出警告而不是错误,这允许升级操作继续进行。该 文件已弃用,将在未来的 MySQL 版本中删除。(缺陷 #29702060,缺陷 #95165)mysql_upgrade_info

  • FLOAT(M,D) 和 语法来指定类型列的位数 并且 (和任何同义词)是一个非标准的 MySQL 扩展。此语法已弃用,并且在未来的 MySQL 版本中将删除对它的支持。(漏洞 #25328973,漏洞 #84363)DOUBLE(M,D)FLOATDOUBLE

  • 对于字符串数据类型,该BINARY属性是一个非标准的 MySQL 扩展,它是指定_bin列字符集(如果未指定列字符集,则为表默认字符集)的二进制 ( ) 排序规则的简写。在 MySQL 8.0 中,这种非标准使用BINARY是不明确的,因为utf8mb4字符集有多个_bin排序规则,因此 BINARY不推荐使用该属性,并且在未来的 MySQL 版本中将删除对它的支持。应调整应用程序以改为使用显式_bin 排序规则。

    使用BINARY指定数据类型或字符集保持不变。

  • 非标准 C-style &&||!operators 分别是标准 SQL ANDOR和 operators 的同义词NOT,已被弃用,并且在未来的 MySQL 版本中将删除对它们的支持。使用非标准运算符的应用程序应调整为使用标准运算符。

    笔记

    ||除非 PIPES_AS_CONCAT启用 SQL 模式,否则不推荐 使用。在这种情况下,||表示 SQL 标准字符串连接运算符)。

  • 对于数字数据类型,该ZEROFILL属性已弃用,整数数据类型的显示宽度属性也是如此。ZEROFILL在未来的 MySQL 版本中将删除对整数数据类型的支持和显示宽度。考虑使用替代方法来产生这些属性的效果。例如,应用程序可以使用该LPAD() 函数将数字补零到所需的宽度,或者它们可以将格式化后的数字存储在 CHAR列中。

  • 对于类型为、 和 (以及任何同义词)UNSIGNED的列, 该属性已弃用,并且在未来的 MySQL 版本中将删除对它的支持。考虑对此类列使用简单的约束。 FLOATDOUBLEDECIMALCHECK

  • AUTO_INCREMENTFLOAT不推荐使用and (和任何同义词)类型的列,DOUBLE并将在未来的 MySQL 版本中删除。考虑 AUTO_INCREMENT从此类列中删除属性,或将它们转换为整数类型。

  • SQL_CALC_FOUND_ROWS查询修饰符和附带 的FOUND_ROWS() 函数现已弃用,并将在未来的 MySQL 版本中删除。作为替换,考虑使用 执行您的查询LIMIT,然后使用COUNT(*)和不 执行第二个查询LIMIT以确定是否有其他行。例如,而不是这些查询:

    SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
    SELECT FOUND_ROWS();

    请改用这些查询:

    SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
    SELECT COUNT(*) WHERE id > 100;

    COUNT(*)受到某些优化。SQL_CALC_FOUND_ROWS导致某些优化被禁用。

安装注意事项

  • 服务器启动时的自动升级可能需要一些时间才能完成。为了在 systemd 环境中获得更好的状态通知,服务器现在会在升级开始和结束时向系统通知套接字发送消息。(可以使用服务器 mysqld status监视状态。)(缺陷 #29493201)

钥匙圈笔记

  • keyring_aws插件已更新为使用最新的 AWS 加密 SDK,因此它适用于 OpenSSL 1.1。

    keyring_aws_region变量支持新 SDK 支持的其他 AWS 区域。有关支持的 AWS 区域列表,请参阅变量描述。

包装说明

  • 为了减少 mysql-community-serverLinux 包的下载大小和磁盘占用空间,调试二进制文件和插件已被移动到这些平台的单独包中:

    • EL8、Fedora:mysql-community-server 带有调试二进制文件和相关插件的包现在分为mysql-community-server 没有调试二进制文件或插件的 mysql-community-server-debug包和带有调试二进制文件和插件的包。

    • Debian:mysql-community-server 带有调试二进制文件和相关插件的包现在分为mysql-community-server 没有调试二进制文件或插件的 mysql-community-server-debug包、带有调试二进制文件的 mysql-community-test-debug包和带有调试插件的包。

    在所有情况下,调试包都依赖于相应的mysql-community-server包。(错误#29769061、错误#28647754、错误#92415、错误#29702765、错误#95169、错误#29681301)

性能模式注释

  • 改进了编译时的性能架构版本检查,以防止与服务器版本不兼容。(漏洞 #29550156)

  • 以前,RWLOCK 的性能模式工具将优先级读/写锁命名为rwlock (因此无法区分普通锁和优先级锁)并且没有收集有关所执行的解锁操作类型的信息。优先读/写锁现在命名为 prlock,因此它们的事件以 wait/synch/prlock. 此外,还提供了有关解锁操作的信息。(缺陷号 29270712)

插件说明

  • 如果使用该选项在服务器启动序列中 --early-plugin-load加载(即在InnoDB初始化之前) ,则 并非所有插件都能正常运行 。但是, InnoDB需要密钥环后端插件才能对加密表进行操作。为了使插件能够向服务器指示它们是否可以提前加载, PLUGIN_OPT_ALLOW_EARLY可以在插件描述符中使用一个新标志。请参阅 服务器插件库和插件描述符。MySQL 发行版中包含的密钥环插件现在 PLUGIN_OPT_ALLOW_EARLY启用了该标志,因为 InnoDB需要它们,但标志不限于密钥环插件。可以为能够在服务器启动序列的早期成功初始化的其他插件设置它。

    --plugin-load此标志对是否可以在服务器启动时使用或 --plugin-load-add选项或在运行时使用INSTALL PLUGIN 语句 加载插件没有影响 。

    使用 8.0.17 之前的 MySQL 发行版编译的所有插件都没有设置此标志。将这些加载到 8.0.17 之前的服务器时这无关紧要,但是尝试将使用 --early-plugin-load8.0.17 之前的 MySQL 发行版编译的插件二进制文件加载到 8.0.17 或更高版本的服务器中将会失败。必须针对 MySQL 8.0.17 或更高版本重新编译插件。(缺陷 #29040456,缺陷 #93550)

安全说明

X 插件说明

  • 由于 MySQL 8.0.16 中的回归,该createIndex()方法不支持 DOUBLE(M,D)指定双精度值的语法。(漏洞#29748841)

  • X 协议对带有编码为八位字节的参数的消息的处理已得到纠正,以支持非标量数据,例如字符串数组。(漏洞#29721046)

  • 当 SSL 连接 ( ) 的主机名身份验证处于活动状态时--ssl-mode=VERIFY_IDENTITY,X 协议不会检查与服务器证书颁发机构 (CA) 证书中的主题备用名称 (SAN) 的匹配项。这可能会导致连接请求被不必要地拒绝,因为它们使用了指定为 SAN 而不是证书的 Common Name 值的有效主机名。(漏洞#29691694)

  • 当准备好的语句与 X 插件一起使用时, 在修改或查找操作中使用INorNOT IN会产生无效的 JSON,从而导致错误。(漏洞 #29259501)

  • 在 Windows 上,X 插件记录了一些不必要或信息不足的消息。这些消息已被适当删除或改进。(漏洞 #27839153)

  • X Plugin 的 SQL 函数列表已过时,并已更新以添加新函数并删除不再可用的函数。(漏洞#26574971)

添加或更改的功能

  • 创新数据库;JSON: 现在支持数组InnoDB的多值索引JSON多值索引是指多条索引记录可以指向同一条数据记录的索引。这对于索引JSON文档很有用,例如 {"user":"Bob","zipcode":[94477,94536]}在其中,如果我们希望搜索所有邮政编码,则文档中的每个邮政编码都需要有两个索引记录。我们可以如下语句 zipcode数组CREATE INDEX

    CREATE INDEX zips ON t1( (CAST(data->'$.zipcode' AS UNSIGNED ARRAY)) )

    实际上,这是一个使用函数的函数索引,该 CAST()函数已使用ARRAY关键字进行扩展,以支持将 JSON 数组转换为 SQL 数据类型数组。表达式必须是有效的 JSON 表达式,并且必须指向 JSON 文档中的数组才能生效。除和CAST()之外,可以使用 支持的所有类型说明符。只有 支持对函数的这种用法,并且仅用于在数组 上创建多值索引。BINARYJSONCAST()InnoDBJSON

    作为这项工作的一部分,MySQL 添加了一个新函数 JSON_OVERLAPS()以及一个 MEMBER OF()用于处理JSON文档的新运算符,如下所述:

    • JSON_OVERLAPS()比较两个 JSON文档。如果它们包含任何共同的键值对或数组元素,则函数返回 TRUE (1);否则返回 FALSE (0)。如果两个值都是标量,则该函数执行简单的相等性测试。如果一个参数是 JSON 数组而另一个是标量,则标量将被视为数组元素。因此,JSON_OVERLAPS()作为 的补充 JSON_CONTAINS(),指示是否所有键值对或数组元素都存在于两个JSON 文档中。

    • MEMBER OF()测试第一个操作数(标量或 JSON 文档)是否是作为第二个操作数传递的 JSON 数组的成员,如果是则返回 TRUE (1),否则返回 FALSE (0)。不执行操作数的类型转换。

    MySQL 优化器自动为任何合适的查询使用多值索引,即在其 WHERE子句中 使用JSON_CONTAINS()JSON_OVERLAPS()MEMBER OF()JSON 列中数组中的任何一个的查询。EXPLAIN您可以通过检查给定查询 的输出来查看是否实际使用了这样的索引 。

    Multi-Valued Indexes,提供有关多值索引的更多详细信息,包括示例。有关 和 的更多信息 JSON_OVERLAPS()以及MEMBER OF()使用示例,请参阅 搜索 JSON 值的函数

    笔记

    ARRAYMEMBERnow 是保留字,不能在没有标识符引用的情况下用作标识符。

  • Microsoft Windows: 一条新的警告消息现在提醒 DBA,在 Windows 上使用 MySQL 命名管道建立的连接限制了连接器可以在命名管道上请求的权限。

    以前, named_pipe_full_access_group 系统变量默认设置为映射到内置 WindowsEveryone组 (SID S-1-1-0) 的值。但是,这个组并不理想,应该替换为一个限制其成员资格的组,这些连接器无法在 MySQL 命名管道上请求更少的权限。

    named_pipe_full_access_group如果分配给的字符串值是 '*everyone*'(或等效的 Windows 系统语言)并且启用了命名管道,则 新警告将在启动时写入错误日志 。此外,如果Everyone 在运行时将系统变量重置为组,警告将写入错误日志并向客户端发出。

  • JSON: MySQL 现在支持使用两个函数 JSON_SCHEMA_VALID()JSON_SCHEMA_VALIDATION_REPORT(),这两个函数都根据符合 JSON 模式规范草案 4 的 JSON 模式验证 JSON 文档。 JSON_SCHEMA_VALID()如果文档根据架构进行验证,则返回 true,否则返回 false。 JSON_SCHEMA_VALIDATION_REPORT()返回一个 JSON 文档,其中包含有关验证结果的详细信息。

    对于这两个函数,以下语句适用:

    • required支持属性。

    • 支持正则表达式(无效的表达式被忽略)。

    • $ref不支持 架构中的外部资源和 关键字。

    有关更多信息(包括示例),请参阅 JSON 模式验证函数

  • time_zone会话变量现在可以使用 优化SET_VAR器提示进行提示。(漏洞#29776464)

  • C 客户端库的次要版本libmysqlclient.so 已增加到 1(21.0 到 21.1),表示已添加新符号。这样做是为了纠正 MySQL 8.0.16 版本中的疏忽。为了解决兼容性问题,所有符号的版本都没有改变。这意味着库的文件名是 libmysqlclient.so.21.1.17,而库中的所有符号都标记为 21_0(与 8.0.16 版本相比没有变化)。(错误#29584073,错误#29642146)

  • 感谢 Josh Braden、Daniël van Eeden、Simon Mudd 和 Zhou Mengkang,他们对 MySQL 源代码中的注释和消息做出了更正。(错误#29403708、错误#94464、错误#29428435、错误#94527、错误#29262200、错误#94049、错误#29468128、错误#94625)

  • mysql客户端程序 现在发送 os_useros_sudouser 连接属性(如果可用)分别指示运行该程序的操作系统用户的名称和SUDO_USER环境变量的值。有关连接属性的一般信息,请参阅 性能模式连接属性表。感谢 Daniël van Eeden 对此功能所做出的贡献。(缺陷 #29210935,缺陷 #93916)

  • 优化器现在将内部WHERE 具有、、 或的条件 转换为反连接,从而删除子查询。这类似于现有的( ) 外连接优化;有关详细信息,请参阅 EXPLAIN Extra InformationNOT IN (subquery)NOT EXISTS (subquery)IN (subquery) IS NOT TRUEEXISTS (subquery) IS NOT TRUEIS NULLNot exists

    此外,半连接具体化现在可用于 WHERE具有、 或 的条件,或者当条件属于左连接(例如 )时。请参阅 使用半连接转换优化 IN 和 EXISTS 子查询谓词IN (subquery) IS TRUEEXISTS (subquery) IS TRUEINSELECT * FROM t1 LEFT JOIN t2 ON t2.x IN (SELECT * FROM t3)

    同样由于这项工作,MySQL 现在能够简化 as 形式(x IS TRUE) IS FALSEx IS NOT TRUE条件,与最初编写的条件相比,可以更快地测试和更容易地优化它。(漏洞 #29027883)

  • IDENTIFIED WITHoutput from 子句中 显示的密码哈希值SHOW CREATE USER可能包含不可打印的字符,这些字符会对终端显示和其他环境产生不利影响。启用新 print_identified_with_as_hex 系统变量会导致SHOW CREATE USER将此类哈希值显示为十六进制字符串而不是常规字符串文字。即使启用了此变量,不包含不可打印字符的哈希值仍显示为常规字符串文字。为了与此更改兼容,CREATE USER现在ALTER USER接受指定为常规字符串文字或十六进制字符串的哈希值。(缺陷 #28053446,缺陷 #90947)

  • 在 MySQL 8.0 中,该 lower_case_table_names变量只能在 MySQL 服务器初始化时配置。因为在 Debian 和 Ubuntu 上使用 APT 执行的 MySQL 服务器安装会为您初始化 MySQL 服务器,所以没有机会启用 lower_case_table_names. 要解决此问题,您现在可以使用该 实用程序在使用 APT 安装 MySQL 之前 debconf-set-selection启用 lower_case_table_names(set )。lower_case_table_names=1

    lower_case_table_names在使用 APT 安装 MySQL 之前启用,请执行以下命令:

    shell> sudo debconf-set-selections <<< "mysql-server mysql-server/lowercase-table-names select Enabled

    (缺陷 #27948395,缺陷 #90695)

  • 现在,服务器在启动时会更好地检查 SSL 服务器证书,如果发现问题,则会将警告写入错误日志。(漏洞 #25945005)

  • 使用 SELECT ... INTO OUTFILE或 创建的文件的 umaskSELECT ... INTO DUMPFILE从 0666 更改为 0640。该 LOAD_FILE()功能不再要求文件是世界可读的,只需服务器可读。(漏洞 #24513720)

  • mysqldump选项 --set-gtid-purged控制是否将 语句SET @@GLOBAL.gtid_purged添加到mysqldump输出。该语句更新了 gtid_purged重新加载转储文件的服务器上的值,以添加从源服务器的gtid_executed系统变量中设置的 GTID。--set-gtid-purged=COMMENTED现在有了新的选择 。设置此值后,如果在要备份的服务器上启用了 GTID,SET @@GLOBAL.gtid_purged则会将其添加到输出中(除非 gtid_executed为空),但会被注释掉。这意味着 gtid_executed在输出中可用,但重新加载转储文件时不会自动执行任何操作。使用COMMENTED,您可以 gtid_executed手动或通过自动化控制集合的使用。例如,如果您正在将数据迁移到另一台已经具有不同活动数据库的服务器,您可能更愿意这样做。感谢 Facebook 的贡献。(缺陷 #94332,缺陷 #29357665)

  • MySQL 现在支持对 , 的显式转换 DOUBLEFLOAT以及 REAL使用函数CAST()CONVERT(). 有关详细信息,请参阅Cast 函数和运算符。(缺陷 #30524,缺陷 #11747058)

  • InnoDB现在支持重做日志归档。当备份操作正在进行时,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的步伐,从而导致由于重做日志记录被覆盖而丢失重做日志记录。重做日志归档功能通过将重做日志记录顺序写入归档文件来解决这个问题。备份实用程序可以根据需要从归档文件中复制重做日志记录,从而避免潜在的数据丢失。

    有关详细信息,请参阅 重做日志归档

  • JSON数据提供额外的索引选项,InnoDB现在支持多值索引。多值索引是在包含值数组的列上定义的二级索引。

  • MySQL 现在提供了一个克隆插件,允许 InnoDB在本地或从远程 MySQL 服务器实例克隆数据。本地克隆操作将克隆的数据存储在运行 MySQL 实例的同一服务器或节点上。远程克隆操作通过网络将克隆数据从捐赠者 MySQL 服务器实例传输到发起克隆操作的接收服务器或节点。

    克隆插件支持复制。除了克隆数据之外,克隆操作还从捐赠者那里提取和传输复制坐标,并将它们应用于接收者,这使得可以使用克隆插件来配置组复制成员和复制从属。使用克隆插件进行配置比复制大量事务要快得多,效率也高得多。组复制成员也可以配置为使用克隆插件作为替代恢复方法,以便成员自动选择最有效的方式从种子成员检索组数据。

    有关详细信息,请参阅克隆插件分布式恢复克隆

  • Group Replication 为组中的成员版本实施的兼容性策略现在考虑成员的 MySQL Server 版本的补丁版本。以前,只考虑主要版本。使用补丁版本意味着 Group Replication 可以在组重新配置和升级过程中更好地维护混合版本组的复制安全。

    当成员首次加入该组时,或之后的升级后,选择捐赠者进行状态转移以及主要成员选举进行时,将应用兼容性策略。运行 MySQL 8.0.16 或更低版本,或 MySQL 5.7 的会员,仅在这些情况下考虑主要版本。对于主要成员选举,以便所有成员做出相同的决定,运行 MySQL 8.0.17 版本的成员调整他们的策略以匹配运行较低版本的成员(如果组中有的话)。

    在运行多个 MySQL Server 版本的成员在线的多主模式组中,例如在滚动在线升级过程中,组复制现在自动管理运行 MySQL 8.0.17 版本的成员的读写和只读状态。如果成员离开组,则运行当前最低版本的成员将自动设置为读写模式。当您将以单主模式运行的混合版本组更改为以多主模式运行时,使用该 group_replication_switch_to_multi_primary_mode() 功能,组复制会根据其 MySQL 服务器版本自动将成员设置为读写或只读模式。

    改进的兼容性策略会影响组成员在从一个补丁版本在线升级过程中的行为,就像从一个主要版本升级到另一个主要版本期间的行为受到影响一样。对于多主模式组,在升级过程中减少了处于读写模式的成员数量,但组复制现在会在升级完成后自动管理其读写状态。对于单主模式组,如果您希望主保持为主,则必须最后升级它。

  • Group Replication 现在可以使用远程克隆操作在分布式恢复期间将状态传输到加入的成员。远程克隆操作使您可以将新成员添加到组中,而无需事先手动将组的数据传输到服务器。要使用此功能,您必须在捐赠者和加入成员上安装克隆插件,授予 BACKUP_ADMIN复制用户分布式恢复的权限,并设置新的 group_replication_clone_threshold 系统变量到适当的水平。组复制自动配置所需的克隆插件设置并管理远程克隆操作。当克隆完成并且加入成员重新启动时,该组在远程克隆操作正在进行时应用的事务通过复制从捐赠者的二进制日志传输到加入成员,以完成分布式恢复。

  • 在事务期间保存在二进制日志事务和语句缓存中的数据在存储缓存的内存缓冲区中采用未加密格式。如果数据超过内存缓冲区中的可用空间,则将数据写入磁盘上的临时文件。从 MySQL 8.0.17 开始,当二进制日志加密在服务器上处于活动状态时(binlog_encryption=ON),用于二进制日志缓存的临时文件现在使用 AES-CTR(AES 计数器模式)进行流加密。由于临时文件是易失性的并且绑定到单个进程,因此使用单层加密对它们进行加密,使用随机生成的文件密码和初始化向量,这些密码和初始化向量仅存在于内存中,从不存储在磁盘或密钥环中。在每个事务提交后,二进制日志缓存被重置:内存缓冲区被清除,用于保存二进制日志缓存的任何临时文件被截断,并且随机生成新的文件密码和初始化向量以供下一个事务使用。

  • 不完整的 SQL 谓词的形式为 ,其中 是列名或常量表达式,并且不使用比较运算符。MySQL 现在在上下文化阶段在内部重写任何这种类型的谓词,因此查询解析器、查询优化器和查询执行器只需要处理完整的谓词。此更改的主要可见效果是,对于布尔值, 输出现在显示and ,而不是and 。 WHERE valuevalueWHERE value <> 0EXPLAINtruefalse10

  • InnoDB通过更好地利用读取线程、减少并行扫描期间发生的预取活动的读取线程 I/O 以及支持分区并行扫描,提高了大型数据集的并行读取线程性能。

    并行读取线程功能由 innodb_parallel_read_threads 变量控制。现在最大设置为 256,这是所有客户端连接的线程总数。如果达到线程限制,连接将退回到使用单个线程。

  • mysqlbinlog现在支持 --compress(或 -C)选项以在客户端/服务器协议中启用压缩。

修正错误

  • NDB Cluster:使用包含的compile_cluster构建脚本 的 NDB Cluster 的编译时间 已通过删除运行 MySQL Cluster 并非绝对必要的软件组件选项得到改进。(漏洞 #29355872)

  • NDB Cluster: 尝试更改NDB 表的列属性(例如 COLUMN_FORMATALTER TABLE ALGORITHM=INPLACE被拒绝,这是正确的行为,但会引发误导性错误消息。(错误#28929906,错误#27645777)

  • InnoDB: 尝试终止正在执行行计数的进程时发生故障。(漏洞#29939617)

  • InnoDB: 由于 MySQL 8.0.14 中引入的回归,对于具有分区表和 lower_case_table_names=1. 失败是由与分区表文件名相关的大小写不匹配问题引起的。引入回归的修复程序已恢复,允许从 MySQL 5.7 或 MySQL 8.0.14 之前的 MySQL 8.0 版本升级到 MySQL 8.0.17 以正常运行。但是,回归仍然存在于 MySQL 8.0.14、8.0.15 和 8.0.16 版本中。

    在将二进制文件或包升级到 MySQL 8.0.17(如果分区)后启动服务器时,在区分大小写的文件系统上从 MySQL 8.0.14、8.0.15 或 8.0.16 到 MySQL 8.0.17 的就地升级失败并出现以下错误表格存在并且 lower_case_table_names=1

    Upgrading from server version version_number with
    partitioned tables and lower_case_table_names == 1 on a case sensitive file
    system may cause issues, and is therefore prohibited. To upgrade anyway,
    restart the new server version with the command line option 'upgrade=FORCE'.
    When upgrade is completed, please execute 'RENAME TABLE part_table_name
    TO new_table_name; RENAME TABLE new_table_name
    TO part_table_name;' for each of the partitioned tables.
    Please see the documentation for further information.

    如果升级到 MySQL 8.0.17 时遇到此错误,请执行以下解决方法:

    1. 重新启动服务器 --upgrade=FORCE以强制升级操作继续进行。

    2. 使用小写分区名称分隔符(#p##sp#) 标识分区表文件名:

      SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES
          WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%';
    3. 对于每个识别的文件,使用临时名称重命名关联的表,然后将表重命名回其原始名称。

      mysql> RENAME TABLE table_name TO temporary_table_name;
      mysql> RENAME TABLE temporary_table_name TO table_name;
    4. 验证没有分区表文件名带有小写分区名称定界符(应返回空结果集)。

      mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES
          ->     WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%';
      Empty set (0.00 sec)
    5. 在每个重命名的表上运行ANALYZE TABLE以更新 mysql.innodb_index_statsmysql.innodb_table_stats表中的优化器统计信息。

    由于 MySQL 8.0.14、8.0.15 和 8.0.16 版本中仍然存在回归,因此不支持将分区表从 MySQL 8.0.14、8.0.15 或 8.0.16 导入 MySQL 8.0.17敏感文件系统,其中 lower_case_table_names=1. 尝试这样做会导致表缺少表空间错误。(错误#29823032、错误#29917793、错误#95834)

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

  • InnoDB: lock_sys减少了由锁定等待函数(lock_wait_suspend_thread()lock_wait_table_release_slot())引起的互斥锁争用。(漏洞#29814339)

  • InnoDB:fseg_n_reserved_pages_low()确定段保留页数 的(漏洞#29761998)

  • InnoDB: 事务回滚列表 (hit_list) 的创建与锁获取调用 (lock_rec_lock调用 ) 分离,以允许使用不同的锁存方案。(缺陷号 29753800)

  • InnoDB: 禁用 Performance Schema 消费者导致 ALTER TABLESPACE ... ENCRYPTION操作断言。(缺陷 #29646974,缺陷 #95005)

  • InnoDB: 修改了错误消息以删除对 .frmMySQL 8.0 中未使用的文件的引用。(漏洞#29639655)

  • InnoDB: 在撤消表空间完全初始化和加密标志设置之前,后台线程可以检查撤消表空间的加密状态。(漏洞 #29600309)

  • InnoDB: 在解析未格式化为包含数据库名称的序列化字典信息 (SDI) 表名称时,表名称解析函数调用返回 false。保存数据库名称的缓冲区仍未初始化,导致 Valgrind 错误。(漏洞 #29550527)

  • InnoDB: 在微型事务(mtr)日志缓冲区中为动态元数据日志保留的空间不足。(漏洞 #29524260)

  • InnoDB: 争用感知事务调度 (CATS) 实现中的不准确性在 MySQL 的 UBSan 构建中引发了有符号整数溢出错误。(缺陷 #29508517,缺陷 #91959)

  • InnoDB: rw-lock 实现中的内存屏障不足导致 ARM 出现死锁。

    感谢 Arm Technology 的 Yibo Cai 做出的贡献。(漏洞 #29508001,漏洞 #94699)

  • InnoDB:启用撤消表空间加密后未更新 该 (缺陷 #29492911,缺陷 #94665)INFORMATION_SCHEMA.INNODB_TABLESPACES ENCRYPTION

  • InnoDB: 由于对包含正斜杠字符 (/) 的模式或表名的错误解析,无法访问重定位的表,服务器错误地将其解释为目录分隔符。(漏洞#29492113)

  • InnoDB:InnoDB对memcached 源代码 应用了各种修复和修订 (漏洞 #29485891)

  • InnoDB: 为了启用全局访问, innodb_directories变量的值现在作为全局变量而不是静态变量在内部存储。(漏洞#29471990)

  • InnoDB: 在调试版本中,该thd_innodb_tmpdir() 函数不接受 NULL 参数。(漏洞#29471846)

  • InnoDB: 文件空间分配代码中的减法运算错误地将结果存储为无符号变量,从而导致断言失败。(缺陷号 29466680)

  • InnoDB: 在移动或删除默认撤消表空间并使用新 innodb_undo_directory值重新启动服务器后,MySQL 在新位置重新创建撤消表空间但无法更新数据字典中的撤消目录路径。(漏洞 #29461900)

  • InnoDB: 在恢复期间回滚事务时访问了先前释放的 LOB 页面。(缺陷号 29440408)

  • InnoDB: 在恢复期间发出请求,在没有要读取的页面时将页面读入缓冲池。添加了检查以避免不必要的读取请求。(错误号 29440208)

  • InnoDB:在MySQL 实例上创建分区表时 ,MySQL 8.0.14 中引入的回归导致无效(旧?)表或数据库名称lower_case_table_names=1错误。导致回归的更改已恢复。(缺陷 #29426720,缺陷 #94519)

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

  • InnoDB: MySQL 5.6创建 的FULLTEXT索引表,名称中带连字符的数据库,从MySQL 5.7升级到MySQL 8.0后启动失败。FULLTEXT在数据字典中找不到辅助表的表空间文件路径(缺陷 #29411899,缺陷 #94431)

  • InnoDB: 如果重做日志在逻辑上不是空的并且包含单个块,并且在插入缓冲区合并生成新的重做记录后但在新记录可以刷新到磁盘之前服务器在恢复期间退出,则可能会发生数据丢失。(漏洞 #29411832,漏洞 #94448)

  • InnoDB: 尝试创建路径和文件名超出Windows 限制 InnoDB的表空间时返回未知的一般错误现在返回一个更有意义的错误。(漏洞#29341634)MAX_PATHInnoDB

  • InnoDB: 移动到其他目录后未找到撤消表空间文件。(缺陷号 29328158)

  • InnoDB: 服务器无法使用 innodb_buffer_pool_size=default 设置启动。未检查默认值是否与相关系统变量设置兼容。(缺陷 #29267814,缺陷 #94065)

  • InnoDB:CREATE TABLESPACE ... ADD DATAFILE子句不再允许循环目录引用。例如,/../以下语句中的循环目录引用 ( ) 是不允许的:

    CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd 'any_directory/../ts1.ibd';

    Linux 上存在此限制的一个例外,如果前面的目录是符号链接,则允许循环目录引用。例如,如果 any_directory是符号链接,则允许上例中的数据文件路径。(仍然允许数据文件路径以 ' ../' 开头。)

    为避免升级问题,请在升级到 MySQL 8.0.17 或更高版本之前从表空间数据文件路径中删除任何循环目录引用。要检查表空间路径,请查询 INFORMATION_SCHEMA.INNODB_DATAFILES 表。(漏洞 #29157265)

  • InnoDB: 在 MySQL 服务器运行时手动更改系统时间导致页面清理器线程延迟。(缺陷 #29138644,缺陷 #93708)

  • InnoDB: UPDATE语句在遇到错误时并不总是正确地禁用半一致性读取,这可能导致调试模式下的断言错误。(缺陷号 29047894)

  • InnoDB: 清除已删除的行时,管理锁继承的逻辑没有正确确定应该继承的锁类型以满足活动事务的约束检查。(漏洞 #29004362)

  • InnoDB: 在模式下执行准备好的语句时,对隐式打开的数据字典表进行了不必要的读取锁定 LOCK TABLES。(漏洞#28875646)

  • InnoDB: 在日志应用期间,在OPTIMIZE TABLE操作之后,InnoDB在检查虚拟列索引更新之前没有填充虚拟列。(缺陷号 28834208)

  • InnoDB: 从聚簇索引复制数据的操作执行不正确,导致空间索引使用带有指向聚簇索引的陈旧指针的空间行。(漏洞#28758961)

  • InnoDB:INSERT涉及生成的虚拟 的BLOB导致二级索引被更新为不正确的值。(漏洞#28652826)

  • InnoDB: 配置 innodb_data_file_pathinnodb_temp_data_file_path 使用SET PERSIST_ONLY = default错误地将变量值设置为 NULL。(错误号 28590014)

  • InnoDB: 操作CREATE TABLE ... REPLACE SELECT引发 lock_rec_get_rec_not_gap(lock)断言失败。该操作在事务对象上设置了一个标志,表明REPLACE 请求了一个操作,但在更新依赖视图之前没有清除该标志,导致后续 INSERT操作被解释为一个REPLACE 操作,从而导致采取错误的行锁。(漏洞 #28523025,漏洞 #92068)

  • InnoDB:启用后, 对super_read_only的尝试RENAME TABLE 操作会引发断言而不是返回错误。(漏洞 #28490368,漏洞 #91975)

  • InnoDB: 由于在虚拟索引前缀搜索期间读取未初始化的字节,报告了 Valgrind 错误。(漏洞 #28184025)

  • InnoDB: InnoDB尝试创建大于 2GB 的系统表空间时初始化失败。(漏洞#27538464)

  • InnoDB: 如果全文缓存大小超过全文缓存大小限制,则不会释放数据同步时获取的全文缓存锁。(缺陷号 25289359)

  • InnoDB: 计数器报告负值。(缺陷 #20584149,缺陷 #75966)INNODB_METRICS metadata_table_reference_count

  • InnoDB:在执行并发插入操作时 使用不同 auto_increment_increment值的客户端会话可能会导致重复键错误。(错误#15851528,错误#67526)

    参考资料:恢复的补丁:Bug #14049391,Bug #65225。

  • 分区: 对于分区表,ALTER TABLE在这些情况下语句可能会导致不正确的查询结果:

    • 该语句通过重命名来交换列,直接使用RENAME COLUMN或替换为DROP COLUMN/ ADD COLUMN

    • 在分区表达式中使用了交换列。

    • 更改是作为就地操作执行的,不会在分区之间重新分配行。

    现在禁止此类列重命名,除非同一 ALTER TABLE语句满足以下条件之一:

    • 该语句使表未分区。

    • 该语句重新定义表分区或分区表达式(这会导致重新分配行的表重建)。这支持支持分区表达式更新以跟随列重命名的现有场景。

    • PARTITION BY KEY()使用空列列表 指定分区。此分区使用跟踪列重命名的主键。

    (缺陷 #29541665,缺陷 #94792)

  • 分区: 当分区表具有使用不同行格式的分区时,即使要交换的分区使用与非分区表相同的行格式,ALTER TABLE ... EXCHANGE PARTITION的错误 Non matching attribute 'ROW_FORMAT' 也会失败。(漏洞#28687608)

  • 复制: 当消息碎片用于大型 Group Replication 消息(可用,默认情况下,来自 MySQL 8.0.16)时,如果 XCom 中具有最高节点标识符的组成员发送的碎片消息被部分传递,并且一个或然后更多的成员在传递剩余的消息片段之前离开了组,消息的重组导致组复制停止工作。成员的丢失意味着原始发件人的节点标识符在组的新视图中不再有效。为纠正此问题,分段消息的重组现在使用最后一个已传送片段的传送信息,这反映了视图更改后的新情况,而不是从交付的第一个片段开始,它反映了视图更改之前的旧情况。(漏洞#29716639)

  • 复制: 针对组成员数量和自增间隔之间的差异发出的错误消息错误地引用了 group_replication_auto_increment_increment 系统变量,而不是 auto_increment_increment系统变量。的值 auto_increment_increment更改为 group_replication_auto_increment_increment 组复制启动时指定的值,但前提是 auto_increment_incrementauto_increment_offset具有它们的默认值,并且从 MySQL 8.0 开始,仅在多主模式下。的值 auto_increment_increment始终是为错误消息检查的值,现在已更正以提供准确的系统变量名称。(漏洞#29542425)

  • 复制:MINIMAL在使用选项 ( 的 MySQL 服务器升级后无法启动组复制--upgrade=MINIMAL,这不会升级复制内部所依赖的系统表。以前,在这种情况下,服务器会无限期地等待 Group Replication 启动。现在可以通过解除等待线程的阻塞并发出预期的错误来正确处理这种情况 ER_GRP_RPL_START_GRP_RPL_FAILED。(缺陷 #29423358,缺陷 #94515)

  • 复制: 在 Group Replication 的群组通信系统 (GCS) 中,对离开群组的成员的怀疑处理进行了更改,这减少了某些测试用例的执行时间,在恢复失败的情况下导致了问题,因为它导致恢复失败和视图更改通知之间存在循环依赖。现在,如果错误导致无法恢复,GCS 会按适当的顺序采取处理操作。成员离开组,应用视图更改,然后终止恢复线程。(错误#29417365,错误#29628909)

  • 复制: 当一个 MySQL 服务器实例生成的事件被写入另一个实例的二进制日志时,第二个服务器隐含地假设第一个服务器支持与它自己相同数量的二进制日志事件类型。如果不是这种情况,则事件标头处理不正确。该问题现已解决。感谢 Facebook 的贡献。(缺陷 #29417234,缺陷 #94500)

  • 复制: 在组复制中,加入成员可能会错误地将自己标识为与现有复制组不兼容,即使组中已经有相同版本的成员,因为他们检查所有其他成员,包括最高版本的成员。加入成员还在兼容性检查中包括了他们自己的版本。现在,加入成员只会在最低版本上与已有的群成员进行比较,不计入自己的版本。(缺陷 #29390946,缺陷 #94429)

  • 复制: 如果LOCK INSTANCE FOR BACKUP 语句用于获取实例级备份锁,然后发出STOP SLAVE语句,则可能会产生死锁,SQL 线程等待备份锁,STOP SLAVE语句等待 SQL 线程完成其当前操作。为了防止这种情况, STOP SLAVE进程现在在继续之前尝试获取备份锁,如果无法获取锁则返回错误。(缺陷 #29386503,缺陷 #93649)

  • 复制: 从 MySQL 8.0.13 开始,如果任何复制通道打开了临时表,则无法使用 SET @@global.binlog_formatSET @@persist.binlog_format。以前,如果在实施新限制后尝试执行此操作,则会向客户端返回错误的错误消息(引用正在运行的复制通道应用程序作为问题,而不是打开的临时表)。现在返回适当的错误消息。(漏洞 #29370024,漏洞 #94340)

  • 复制: 反序列化格式描述事件时,二进制日志校验和处理不正确。(漏洞 #29355110)

  • 复制:在使用基于行的复制时,当复制应用程序线程解压缩行更改事件时,将为“之前图像和之后图像 计算任何功能索引的索引值 。在之前图像的情况下,这些值不是必需的。因此,为了优化行解包,已为前图像删除了此计算。(漏洞 #29304076)

  • 复制:MEMORY服务器重启后主服务器上的表被隐式删除时,主服务器将一条 DELETE语句写入二进制日志,以便从服务器也清空该表。DELETE这个生成的事件现在在二进制日志中包含一条注释,这样就很容易识别该语句的原因感谢 Daniël van Eeden 的贡献。(缺陷 #29157796,缺陷 #93771)

  • 复制: 如果在 SHOW BINLOG EVENTS FROM语句中提供了无效的起始偏移量,则返回无效偏移量以代替第一个返回事件的正确起始位置。(缺陷 #29039732,缺陷 #93544)

  • 复制: 如果在主执行期间出现问题,用于配置在线组的组复制功能有时不会返回错误。这些函数现在还在开始初始化之前检查 Group Replication 插件是否正在停止。(缺陷 #28978767,缺陷 #93372)

  • 复制:当 为系统变量设置值(MySQL 8.0 中的默认值) 时,复制可能会因“找不到记录 错误 而停止 ,并且更新事件包含对表中同一行的两次更新,但没有唯一的key,表示使用了散列扫描。在这种情况下,由于行更改,散列扫描错过了第二次更新。现在,在更新一行之后,散列扫描操作在散列映射中搜索更新的行,并应用任何进一步的更新。 INDEX_SCAN,HASH_SCANslave_rows_search_algorithms

    TABLE_SCAN,HASH_SCAN为系统变量设置 值slave_rows_search_algorithms ,使得搜索不能使用索引时, 无论表是否有唯一键,都会出现上述情况的record not found ”错误。此外,使用此设置,当对具有唯一键的表使用哈希扫描时,如果更新事件包含两个依赖于顺序的行更新,则更新可能会乱序应用,从而导致复制因重复键错误而停止。为避免这些问题,已更新文档以声明TABLE_SCAN,HASH_SCAN 不应使用该值。(漏洞#28846386)

  • 复制: 当在复制从站上启用二进制日志记录时, 如果服务器是循环复制拓扑的一部分,则从站上--replicate-same-server-id--log-slave-updates(在 MySQL 8.0 中,默认启用二进制日志记录,启用二进制日志记录时默认启用从更新日志记录。)但是,全局事务标识符 (GTID) 的使用通过跳过已经执行的事务的执行来防止这种情况。应用。因此,现在取消了对这种选项组合的限制 gtid_mode=ON已设置。对于任何其他 GTID 模式,服务器仍然不会以这种选项组合启动。作为防止在服务器启动后出现问题情况的保护措施,您现在不能将 GTID 模式更改为任何 ON设置了此选项组合的正在运行的服务器。感谢 Facebook 的贡献。(漏洞 #28782370,漏洞 #92754)

  • 复制: 用于组复制的组通信引擎(XCom,一种 Paxos 变体)没有以适当的方式处理内存不足错误。如果无法分配内存来复制消息的有效负载,则会记录错误,但仍会发送消息,但有效负载为空。接收成员上的组通信系统 (GCS) 将消息丢弃为空,接收成员上的 XCom 实例接受了此操作并且没有重试,导致消息被有效地跳过。这导致接收成员上设置的 GTID 与组不同,从而导致复制错误。如果 XCom 遇到内存不足错误,它现在会正常终止,这样就不会发生这种情况。

  • Replication: 在二进制日志中的查询日志事件中,用于执行DROP TABLEand DELETE语句的线程ID被错误识别或根本没有识别。在涉及临时表的多线程复制从站上(需要正确的线程 ID,因为它们是特定于会话的),这种遗漏导致在使用mysqlbinlog重放二进制日志以进行时间点恢复时出错。线程 ID 现在已正确设置。(错误#28642318,错误#92398)

  • 复制: 当触发器调用将列设置为其默认值INSERTor 列的表达式是不确定的时,当触发器在基于语句的复制下触发时,不会引发预期的警告。此外,如果二进制日志记录格式为 ,则非确定性语句将以用于 而不是用于。 UPDATEDEFAULTMIXEDSTATEMENTROW

    导致触发器触发的语句在解析时检查是否有任何触发语句是不确定的。此时触发语句已经被解析,但还没有被解析,所以唯一可以检查的是触发语句是否直接引用了非确定性运算符。当DEFAULT表达式使用非确定性运算符时,在解决触发语句之前,不确定性是不可见的,这在触发器触发时发生。

    这是通过在确定日志记录格式时添加额外检查来解决的,如果语句的任何子语句可以写入具有非确定性DEFAULT表达式的列的表,则该语句将被标记为不安全。由于此时还不知道 DEFAULT表达式是否会被子语句使用,因此即使子语句为具有非确定性DEFAULT表达式的列提供显式值,此检查也会将语句标记为不安全。(漏洞#28297486)

  • 复制: 当从服务器将主服务器状态和连接信息记录到表 (master_info_repository=TABLE) 时,这是 MySQL 8.0 中的默认设置, mysql.slave_master_info如果服务器处于超级只读模式 (super_read_only=ON). 此时没有错误写入错误日志,但服务器启动后复制失败,因为主日志文件和主日志位置信息已过时。在关闭时更新主信息日志的线程现在像其他复制线程一样被排除在只读检查之外,因此即使服务器处于超级只读模式,它也可以更新表。正在关闭的从站的错误处理也得到了改进,因此任何写入从站状态日志的失败都会导致错误日志中出现错误。(错误#27675107,错误#89987)

  • 复制: 如果复制从服务器尝试使用不正确的用户名、主机或端口连接到主服务器,则指定连接失败原因的原始错误消息将被通用消息覆盖。该问题现在已在SHOW SLAVE STATUS 语句的输出和性能模式表中 replication_connection_status。(缺陷号 26580064)

  • macOS: 对于使用 DMG 包执行的 macOS 安装, launchd操作有问题:

    • 以前,SHUTDOWN如果通过首选项窗格将 MySQL 配置为在引导时启动,则会导致重新启动。这也影响了mysqladmin shutdown命令。以这些方式启动的服务器关闭现在可以正常工作。

    • 以前,RESTART没有工作。它现在可以正常工作。

    • 以前,如果服务器未配置为在引导时启动,则意外的服务器退出不会导致自动重启。无论引导时启动配置如何,具有非零退出状态的退出现在都会导致重新启动。

    (漏洞#29789857)

  • JSON: MAX()MIN()用在返回数据的表达式上,JSON有时会将这些值作为字符串而不是 JSON值进行比较,这会导致意想不到的结果;JSON 当值是数字 时,这一点尤为明显

    这是因为GROUP BY当使用带索引的临时表时没有 JSON正确比较值。(缺陷号 28947381)

  • JSON: 从存储函数执行时 JSON_TABLE()返回错误 未知数据库“” 。

    此问题的根本原因是,当从使用的选择合并表时JSON_TABLE(),MySQL 仅检查派生表。这导致 返回的结果表JSON_TABLE()被标记为常规表,因此在尝试执行查询时,服务器无法打开它。现在 MySQL 检查要添加的表是否不是内部表,即不是派生表、JSON_TABLE()结果表或对递归公用表表达式的引用。(漏洞 #92976,漏洞 #28851656)

  • WITH ADMIN语句选项 GRANT有时处理不当 。(漏洞 #29900772)

  • 一些外键错误消息可能会因用户是否具有GRANT OPTION权限而有所不同。(缺陷号 29868844)

  • 在升级操作期间,如果禁用自动提交,则帮助表的升级会失败。(缺陷 #29865428,缺陷 #95620)

  • 在升级期间以小 table_open_cache尺寸操作时将动态分配的字典对象提取到向量中会导致数据字典表重新打开,从而触发垃圾收集机制,错误地释放收集的对象。随后尝试访问已释放的对象会导致分段错误。(漏洞 #29823053)

  • innodb_*_stats_backup57.ibdMySQL 5.7升级到8.0,升级过程中在删除系统schema中的文件之前 没有关闭mysql,导致后续文件系统操作出错。(漏洞#29791350)

  • 如果文件系统挂载在数据目录挂载点并且存在 lost+found文件或目录, mysqld --initialize将失败。在数据目录初始化期间, lost+found文件或目录现在被忽略。(缺陷号 29780434)

  • MySQL 升级没有将权限分配给具有 AUDIT_ADMIN权限的帐户SUPER。(缺陷号 29770732)

  • REGEXP_REPLACE()函数并未在所有情况下都正确处理空字符串。(漏洞#29763554)

  • 在对存储的程序本地对象进行排序期间,可能会出现过于严格的断言。(缺陷 #29759547,缺陷 #95062)

  • 如果任何组成员处于 RECOVERING 状态,则用于查询组的通信协议版本的 group_replication_get_communication_protocol() 函数将失败,这是一个不必要的限制。现在可以使用该功能,前提是运行该功能的成员处于在线状态,并且与该组的大多数成员保持联系。(缺陷 #29754967,缺陷 #95306)

  • 对于 的某些参数REPEAT(),最大长度计算并不总是正确处理。(缺陷号 29739778)

  • UPDATE具有约束的表的语句 CHECK可能无法强制执行约束。(缺陷 #29706621,缺陷 #95189)

  • 对于从 RPM 或 Debian 软件包安装,如果 mysql_upgrade_info发现数据目录中的文件存在但属于 root,现在将其更改为与数据目录相同的所有者。还设置了正确的 SELinux 文件上下文。(漏洞 #29704041)

  • 从 RPM 包安装可能会导致错误日志中包含不正确的权限。(漏洞 #29702462)

  • 在达到设置之前无法联系大多数组的复制组成员, group_replication_unreachable_majority_timeout 然后用完 group_replication_autorejoin_tries 系统变量指定的自动重新加入尝试次数而没有成功重新加入,有时无法执行指定的操作 group_replication_exit_state_action 系统变量。成员尝试使用当前会话执行操作,但有时会失败。成员现在确保会话在使用它连接到服务器以执行退出状态操作之前已初始化。(缺陷 #29698754,缺陷 #95151)

  • 执行升级时,更新数据字典表的服务器端SQL语句使用了非默认排序规则,导致升级失败。(缺陷 #29697670,缺陷 #95144)

  • 启动服务器 --skip-grant-tables并调用 ROLES_GRAPHML()可能会导致服务器退出。(漏洞#29681975)

  • SELECT DISTINCT当使用固定长度的密钥时,并没有在所有情况下正确地删除重复记录。(缺陷号 29628699)

  • 使用异步 C API 函数的客户端程序可以在发生致命错误(例如连接失败或接收到过大的数据包)后访问释放的内存。(缺陷号 29596244)

  • ST_AsWKB() 函数可能无法执行正确的错误检查。(缺陷号 29594287)

  • 对于失败的数据目录初始化,服务器可以生成一条消息,指示可以删除该目录,即使服务器本身没有创建它。该消息现在指示只能删除服务器创建的目录中的文件。(缺陷 #29594082,缺陷 #94880)

  • 在 MySQL 8.0 中,keyring_encypted_file 插件无法读取由 MySQL 5.7 keyring_encypted_file插件创建的文件。(漏洞#29588345)

  • 在启用了 Undefined Behavior Sanitizer 的构建中,运行时错误发生在my_strtoll10_mb2()和 中val_decimal()。(错误#29585648,错误#29594951)

  • 服务器在启动时检查授权表结构时产生的一些诊断被写为错误而不是警告。(漏洞#29558993)

  • comp_err实用程序可以读取未初始化的数据。(漏洞 #29550442)

  • 启用审核日志加密可能会导致服务器退出。(漏洞 #29549327)

  • 更新了过时的 RPM 包,以便在 EL8 上从 MariaDB 成功升级到 MySQL。(错误#29549127、错误#29623146、错误#29623201、错误#29659212)

  • 在 形式的连接中,MySQL 评估 了 一个空补行中的参数,并拒绝了它。这导致左连接到内连接的无效转换,从而导致结果中缺少行。同样的问题影响了相同形式但具有条件的连接。(错误号 29540230)LEFT JOIN t ON column WHERE t.x=0 IS NOT TRUEIS NOT TRUEFALSENULLIS NOT FALSEWHERE

  • 如果read_only启用了系统变量,则其值不适用于更新字符集和排序规则数据字典表。(缺陷 #29533590,缺陷 #94769)

  • 在解析函数的参数而不是参数的字符集时使用 的 函数STATEMENT_DIGEST() 和。(漏洞#29526571)STATEMENT_DIGEST_TEXT()character_set_client

  • 服务器现在跟踪数据字典升级以确保 INFORMATION_SCHEMA在数据字典表更改时重新创建视图。(漏洞 #29513265)

  • 执行STATEMENT_DIGEST() or可能会对 表STATEMENT_DIGEST_TEXT()中的数据产生意想不到的副作用 。performance_schema.events_statements_summary_by_digest(漏洞 #29512067)

  • 当没有执行查找或写入时,实现CREATE TABLE没有为表提供明确定义的起始游标。(漏洞#29511318)

  • 优化表时const,连接条件中的任何谓词项ON 也应在标记为的表上进行评估, const以确保该行符合ON条件。

    优化器未能将表标记为const 当它被处理为具有不可能的 ON条件时,在这种情况下,来自该表的结果行是NULL扩展行。

    此修复设置const_table表的标志并将该行标记为NULL一行。它还更改EXPLAIN了优化为具有不可能的 ON 条件的表的输出,其中NULL来自该行的结果值现在传播到行列值中,就像其他 const行一样。(错误号 29493830)

  • 包含子查询的查询在不包含IN时可能会返回多余的行 。(漏洞#29493026)optimizer_switchfirstmatch=on

  • RPM 包检测操作系统是 EL6 还是 EL7 在某些系统上失败。(漏洞#29492896)

  • 存储在数据字典中存储引擎私有数据字段中的密钥的 SQL 层验证被禁用,以允许存储引擎根据需要添加新密钥。存储引擎现在负责密钥验证。(缺陷 #29491593,缺陷 #94667)

  • 检查是否为NULL比较行的某些表达式返回了不正确的结果。(漏洞 #29491083)

  • 在优化包含ORDER BY和的表连接时LIMIT,优化器通过考虑整个连接的扇出修改了第一个表的选择限制。扇出是使用filter_effect每个表计算的,可以将其设置为COND_FILTER_STALE (-1) 以指示未知值。优化器实际上并未检查此值,这可能会导致负扇出,从而导致 EXPLAIN查询输出中出现意外的行值 0。

    Now COND_FILTER_STALE ( filter_effectunknown) 是专门检查的,如果找到,扇出也被认为是未知的,因此从第一个表中选择的行数不会被整个连接的扇出修改。(错误#29487181,错误#29531472)

  • LEAST()对和 函数 做了一个隐含的假设, GREATEST()即这些参数中的任何一个的参数都是有符号的或都是无符号的值。(漏洞#29467577)

  • 该函数的一些参数BIT_OR() 并不总是被正确处理。(漏洞#29459549)

  • user_attributes对于调试版本,系统表列的 处理不当 mysql.user可能会导致服务器退出。(漏洞#29451897)

  • 特定于 MySQL 集群的 Debian 调试包的调试符号路径不正确。(漏洞#29446947)

  • 使用 Protobuf 3.7.0 构建时出现编译失败。(缺陷 #29436791,缺陷 #94543)

  • mysql.service在 Debian 和 Ubuntu 上,MySQL 包在从本机 MySQL 包升级后 未启用 。(漏洞#29435592)

  • 发生错误时服务器未正确关闭共享内存连接,这可能会导致意外的服务器行为。(漏洞#29435426)

  • 内部JOIN_CACHE::join_record()方法试图通过在进入时保存状态并在完成时恢复适当的标志, 使其在关于has_row和 标志的相同状态下操作的所有表。null_row

    此处解决的问题是在恢复这些标志后出现的,因为它 restore_last_record()也被调用以恢复任何已处理的记录,这可能会导致null_row恢复刚刚根据保存状态恢复的标志。这是通过 restore_last_record()在保存的状态恢复之前而不是之后调用来解决的,并且确保 reset_null_row()如果保存的状态指示null_row标志未在开始时设置则也被调用。(漏洞#29435133)

  • 使用的某些ALTER TABLE语句 ADD COLUMN未按预期执行。(缺陷号 29428288)

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

  • 从 MySQL 5.7 升级到 MySQL 8.0 遇到非原生分区表时报错。错误消息引用了 -DWITH_PARTITION_STORAGE_ENGINE CMake构建选项,MySQL 8.0 不支持该选项。(缺陷 #29426632,缺陷 #94518)

  • 启动时,服务器未正确检查持久变量中用户名和主机名的长度。(漏洞 #29420141)

  • 解析器可能会泄漏某些多语句查询的内存。(漏洞 #29419820)

  • 从 RPM 包在 EL8 上安装 MySQL 导致与安装的 MeCab 库发生冲突。(漏洞#29413115)

  • 在 FreeBSD 上,为致命信号转储的堆栈跟踪无法正常工作。(漏洞 #29408039)

  • 在系统变量derived_merge的值中禁用开关后optimizer_switch ,从中检索的基表 信息会在列INFORMATION_SCHEMA.TABLES中显示不适当的信息 。TABLE_COMMENT(缺陷 #29406053,缺陷 #94468)

  • 在某些情况下,在子选择中使用ORDER BY不会产生预期的结果。(漏洞 #29402943)

  • ROLLUP带有通配符的查询(可能还有某些其他通配符查询)可能导致断言错误。(缺陷号 29396628)

  • IF具有常量评估 的函数内部的条件TRUE并不总是被正确处理。(缺陷号 29394833)

  • MySQL 8.0.13 中与全文搜索相关的代码更改导致分段错误。(漏洞 #29393105)

  • mysqlpump没有检查参数是否--result-file正确打开,如果发生错误则意外退出。(漏洞#29389828)

  • 在没有连接的查询中,直到初始化完成后才启用批处理模式,因此OFFSET 行是在批处理模式之外读取的。这否定了从批处理模式中获得的任何性能优势。(漏洞#29373972)

  • 重命名功能索引时,服务器未检查可能的重复索引名称。(缺陷号 29360763)

  • 系统变量服务没有检查某些操作的输入缓冲区大小。(漏洞 #29343505)

  • 对于mysql系统模式转储, mysqlpump按行转储某些表而不是作为帐户管理语句。(漏洞 #29343073)

  • 在子查询上创建功能索引UNION 导致调试版本中的断言。(漏洞 #29342245)

  • 的非数字参数AVG() 并不总是被正确处理。(漏洞#29321764)

  • 具有大量列的结果集可能会导致客户端程序使用所有可用内存。现在,客户端库 max_allowed_packet为结果集元数据分配的字节数不多,如果超过此限制,则返回内存不足错误。如果发生此错误,这是致命的,客户端应断开连接。(漏洞#29316814)

  • mysql_shutdown()当服务器和客户端来自不同的 MySQL 系列时,由于返回数据包负载错误解释, 调用可能会导致客户端退出。(漏洞 #29315393)

  • 如果使用 MySQL 4.1 之前的协议与服务器通信,客户端程序在读取结果集元数据时可能会失败。(漏洞 #29304864)

  • HANDLER语句并不总是能正确处理具有生成列的表。(漏洞 #29300049)

  • 客户端/服务器协议中的会话跟踪信息可能处理不当。(缺陷号 29297652)

  • 使用 C 客户端库的客户端程序libmysqlclient 可能会在收到 OK包含格式错误的会话跟踪信息的数据包时退出。(错误#29297620,错误#29630735)

  • 启用 SQL 模式后 PAD_CHAR_TO_FULL_LENGTH,密码更改失败,没有警告或错误报告。(漏洞#29287785)

  • 插件可加载函数的初始化代码 keyring_aws未正确检查插件是否已初始化。(漏洞 #29278153)

  • 与聚合或窗口函数相比,标量子查询并不总是被正确识别和处理。(缺陷号 29276063)

  • Ubuntu 软件包没有为初始化脚本禁用二进制日志记录。(漏洞 #29263771)

  • 使用无效的归类名称可能会损坏内部归类映射。(漏洞#29258979)

  • 单表UPDATEDELETE使用索引表达式的语句在作为准备好的语句执行时可能会导致服务器退出。(漏洞#29257254)

  • audit_log插件没有记录 UNINSTALL PLUGIN audit_log语句。(缺陷号 29248047)

  • MySQL 现在open(O_TMPFILE)在创建立即取消链接的临时文件时使用任何适用的时间。这比以前更有效,并且避免了出现竞争条件的可能性很小。感谢 Daniel Black 的贡献。(漏洞 #29215177,漏洞 #93937)

  • audit_log过滤操作可能会泄漏内存。(漏洞 #29201747)

  • 在某些情况下,GRANT OPTION特权可能会被错误处理。(缺陷号 29179334)

  • 以前,如果将或 SQL 通配符用作字符 ,LIKE则比较可能不正确。现在可以使用这些字符。(缺陷 #29175461,缺陷 #93811)_%ESCAPE

  • component_sys_variable服务可能无法读取某些系统变量,从而导致服务器退出。(漏洞#29162657)

  • 在确定更新哪一行时,多表UPDATE语句可能会搜索不正确的生成列值。(漏洞#29154379)

  • 如果服务器是使用导致内存不足情况的性能模式参数启动的,则启动失败。(缺陷 #29140212,缺陷 #93726)

  • 为了与标准 SQL 保持一致和合规性,该 ISNULL()函数现在打印为语句IS NULL生成的警告 。EXPLAIN(漏洞 #29119455)

  • 某些补充 Unicode 字符可能会被错误地标记为无效警告消息。(缺陷 #29110613,缺陷 #93626)

  • 对于从 MySQL 5.7 到 8.0 的升级,root 用户没有获得所有动态权限。(漏洞 #29043233)

  • 使用子分区时,表序列化字典信息 (SDI) 未存储在任何表空间文件中。(缺陷 #29020745,缺陷 #93499)

  • 删除某些 Performance Schema 表的权限检查不正确。(漏洞 #29010031)

  • mysqldump无法在特定于版本的注释中包装SET NAMES utf8mb4andSET character_set_client = utf8mb4语句,这可能会导致兼容性问题。(缺陷 #29007506,缺陷 #93450)

  • 对于在定义为 的一个或多个列上创建的唯一索引 NULL,优化器无法处理使用该索引作为的连接eq_ref

    作为此修复的一部分,NULL现在还执行后期过滤以避免将 与 的比较 NULL视为潜在的相等匹配。(错误#28965762,错误#29337233)

  • 对于调试版本,可以通过预期和实际排序规则不同的字符串比较来引发断言。(缺陷号 28960901)

  • 服务器未正确处理一个子查询,该子查询在转换为半连接之前包含一个合并的派生表或公用表表达式,而这些表达式又具有一个 WHERE带有针对索引列的外部引用的子句。(漏洞#28955216)

  • 使用包含 的派生表的查询 ORDER BY并不总是被正确处理。(漏洞 #28942965)

  • 当客户端因不活动超过该 wait_timeout值而终止时,写入错误日志的消息不清楚。现在 ER_NET_WAIT_ERROR写了,更具体地说明了问题的原因。感谢 Mattias Jonsson 的贡献。(缺陷 #28940167,缺陷 #93240)

  • FLUSH PRIVILEGESCREATE USERor 并发执行ALTER USER 可能会导致服务器停止。(缺陷 #28937018,缺陷 #93085)

  • CASE依赖于索引前缀值的语句比较可能会产生不正确的结果。(缺陷 #28934315,缺陷 #93215)

  • 在排序消除后调整查询成本以补偿原始成本估算中未考虑的排序时,估算有时可能太低,甚至为负。

    排序成本加到总成本中 ,如果发现不需要排序, Optimize_table_order::consider_plan()则从总成本中减去 。JOIN::optimize()

    如果consider_plan()发现不需要排序,则不将排序成本加到总成本中,但仍然在 中记录一个排序成本 JOIN::sort_cost(),并将其设置为之前考虑的候选方案的排序成本。后来, JOIN::optimize()看到该 JOIN对象有关联的排序成本,并从总成本中减去该成本,因为它也看到不需要排序。由于排序成本来自与所选计划不同的候选计划,因此估计不正确。

    修复方法是如果没有将排序成本添加到总成本中,则将consider_plan()设置 为 0,这样就不会执行成本的错误调整。(漏洞#28884359)JOIN::sort_costJOIN::optimize()

  • 某些 GIS 代码无法在 Visual Studio 2017 15.5.6 下编译。(漏洞#28861188)

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

  • ALTER TABLE使用withRENAME COLUMN或 交换这些生成列所依赖的列后,存储的生成列值和虚拟生成列上的索引未正确更新 CHANGE COLUMN

    现在禁止重命名生成列的基列、生成的默认值和功能索引,除非同一ALTER TABLE语句满足以下条件之一:

    • 该语句删除生成的列、生成的默认值或功能索引。

    • 该语句更新相关的相关表达式。这支持支持更新生成表达式以遵循基列重命名的现有方案。

    以类似的方式放宽了对删除生成的列、生成的默认值或功能索引所依赖的列的限制。(缺陷 #28772251,缺陷 #92727)

  • 基列未被生成列排除在仅索引访问之外。(漏洞#28652733)

    参考资料:另请参阅:Bug #29664369。此问题是 Bug #23169112 的回归。

  • SET PERSIST_ONLY没有正确处理 version_tokens_session系统变量。(漏洞 #28542569)

  • 对于调试版本,对语句进行不正确的错误检查 CREATE TABLE可能会导致引发断言。(漏洞 #28490361,漏洞 #91976)

  • MySQL 5.7 支持InnoDB 表上的外键,其父键的部分引用列被隐藏,但 MySQL 8.0 不支持。MySQL 8.0 现在支持此功能。(漏洞 #28480149,漏洞 #91952)

  • INSERT ... ON DUPLICATE KEY UPDATE没有考虑活动角色授予的特权。(缺陷号 28395115)

  • --loose-对于卸载的组件,如果稍后在运行时加载组件,则不会处理 在启动时使用前缀指定的组件选项。(漏洞#28341329)

  • 客户端程序以交互方式请求的长密码可能无法以空值终止。(漏洞#28121400)

  • 在构建 MySQL 时,CMakeBoost通过在目标目录中创建一个零长度的 tarball 开始下载过程,下载完成后将其删除。如果下载中断或超时,此文件的存在会阻止CMake在运行时尝试执行下载。现在,零长度的 tarball(如果存在)会在开始下载之前被删除。(漏洞 #28089173)

  • 当线程进程滴答时间超过最大允许值时,线程池组可能会被阻塞。滴答时间现在使用更大的数据类型来允许更大的值。(缺陷号 28072609)

  • 未正确检查权限 ALTER USER ... IDENTIFIED WITH ... BY。(错误#27923149,错误#29882299)

  • MySQL 不支持 OpenSSL 会话票证,但没有设置SSL_OP_NO_TICKET标志来通知 OpenSSL。现在已经设置了标志。(漏洞#27655493)

  • audit_null插件未正确检查空事件记录。(漏洞 #27638290)

  • UpdateXML()在某些情况下并不总是正确释放内存。(漏洞#27312862)

  • name系统表列中的 空值mysql.plugin导致服务器在启动期间退出。(漏洞#27302459)

  • 服务器未正确检查 CACHE INDEX语句的权限。(缺陷号 26173827)

  • 启用插件后thread_pool,Performance Schemastatus_by_thread 表不包含任何数据。(缺陷号 25933891)

  • GRANT OPTION特权被视为与数据库操作相关。(错误#25203933,错误#34159579)

  • REPAIR TABLEfor ARCHIVEtables 可能导致服务器退出。(漏洞 #23304911)

  • 如果INSTALL PLUGIN语句在共享库名称中包含无效的 UTF-8 字符,则会导致服务器挂起(或在调试版本中引发断言)。(错误#14653594,错误#23080148,错误#27167197)

  • 当表列的值太大时,记录到mysql.slow_log系统表可能会失败。现在日志记录是在尽力而为的基础上进行的,写下可以提供的信息。否则,该行将被丢弃并将一条消息写入错误日志。(错误#11748692,错误#37132)

  • 在 Windows 平台上 使用的查询失败,错误为 1525不正确的 DATE 值。(缺陷 #95780,缺陷 #29904751)WHERE date_column LIKE 'year_value'

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

  • 对先前问题的修复导致 YEAR值被视为无符号,但这不允许在涉及减法的计算过程中可能出现负值,这可能导致数据截断错误。(缺陷 #95045,缺陷 #29668676)

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

  • 使用具有零输入行的聚合的派生表时,聚合函数的结果未正确复制到临时表中。这会在多次评估派生表的情况下导致不正确的结果,例如在执行横向连接时。(缺陷 #94721,缺陷 #29514504)

  • 没有框架规范的窗口继承自具有 的窗口ORDER BY产生了不正确的结果。(缺陷 #94251,缺陷 #29328529)

  • 函数返回的结果 REGEXP_REPLACE()REGEXP_SUBSTR()使用 UTF-16而不是表达式的字符集和排序规则搜索匹配项。(缺陷 #94203,缺陷 #29308212)

  • 与使用instead的相同查询相比,使用 UNION ALLwith 的查询处理速度非常慢。(缺陷 #93922,缺陷 #29227464)SUM(constant)SUM(column)

  • JSON_OBJECTAGG()在存在重复键的情况下是不确定的,除非窗口对键进行了排序,这是预期的行为,但是不再出现在窗口框架中的键值对仍然出现在结果中。(缺陷 #93822,缺陷 #29175262)

  • LIMIT之前 HAVING在带有子选择的查询中应用过。(错误#93214,错误#28934388)

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

  • 涉及列的查询GROUP BY导致 TIMESTAMP键 ( ER_DUP_ENTRY) 错误的重复条目。当使用给定的时区设置将值插入到表中并且这些值稍后在时区设置更改后获取时会出现此问题TIMESTAMP,这样至少有一些插入的 TIMESTAMP值发生在时间更改的那个小时内从标准时间到新时区的夏令时 (DST),在此期间相同的 TIMESTAMP值可以存在两次。现在,当服务器返回错误DUPLICATE ENTRY FOR KEY ' group_key'时,如果分组涉及TIMESTAMP列,它反而会引发错误Grouping on temporal is non-deterministic for time zones having DST。请考虑为此查询切换到 UTC。

    此外,建议设置 explicit_defaults_for_timestampON以及 MODE_NO_ZERO_IN_DATEMODE_NO_ZERO_DATEMODE_INVALID_DATES作为服务器 SQL 模式的一部分,以帮助避免此问题。(缺陷 #90398,缺陷 #27970159)