Documentation Home
MySQL 8.0 发行说明  /  MySQL 8.0.16 的变化(2019-04-25,正式发布)

MySQL 8.0.16 的变化(2019-04-25,正式发布)

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

账户管理注意事项

  • 以前,拥有DROP ROLE权限的用户可以使用该DROP ROLE语句删除锁定或解锁的帐户。现在,拥有DROP ROLE 权限的用户DROP ROLE只能删除锁定的帐户(未锁定的帐户大概是用于登录服务器的用户帐户,而不仅仅是作为角色)。拥有CREATE USER权限的用户可以使用DROP ROLE删除锁定或解锁的帐户。(缺陷 #28953158,缺陷 #93263)

  • 对 MySQL 帐户管理功能进行了多项更改:

    • MySQL 现在加入了用户帐户类别的概念,系统用户和普通用户根据他们是否具有新 SYSTEM_USER权限来区分:

      • 系统用户是拥有 SYSTEM_USER权限的用户。系统用户可以对系统帐户和普通帐户执行操作。

      • 普通用户是不具备 SYSTEM_USER权限的普通用户。普通用户可以对普通账户进行操作,但不能对系统账户进行操作。

      如果用户具有对常规帐户执行给定操作的适当权限,则 SYSTEM_USER使该用户也可以对系统帐户执行该操作。 SYSTEM_USER并不意味着任何其他特权,因此执行给定帐户操作的能力仍然取决于拥有任何其他所需的特权。例如,如果一个用户可以授予SELECTUPDATE权限给普通帐户,那么 SYSTEM_USER该用户也可以授予SELECTUPDATE给系统帐户。

      SYSTEM_USER系统帐户和常规帐户之间的区别可以通过保护具有特权的帐户免受不具有特权的帐户的影响, 从而更好地控制某些帐户管理问题 。例如,该 CREATE USER权限不仅可以创建新帐户,还可以修改和删除现有帐户。在没有系统用户概念的情况下,拥有CREATE USER权限的用户可以修改或删除任何现有帐户,包括该root帐户。系统用户的概念可以限制对root帐户(本身是一个系统帐户),因此它们只能由系统用户创建。具有特权的普通用户CREATE USER 仍然可以修改或删除现有帐户,但仅限于普通帐户。

      SYSTEM_USER该特权 的其他操作影响 :

      • 除了任何其他所需的权限之外 ,具有权限的会话 SYSTEM_USER只能由具有权限的用户 终止。SYSTEM_USER

      • 除了任何其他所需的权限之外 ,具有权限的帐户 只能由具有权限的用户SYSTEM_USER指定为DEFINER存储对象 。SYSTEM_USER

      • 具有 SYSTEM_USER特权的角色不能列在 mandatory_roles系统变量的值中。

      有关详细信息,请参阅 帐户类别

    • 以前,不可能授予全局应用的特权,但某些模式除外。partial_revokes如果启用了新的系统变量,这现在是可能的 。例如,以下语句使帐户能够从mysql系统架构中的表之外的任何表中进行选择或插入:

      SET PERSIST partial_revokes = ON;
      GRANT SELECT, INSERT ON *.* TO u1;
      REVOKE SELECT, INSERT ON mysql.* FROM u1;

      服务器通过向系统表 的列 添加Restrictions属性来 记录部分撤销 。在其输出中包含 语句以指示部分撤销。 User_attributesmysql.userSHOW GRANTSREVOKE

      笔记

      启用partial_revokes 会导致 MySQL 将模式名称中的未转义字符_%SQL 通配符视为文字字符,就好像它们已被转义为\_and 一样\%partial_revokes因为这改变了权限分配的解释,所以建议在可能启用 的 MySQL 安装的模式权限分配中避免使用未转义的通配符 。

      有关详细信息,请参阅使用部分撤销的权限限制

    • GRANT语句有一个新 子句,用于指定有关用于语句执行的特权上下文的附加信息。这种语法在 SQL 级别是可见的,尽管它的主要目的是通过使这些限制出现在二进制日志中来在所有节点上实现由部分撤销施加的授予者权限限制的统一复制。 AS user [WITH ROLE]

      有关详细信息,请参阅GRANT 语句

C API 说明

字符集支持

  • utf8mb4_zh_0900_as_csMySQL 现在支持 utf8mb4Unicode 字符集 的新中文归类 。utf8mb4_zh_0900_as_cs是 MySQL 中第一个可用于 Unicode 的中文特定排序规则。此排序规则区分重音和区分大小写。它的特征类似于 utf8mb4_0900_as_cs除了特定于语言的规则在适用的情况下优先。有关详细信息,请参阅Unicode 字符集

编译笔记

  • 如果可用且未明确禁用, CMake现在会导致构建过程与 Clang 的llvm lld链接器链接。要禁用此链接器,请指定该 -DUSE_LD_LLD=OFF选项。(漏洞#29264211)

  • 基于 EL6 和 EL7 的构建现在尝试在 devtoolset-8而不是 devtoolset-7. (漏洞#29198846)

  • 用于服务器构建的 Boost 库的最低版本现在是 1.69.0。(漏洞#29114233)

  • Visual Studio 2017 的配置时检查不够具体。MySQL 编译检查现在至少需要 Visual Studio 更新 15.8,即版本号 1915。(缺陷 #28970895)

  • MySQL 现在可以使用 C++14 编译。以下最低版本要求适用于编译器支持:

    • 海湾合作委员会 5.3 (Linux)

    • 叮当声 4.0 (FreeBSD)

    • XCode 9(苹果操作系统)

    • 开发人员工作室 12.6 (Solaris)

    • 视觉工作室 2017 (视窗)

配置注意事项

  • MySQL 配置现在要求最低 CMake版本为 3.4.3。这需要在某些 Red Hat 和 Oracle Linux 平台上使用cmake3而不是 cmake 。(漏洞#29246216)

  • 删除 了CMake选项。(缺陷 #29153932,缺陷 #93755)WITH_LZMA

  • EXCLUDE_FROM_ALL选项现在在 CMake适当的配置中使用,以便仅在任何可执行文件实际使用时才构建库。(漏洞 #29052599)

  • 新的CMake选项指示是否与 . 如果启用,内置 、、 和 例程将被禁用。默认值为。(缺陷号 29027974)WITH_JEMALLOC -ljemallocmalloc()calloc()realloc()free()OFF

  • 新的CMake选项指示是否在没有 AddressSanitizer 的情况下运行 LeakSanitizer。默认值为 。(缺陷号 28936574)WITH_LSAN OFF

  • 新的CMake选项指示是否构建 MySQL Router。默认值为。(漏洞#28759234)WITH_ROUTER ON

  • MySQL 服务器现在支持一个 --validate-config选项,可以在不以正常操作模式运行服务器的情况下检查启动配置是否存在问题。有关详细信息,请参阅 服务器配置验证

弃用和移除说明

  • TempTable存储引擎现在总是 用来管理磁盘上 的InnoDB内部临时表,并且用于此任务的存储引擎的选择不再是用户可配置的。系统 internal_tmp_disk_storage_engine 变量已被删除。(漏洞 #91377,漏洞 #28234637)

    参考资料:另请参阅:Bug #28081038、Bug #82556、Bug #27408352。

安装注意事项

  • 以前,安装新版本的MySQL后,MySQL服务器会在下次启动时自动升级数据字典表,之后需要DBA手动调用 mysql_upgrade来升级mysqlschema中的系统表,以及其他中的对象模式,例如sys 模式和用户模式。

    服务器现在执行以前由 mysql_upgrade处理的任务。安装新的 MySQL 版本后,服务器现在会在下次启动时自动执行所有必要的升级任务,而不依赖于 DBA 调用mysql_upgrade。此外,服务器更新帮助表的内容(mysql_upgrade没有做的事情)。一个新的 --upgrade服务器选项可以控制服务器如何执行自动数据字典和服务器升级操作。有关详细信息,请参阅 升级 MySQL

    对升级过程的这种更改导致一些弃用:

    • mysql_upgrade已弃用,因为不再需要它。

    • --no-dd-upgrade服务器选项已弃用,因为该 选项--upgrade取代了它。

    mysql_upgrade和该 --no-dd-upgrade选项将在未来的 MySQL 版本中删除。(错误#28146052、错误#28162609、错误#91205、错误#29185739、错误#27740692、错误#28547424、错误#91961)

包装说明

  • MySQL Cluster 8.0 的 Docker 镜像现已 可供下载。(漏洞 #30010921,漏洞 #96084)

  • 包含curl而不是链接到系统curl库的二进制包现在使用 curl7.64.0。(漏洞#29357198)

  • MySQL 8.0 不再使用Henry Spencer 正则表达式库 ( extra/regex),并且不再出现在源代码分发中。(漏洞 #29192306)

  • RPM 包现在依赖于 libtirpc并且rpcgen 因为较新版本的glibc不包括 Sun RPC。(漏洞#28995257)

  • support-files/magic文件已从 MySQL 源代码树中删除。大多数 MySQL 文件格式都包含在操作系统文件类型功能中。(错误#18335080,错误#71898)

  • MySQL 现在为 MySQL 服务器和测试套件提供最小安装” Linux 通用二进制下载包。最小安装包排除了调试二进制文件并去除了调试符号,使它们比常规的 Linux 通用二进制包小得多。可从https://mysql.net.cn/downloads/下载。

  • MySQL 企业版的 Docker 镜像现在可以从 My Oracle Support下载。

解析器注释

  • 解析器不再接受 用于指定表别名的未记录和非标准语法。(漏洞 #29205289)= alias_name

  • 解析器 现在允许 将几个额外的 非 保留 关键字 用作 存储程序 中的 标签 , 这些 关键字以前被 限制 使用 :ACCOUNT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, _ , . (缺陷号 29033659)ALWAYSBACKUPCLOSEFORMATGROUP_REPLICATIONHOSTINVISIBLEOPENOPTIONSOWNERPARSERPORTREMOVERESTOREROLESECONDARYSECONDARY_ENGINESECONDARY_LOADSECONDARY_UNLOADSECURITYSERVERSOCKETSONAMEUPGRADEVISIBLEWRAPPER

  • 解析器接受外连接 ( ) 的 ODBC 转义语法,但也接受 . 解析器现在只接受 . { OJ outer_join }OJOJ

    笔记

    OJnow 是一个非保留关键字。

    (漏洞 #22320942)

性能模式注释

  • 新的 Performance Schema keyring_keys表公开了 MySQL 密钥环中密钥的元数据。密钥元数据包括密钥 ID、密钥所有者和后端密钥 ID。该 keyring_keys表不会公开任何敏感的密钥环数据,例如密钥内容。请参阅 keyring_keys 表

插件说明

  • MySQL 现在包含一个ddl_rewriter插件,可以CREATE TABLE在服务器解析和执行之前修改服务器接收到的语句。该插件删除了ENCRYPTIONDATA DIRECTORYINDEX DIRECTORY 子句,这在从 SQL 转储文件恢复表时可能会有所帮助,这些文件是从加密的数据库中创建的,或者它们的表存储在数据目录之外。例如,该插件可以将此类转储文件恢复到未加密的实例中,或者恢复到数据目录之外的路径不可访问的环境中。安装后, ddl_rewriter公开 Performance Schema memory/rewriter/ddl_rewriter工具以跟踪插件内存使用情况。有关详细信息,请参阅 ddl_rewriter 插件

安全说明

  • 以前,如果授权表损坏,MySQL 服务器会向错误日志写入一条消息,但会像 --skip-grant-tables已指定该选项一样继续。这导致服务器在意外状态下运行,除非 --skip-grant-tables实际上已指定。现在,服务器在将消息写入错误日志后停止,除非以 --skip-grant-tables. (使用该选项启动服务器使您能够连接以执行诊断操作。)(缺陷 #29394501,缺陷 #94394)

  • 在某些平台(Windows、macOS 和 Generic Linux)上与 MySQL 捆绑的 OpenSSL 库已升级到版本 1.0.2r。在所有其他平台上,MySQL 使用系统安装的 OpenSSL。http://www.openssl.org/news/vulnerabilities.html中描述了新 OpenSSL 版本中修复的问题 。(漏洞 #28988091)

  • 不再支持向匿名用户授予角色,因为此类角色会导致问题行为。(漏洞 #28910120)

  • OpenSSL 1.1.1 支持用于加密连接的 TLS v1.3 协议,如果服务器和客户端都使用 OpenSSL 1.1.1 或更高版本编译,MySQL 现在也支持 TLS v1.3:

    • 默认情况下启用某些 TLSv1.3 密码套件。系统变量可以明确指定服务器允许的 tls_ciphersuitesTLSv1.3 密码套件。

    • --tls-ciphersuites 客户端选项指定客户端允许哪些 TLSv1.3 密码套件 。此选项适用于这些程序: mysqlmysqladminmysqlbinlogmysqlcheckmysqldumpmysqlimportmysqlpumpmysqlshowmysqlslapmysqltestmysql_secure_installationmysql_upgrade

    • mysql_options()C API 函数有一个新 选项 ,MYSQL_OPT_TLS_CIPHERSUITES可以从客户端库中指定客户端程序允许哪些 TLSv1.3 密码套件。

    有关详细信息,请参阅 加密连接 TLS 协议和密码

    笔记

    目前,Group Replication 不支持 TLSv1.3。

  • 服务器用于新连接的 TLS 上下文现在可以在运行时重新配置。此功能可能很有用,例如,可以避免重新启动运行时间过长以致其 SSL 证书已过期的 MySQL 服务器。动态 SSL 可重配置性基于以下更改:

    有关详细信息,请参阅 服务器端运行时配置和监视加密连接

    感谢 Facebook 提交了类似功能的代码(虽然没有使用代码)。

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

  • 在 MySQL 8.0 中,默认的身份验证插件从 mysql_native_password. 到 caching_sha2_password。因为 提供了 身份验证插件caching_sha2_password功能的超集,现在已弃用并将在未来的 MySQL 版本中删除。使用身份验证的 MySQL 帐户 应迁移为使用 。 sha256_passwordsha256_passwordsha256_passwordcaching_sha2_password

空间数据支持

SQL 语法说明

  • 不兼容的更改: 在 MySQL 5.7 中,在 子句表 FOREIGN KEY 定义没有 的情况下指定关键字会导致 使用生成的约束名称。这种行为在 MySQL 8.0 中发生了变化, 使用值而不是生成的名称。因为每个模式(数据库)的约束名称必须是唯一的,所以更改导致错误是由于每个模式的外键索引名称不是唯一的。为避免此类错误,新的约束命名行为已恢复,并再次使用生成的约束名称。 InnoDBCONSTRAINT symbolCONSTRAINTsymbolInnoDBInnoDBFOREIGN KEY index_nameInnoDB

    为了与 保持一致,如果未指定子句或指定的关键字不带InnoDB,则 NDB存储引擎现在使用生成的约束名称。在 基于 MySQL 5.7 和更早的 MySQL 8.0 版本的版本中,使用该 值。 CONSTRAINT symbolCONSTRAINTsymbolNDBNDBFOREIGN KEY index_name

    上述更改可能会导致依赖于以前的外键约束命名行为的应用程序不兼容。(漏洞#29173134)

  • 以前,MySQL 允许有限形式的 CHECK约束语法,但会解析并忽略它。CHECKMySQL 现在为所有存储引擎实现了表和列约束的核心特性。约束是使用 CREATE TABLEALTER TABLE语句定义的。新 INFORMATION_SCHEMA.CHECK_CONSTRAINTS 表提供有关CHECK 在表上定义的约束的信息。有关详细信息,请参阅 CHECK 约束。(错误#11744849、错误#3464、错误#3465、错误#11746042、错误#22759)

sys架构注释

  • MySQL 现在包括格式化或检索性能模式数据的内置 SQL 函数,并且可以用作现有sys模式存储函数的等价物:

    内置函数可以在任何模式中调用并且不需要限定符,这与需要模式限定符或当前模式 的sys函数不同。sys.sys

    内置函数取代了相应的 sys函数,这些函数现在已被弃用,并将在未来的 MySQL 版本中删除。使用函数的应用程序sys应该调整为使用内置函数,记住sys函数和内置函数之间的一些细微差别。请参阅 性能模式函数

测试套件说明

  • mysql-test-run.pl现在支持 ,多个同步 mysql-test-run.pl实例MTR_UNIQUE_IDS_DIR将其用作所有chroot环境的公共位置。这使这些实例能够在保留端口号时避免冲突。感谢 Facebook 的贡献。(缺陷 #29221085,缺陷 #93950)

  • my_safe_process程序已重命名为 mysqltest_safe_process,现在与其他二进制文件(如mysqltest )一起安装,而不是与测试套件文件一起安装。(漏洞#29198969)

  • 对测试的这些更改all_persisted_variables 已实施:

    • 它通过将硬编码值放入局部变量来限制测试输出中硬编码值的数量。然后在添加新系统变量的基础上 rebase 的新补丁不需要更改原始测试用例的那么多行,从而使 rebase 过程更容易。

    • 它删除已修复错误的条目,并修改查询以包括由于未解决的错误而未测试的系统变量。

    感谢 Facebook 团队的贡献。(缺陷 #29013375,缺陷 #93478)

X 插件说明

  • X 插件先前StmtExecuteOk 在查询清理结束且会话已停用后向客户端返回一条消息。一旦结果已知且在查询清理之前,该消息现在会立即返回,这显着提高了性能。(漏洞#28997370)

  • 当用户连接不可用时, X 插件会记录系统消息“ X 插件准备好连接”,因为 I/O 接口准备失败。(缺陷号 28906360)

  • 默认情况下,X 插件代码中的某些项目未针对性能模式进行检测。(漏洞#28898155)

  • X 协议现在支持 COM_RESET_CONNECTION实用程序命令来重置会话状态,而无需重新验证或关闭连接。(漏洞#28732455)

  • 当使用 Clang 8 编译器构建 MySQL 服务器源代码时,X 插件产生了编译警告。(漏洞#28732158)

添加或更改的功能

  • InnoDB: 当TempTable存储引擎占用的内存量超过 temptable_max_ram变量定义的限制时,TempTable存储引擎会为内部的in-memory临时表分配空间作为内存映射临时文件。此行为现​​在由 temptable_use_mmap变量控制,可以禁用该变量以使 TempTable 存储引擎 InnoDB改为使用磁盘内部临时表。有关详细信息,请参阅 MySQL 中的内部临时表使用。(缺陷号 28944457)

  • InnoDB: undo添加了purge子系统计数器,用于监视与撤消日志截断相关的后台活动。计数器名称和描述,请查询该 INFORMATION_SCHEMA.INNODB_METRICS 表。

    SELECT NAME, SUBSYSTEM, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%truncate%';

    有关启用计数器和查询计数器数据的信息,请参阅 InnoDB INFORMATION_SCHEMA 指标表。(漏洞 #28813526)

  • InnoDB:innodb_spin_wait_pause_multiplier 变量可以更好地控制线程等待获取互斥锁或读写锁时发生的自旋锁轮询延迟的持续时间。现在可以更精细地调整延迟,以解决不同处理器架构上 PAUSE 指令持续时间的差异。有关详细信息,请参阅 配置自旋锁轮询

  • InnoDB: 添加了一个内部服务接口以支持跟踪修改页面。

  • InnoDB:静态 数据InnoDB加密功能现在支持mysql系统表空间的加密。系统mysql表空间包含mysql系统数据库和 MySQL 数据字典表。

  • 以前在运行时评估的一些InnoDB内存分配函数现在在编译时评估,从而提高了性能。(缺陷 #29370811,缺陷 #94380)

  • 子查询的 semijoin 优化IN也已扩展到与EXISTS 子查询一起使用;这些现在可以使用与IN子查询相同的半连接策略来处理,包括首次匹配、物化、重复剔除和松散索引扫描。

    此外,优化器在WHERE附加到子查询的条件中取消相关的平凡相关的相等谓词,以便它们可以与IN子查询中的表达式类似地处理。现在也为IN 子查询和子查询执行去相关EXISTS

    适用于转换为半连接操作的子查询的所有提示和优化器开关 IN也适用于转换后的 EXISTS子查询。对此类子查询优化的所有限制IN也适用于转换后的EXISTS子查询,因此,例如,聚合EXISTS子查询无法转换。

    有关详细信息,请参阅使用半连接转换优化 IN 和 EXISTS 子查询谓词。(漏洞 #28805105,漏洞 #28857990)

  • 为了与 SQL 标准和其他 RDBMS 保持一致,现在单表和多表 DELETE语句都支持表别名。(漏洞 #27455809)

  • Group Replication 的群组通信引擎(XCom,一种 Paxos 变体)包括一个缓存消息(及其元数据),这些消息作为共识协议的一部分在群组成员之间交换。在其他功能中,消息缓存用于在一段时间后无法与其他组成员通信后返回组的成员进行恢复。

    以前,消息缓存的大小限制固定为 1GB 内存,并且缓存中的最大消息数也是固定的。但是,现在可以将 group_replication_member_expel_timeout 系统变量(在 MySQL 8.0.13 中引入)设置为允许成员最多一小时返回组而不是被驱逐,对缓存大小的固定 1GB 限制可能会导致这样的情况节点无法恢复它们在重新建立通信时丢失的消息。

    因此,从 MySQL 8.0.16 开始,XCom 的消息缓存对它可以包含的消息数量没有固定的限制,只受限于它可以使用的内存量的限制。可以使用新的设置缓存大小限制 group_replication_message_cache_size 系统变量,其默认和最小设置为 1GB,与以前的 MySQL 服务器版本中使用的一样。如果达到缓存大小限制,XCom 将删除已决定和交付的最旧条目。缓存大小限制可以在运行时动态增加或减少。如果您降低缓存大小限制,XCom 将删除已确定和交付的最旧条目,直到当前大小低于限制。当当前无法访问的成员可能需要恢复的消息从消息缓存中删除时,组复制的组通信系统 (GCS) 会通过警告消息提醒您。(漏洞#26482507)

  • 在 Group Replication 组成员之间发送的大消息现在可以在超过用户定义的阈值大小时拆分为多条消息。发送异常大的消息可能会导致某些组成员被报告为失败并被驱逐出组。这是因为群组通信引擎(XCom,Paxos 的变体)使用的单线程被占用处理消息的时间太长,因此一些群组成员可能会报告接收方失败。

    新系统变量 group_replication_communication_max_message_size 可用于指定组复制通信的最大消息大小。大于此大小的消息会自动拆分为单独发送的片段,并由收件人重新组合。当消息的所有片段都已被所有组成员接收并重新组装时,片段消息的消息传递被认为是完整的。默认情况下应用碎片,可以通过为系统变量指定零值来关闭碎片。

    因为老版本的MySQL Server不支持消息分片,为了保证向后兼容,Group Replication现在有了组通信协议的概念。通信协议版本设置为适应您希望组支持的最旧的 MySQL 服务器版本。ONLINE如果组的通信协议版本小于或等于 X ,版本 X 的 MySQL 服务器只能加入并达到复制组中的状态。

    您可以使用新的检查组使用的通信协议 group_replication_get_communication_protocol() 函数,它返回该组支持的最旧的 MySQL 服务器版本。MySQL 5.7.14 版本允许消息压缩,MySQL 8.0.16 版本也允许消息分片。当新成员加入复制组时,它会检查该组现有成员宣布的通信协议版本。如果加入的成员支持该版本,则它加入该组并使用该组已公布的通信协议,即使该成员支持额外的通信能力。如果加入的成员不支持通信协议版本,则将其开除出群。

    如果您需要更改组的通信协议版本以便早期版本的成员可以加入,请使用新 group_replication_set_communication_protocol() 功能指定您要允许的最旧成员的 MySQL 服务器版本。如果可能,这会使该组回退到兼容的通信协议版本。如果将复制组的所有成员升级到新的 MySQL 服务器版本,则该组的通信协议版本不会自动升级以匹配。如果您不再需要支持早期版本的成员,请使用 group_replication_set_communication_protocol() 函数将通信协议版本设置为您将成员升级到的新 MySQL Server 版本。(错误#26438884、错误#23240361、错误#28474580、错误#91830、错误#28642504、错误#26941977、错误#29240931)

  • 对于组复制,新的系统变量 group_replication_autorejoin_tries 允许您指定成员尝试自动重新加入组的次数,如果它被开除,或者如果它在 group_replication_unreachable_majority_timeout 达到设置之前无法联系组中的大多数人。默认设置 0 表示成员不会尝试重新加入,而是继续执行 group_replication_exit_state_action 系统变量指定的操作。

    如果您可以容忍过时读取的可能性并希望最大限度地减少手动干预的需要,尤其是在瞬态网络问题经常导致成员被驱逐的情况下,请激活自动重新加入。如果您指定尝试次数,当达到成员的驱逐或无法到达的多数超时时,它会尝试重新加入(使用当前插件选项值),然后继续进行进一步的自动重新加入尝试,直到指定的尝试次数. 自动重新加入尝试失败后,成员将等待 5 分钟才能进行下一次尝试。在自动重新加入过程中,成员保持超级只读模式并显示ERROR陈述其对复制组的看法。可以随时通过使用STOP GROUP_REPLICATION语句或关闭服务器来手动停止成员。如果指定的尝试次数用完而成员没有重新加入或被停止,则成员继续执行 group_replication_exit_state_action 系统变量指定的操作,该操作可以是保持超级只读模式或关闭。(错误#25673350、错误#84784、错误#28732174)

  • WHERE在常量和列值之间进行比较的条件,其中常量值超出范围或相对于列类型的类型错误现在在优化期间处理,而不是在执行期间处理。例如,给定一个包含类型为 t的列的表,查询中的条件 可以折叠为,因为 256 超出了该类型列的范围。还可以优化与列的比较;如果该列可以为空,则可以将相同的查询优化为。 cTINYINT UNSIGNEDSELECT * FROM t WHERE c < 256SELECT * FROM t WHERE TRUENULLcSELECT * FROM t WHERE c IS NOT NULL

    可以用这种方式处理的比较有 >, >=, <, <=, =, <>/!=<=>。(BETWEEN目前 IN不支持。)可以根据范围和类型折叠比较的类型包括整数、浮点数和定点数字类型。 BIT此优化不支持,日期和时间类型的列也不支持。

    有关详细信息,请参阅 常量折叠优化。(错误#90100、错误#25484743、错误#29048682、错误#27703371)

    参考资料:另请参阅:Bug #28172538、Bug #29699347。

  • 为输出添加了一种实验树格式 EXPLAIN,它打印生成的迭代器树,旨在帮助用户了解执行的实际设置方式。EXPLAIN FORMAT=TREE目前在生产中不受支持,其语法和输出都可能在 MySQL 的后续版本中发生变化。

  • 当 MySQL 服务器 ( binlog_encryption=ON) 上使用二进制日志和中继日志加密时,您现在可以在服务器运行时随时通过发出来轮换二进制日志主密钥ALTER INSTANCE ROTATE BINLOG MASTER KEY。您可以定期执行此操作以遵守您组织的安全策略,并且如果您怀疑当前或任何以前的二进制日志主密钥可能已被泄露,也可以执行此操作。

    当您轮换二进制日志主密钥时,新的主密钥用于加密新二进制日志和中继日志文件以及后续文件的文件密码,直到再次更改密钥。服务器上现有的加密二进制日志文件和中继日志文件的文件密码也使用新的二进制日志主密钥依次重新加密,从最近的文件开始。将跳过任何未加密的文件。最后,所有不再适用于任何保留的二进制日志文件或中继日志文件的二进制日志加密密钥都会从密钥环中清除。

  • 现在可以通过定义和强制执行加密默认值来全局管理表加密。该 default_table_encryption 变量为新创建的模式和通用表空间定义加密默认值。模式的加密默认值也可以DEFAULT ENCRYPTION 在创建模式时使用子句定义。默认情况下,表会继承创建它的模式或通用表空间的加密。

    加密默认值是通过启用 table_encryption_privilege_check 变量来强制执行的。当使用不同于设置的加密设置创建或更改模式或通用表空间 default_table_encryption 时,或者使用不同于默认模式加密的加密设置创建或更改表时,将进行权限检查。

    TABLE_ENCRYPTION_ADMIN 权限允许在启用时覆盖默认加密设置 table_encryption_privilege_check

    有关详细信息,请参阅 为模式和通用表空间定义加密默认值

  • 系统变量 group_replication_exit_state_action 指定当服务器实例无意中离开组时组复制的行为,例如在遇到应用程序错误后,或者在失去多数的情况下,或者当组的另一个成员由于怀疑超时而将其驱逐时. super_read_only在引入系统变量之前,服务器在这些情况下的响应是通过将系统变量设置为ON 来将MySQL切换到超级只读模式 。group_replication_exit_state_action 为服务器提供了关闭自身的替代选项,这最大限度地减少了过时读取的可能性,并且意味着不需要主动监视服务器的故障。在 MySQL 5.7.24 和 MySQL 8.0.12 中引入系统变量时, READ_ONLY为了与现有行为兼容,在 5.7 中默认设置为ABORT_SERVER8.0。根据用户反馈,默认值现已READ_ONLY从 MySQL 8.0.16 更改为。

  • 当对分区表进行插入、删除或更新时,二进制日志现在会记录有关分区和(如果有)发生行事件的子分区的信息。为发生在不同分区或子分区中的修改创建一个新的行事件,即使涉及的表是相同的。因此,如果事务涉及三个分区或子分区,则会生成三个行事件。对于更新事件,之前映像和 之后映像的分区信息都被记录下来。-v如果您指定或 ,则显示分区信息--verbose使用mysqlbinlog查看二进制日志时的选项。分区信息仅在使用基于行的日志记录时记录 ( binlog_format=ROW)。

修正错误

  • NDB Cluster: EXPLAIN使用表访问类型执行的查询eq_ref 也可能显示条件被下推,即使查询不支持条件下推。现在在NDB 检查可能的下推优化条件之前检查访问类型。

    此修复不影响作为推送连接一部分的表的处理,因为它NDB继续像以前一样支持推送条件。(漏洞 #27429615)

    参考资料:另请参阅:Bug #27397802、Bug #27808758、Bug #90301。

  • InnoDB: 在启动时启用撤消表空间加密后,撤消表空间仍未加密。(漏洞#29477795)

  • InnoDB: 修改了 MySQL 8.0.14 中引入的带有撤消表空间 DDL 支持的有问题的宏。(缺陷 #29324132,缺陷 #94243)

  • InnoDB: 在错误范围内定义的静态线程局部变量未在线程退出时释放。(漏洞 #29305186)

  • InnoDB:对于唯一二级索引上的锁, 该列只显示了锁定记录的二级索引值,不足以保证识别记录的唯一性。锁定记录的聚簇索引列值现在已附加。(缺陷号 29296645)performance_schema.data_locks LOCK_DATA

  • InnoDB: 使用回滚段恢复 XA 事务的事务计数不正确,阻止了撤消表空间截断操作的继续,并使清除线程忙于检查撤消表空间是否为空。(漏洞#29273194)

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

  • InnoDB: 在无法检索压缩文件表空间的空间 ID 后,在启动时引发了无效断言。删除了无效的断言代码。(缺陷 #29221385,缺陷 #93760)

  • InnoDB: 优化InnoDB后的内部临时表不支持in-placeUPDATE操作,导致delete-marked记录数不断增加。大量删除标记的记录可能导致比预期的查询执行时间更长。(漏洞 #29207450)

  • InnoDB: Contention-Aware Transaction Scheduling (CATS) 算法中 的std::sort被替换std::stable_sort为为等权重事务保留原始 FIFO 顺序的函数。(缺陷号 29058967)

  • InnoDB: 由于变量初始化不正确,预写未按预期工作。

    感谢 Yuhui Wang 的贡献。(缺陷 #29028838,缺陷 #93442)

  • InnoDB: 未存储生成列的基本列信息。(漏洞 #29021730)

  • InnoDB: 对二级索引的隐式锁定检查不必要地使用排序规则比较列。(漏洞 #29010725)

  • InnoDB:由于最近对该设置进行了修改, 与该设置相关的断言代码 不再有效。断言代码已修改。(缺陷号 29007731)innodb_flush_method O_DIRECT_NO_FSYNC

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

  • InnoDB: 在启用撤消日志加密的情况下启动服务器时,新创建的撤消表空间的主密钥是在没有服务器 UUID 的情况下生成的。如果尚未生成服务器 UUID,撤消表空间应使用 DefaultMasterKey。(漏洞 #29006275)

  • InnoDB: 数据字典代码未检查返回的数据字典对象,这可能导致服务器因空指针访问而退出。(缺陷 #28977444,缺陷 #93362)

  • InnoDB:CREATE UNDO TABLESPACE一个撤消表空间文件被失败的操作 留下 (缺陷号 28966457)

  • InnoDB:CREATE UNDO TABLESPACE由于文件名中的无效字符,Windows 上 的OS_FILE_ON_ERROR_NO_EXIT由于创建撤消表空间文件的调用中缺少属性,失败导致挂起情况 (漏洞#28955676)

  • InnoDB: 修改 innodb_undo_log_encrypt 变量的值不是阻塞操作,这可能导致修改在操作似乎已成功完成后被后台线程恢复。(漏洞#28952870)

  • InnoDB:temptable::Handler::primary_key_is_clustered 函数中删除了一个无效的调试断言。(缺陷号 28949332)

  • InnoDB: 操作 ALTER TABLE ... EXCHANGE PARTITION未正确更新table_id数据字典中的列值。(漏洞 #28927005)

  • InnoDB:删除了innochecksum 实用程序中 发现的内存泄漏(缺陷 #28917614,缺陷 #93164)

  • InnoDB: 尝试在虚拟列上创建索引失败后的 DDL 操作导致断言失败。(漏洞#28825718)

  • InnoDB: 对于大小小于或等于 128KB 的压缩 BLOB 的部分更新操作,观察到性能下降。(漏洞#28784301)

  • InnoDB: 运行聚合查询引发Valgrind 警告。(漏洞#28711717)

  • InnoDB: 操作CHECK TABLE引发断言失败。在函数退出之前,指向本地调用堆栈变量的指针未设置回 null。(漏洞 #28525110)

  • InnoDB: 修改了 DDL 日志函数以处理 ER_TOO_MANY_CONCURRENT_TRXS错误。(缺陷 #28523127,缺陷 #92071)

  • InnoDB: 清除线程未能释放 LOB 数据页。(漏洞#28510599)

  • InnoDB: 一些 DDL 日志表事务在 DDL 日志恢复之前没有回滚。(漏洞#28494969)

  • InnoDB:在检索表名的处理 期间调用的函数SHOW CREATE TRIGGER未执行预期的小写转换。(漏洞 #28351038)

  • InnoDB: 该 列报告了不正确的值。(缺陷 #28315651,缺陷 #91577)INFORMATION_SCHEMA.INNODB_FOREIGN TYPE

  • InnoDB: Linux AIO 处理函数无法检查已完成的 I/O 事件是否成功。感谢赵薇的贡献。(缺陷 #27850600,缺陷 #90402)

  • InnoDB: 在确定事务是否在二级索引上持有隐式锁的检查中引发断言失败。不更改包含虚拟列的二级索引的列的事务可能会被错误地确定为持有隐式锁。(漏洞 #27491839)

  • InnoDB:线程 调用的函数CREATE TABLE在后台线程释放后试图访问表对象。

    感谢炎黄的补丁。(缺陷 #27373959,缺陷 #89126)

  • InnoDB: 两个会话同时执行一个INSERT ... ON DUPLICATE KEY UPDATE操作产生了死锁。在元组的部分回滚期间,另一个会话可以更新它。此错误的修复恢复了错误 #11758237、错误 #17604730 和错误 #20040791 的修复。(缺陷号 25966845)

  • InnoDB: 当用于访问连接表的方法为 时 constInnoDB 多次尝试解锁匹配行。(缺陷号 20939184)

  • InnoDB:添加索引时未更新 的INDEX_LENGTHINFORMATION_SCHEMA.TABLES(漏洞 #19811005)

  • 分区: 一些分区 DDL 语句由于名称验证检查使用了错误的表标识符而被不正确地拒绝。(漏洞#29317007)

  • 分区: 在回滚时 ALTER TABLE ... COALESCE PARTITION,服务器有时会尝试锁定和关闭由于该语句而被删除的分区。(漏洞#28517446)

  • 分区:通过在每个分区上使用重新启动的语句 将AUTO_INCREMENT键添加到分区表(漏洞 #92241,漏洞 #28573894)ALTER TABLEALGORITHM=INPLACE

  • 复制:当为成员的组复制本地地址指定的端口当前正忙时, 组复制没有正确处理 START GROUP REPLICATION发出的情况。(漏洞#29347285)

  • 复制: 如果该WAIT_FOR_EXECUTED_GTID_SET()函数与包含小数部分(例如1.5,例如, 0.1)。现在已更正转换逻辑,以便按最初指定的方式应用超时值,不进行舍入。感谢 Dirkjan Bussink 的贡献。(缺陷 #29324564,缺陷 #94247)

  • 复制:AFTER系统变量 的一致性级别group_replication_consistency 不包括 提供的一致性保证 BEFORE_ON_PRIMARY_FAILOVER。这些一致性保证已经隐含地存在于 BEFOREBEFORE_AND_AFTER一致性级别中,现在由AFTER. (缺陷 #29315752,缺陷 #94213)

  • 复制: 在基于 Debian 的平台(例如 Ubuntu)上,如果主机名解析为 127.0.1.1 - 这是这些平台上的默认设置 - 则无法使用默认设置创建集群。现在,在这种情况下,会在创建集群并向其中添加实例之前对实例进行适当的验证。(缺陷号 29246110)

  • 复制: 在阻塞组中,如果您为 设置了一个无效值 group_replication_force_members 然后发布STOP GROUP_REPLICATION,服务器可能会意外停止。(漏洞#29119961)

  • 复制:mysql.gtid_executed MySQL 服务器在无法访问表 时的行为 mysql.gtid_executedMySQL 服务器现在确保当服务器处于只读或超级只读模式时允许写入如果 mysql.gtid_executed无法访问表进行写入,并且二进制日志文件由于达到最大文件大小 (max_binlog_size) 以外的任何原因而轮换,则继续使用当前二进制日志文件。一条错误消息将返回到请求轮换的客户端,并在服务器上记录一条警告。如果 mysql.gtid_executed无法访问表并max_binlog_size 已达​​到,服务器会根据其 binlog_error_action设置进行响应。如果 IGNORE_ERROR设置,则在服务器上记录错误并停止二进制日志记录,或者如果 ABORT_SERVER设置,则服务器关闭。(漏洞#29111514)

  • 复制:STOP GROUP_REPLICATION成员试图评估它是否失去多数时发布时,服务器可能会意外停止。(缺陷号 29053128)

  • Replication:RESET MASTER TO语句指定二进制日志文件的起始索引号时,可以指定的最大数量已经从最大整数值减少到2000000000。如果指定了最大整数值,则服务器无法启动,因为无法创建更多的二进制日志文件。服务器之前在那种情况下也遇到过分段错误。(错误#28980788,错误#28995220)

  • 复制: 在使用 GTID 并禁用二进制日志记录的复制从站上,当表过滤器过滤掉 DDL 语句时,在调试模式下会引发断言。(漏洞#28965972)

  • 复制: 纠正了二进制日志中基于语句的复制事件反序列化的两个问题。(错误#28889181,错误#29028491)

  • 复制: 如果应用程序线程在打开表的过程中停止,则不会设置任何错误,这可能会导致分段错误或断言,具体取决于构建类型。在这种情况下,现在可以正确激活错误处理。(漏洞#28864557)

  • 复制: 当主机名在组复制的 IP 地址白名单中指定时 (group_replication_ip_whitelist),当 IPv4 地址也可用时,IPv6 地址用于名称解析和白名单比较。组复制连接应始终首选 IPv4 地址。现在,如果主机名解析为 IPv4 地址,则不会考虑将任何 IPv6 地址与白名单进行比较。(漏洞 #28841543)

  • 复制: 在服务器上使用 GTID 时,每次主服务器使用自动跳过功能跳过事务时,复制从服务器上的主服务器信息日志都会同步。该过程以发送到从站并导致对日志进行强制刷新的虚拟心跳结束,这可能会对从站上的写入负载产生巨大的累积影响。同样的问题可能发生在循环复制拓扑中,事件源自同一服务器并因此被忽略,这些事件也由从服务器通过强制刷新日志来处理。从处理代码现在已经更改为删除心跳事件和通过循环复制接收到的忽略事件的强制刷新, CHANGE MASTER发出语句,或旋转二进制日志)。(漏洞 #28815555,漏洞 #85158)

  • 复制:ALTER TABLE语句与DEFAULT子句一起用于为新列指定表达式默认值,并且表达式默认值引用非确定性函数时,该语句对于基于语句的复制是不安全的。以前,此类语句还根据 GTID 一致性进行评估,这不是适当的检查,因为这些语句不会影响 GTID 一致性。现在,这些语句仅针对二进制日志记录进行评估,并根据使用的二进制日志记录格式进行处理。binlog_format设置为 时 , STATEMENT将记录该语句,但会将一条警告消息写入错误日志。什么时候 binlog_format设置为 MIXEDor ROW,不执行该语句并将错误消息写入错误日志。(漏洞#28799939)

  • 复制: 在配置为单主模式(group_replication_single_primary_mode=ON,这是默认设置)的复制组中,如果严重的网络延迟影响了组,则主节点和辅助节点可能对事务做出不同的决定,这可能导致分歧在gtid_executed成员集上。该问题现已解决。(错误#28768550、错误#28966455、错误#92690)

  • 复制: 以前,无法语句group_replication_applier 通道FLUSH RELAY LOGS由于此限制,当为二进制日志文件和中继日志文件 (binlog_encryption=ON) 启用加密时,从 MySQL 8.0.14 开始可用,如果再次禁用加密,则无法立即轮换在该通道上使用的中继日志文件。该限制对 MySQL 8.0.16 中提供的二进制日志主密钥轮换具有类似的影响。该限制现已取消, FLUSH RELAY LOGS声明和相应的内部请求现在对 group_replication_applier通道与任何其他通道一样,但如果在应用事务时收到请求,则在事务结束后执行请求。请求者必须等待交易完成和轮换发生。此行为可防止事务被拆分,这对于 Group Replication 是不允许的。(漏洞#28684376)

  • 复制: 当您使用 group_replication_force_members 系统变量为组强制进行新配置时,组通信引擎 (XCom) 现在会检查您是否没有包括任何当前无法访问的组成员。如果找到,则不允许重新配置并返回错误。(漏洞#28678845)

  • 复制: GRANT写入二进制日志的语句在某些情况下被错误记录,这可能导致在GRANT 主服务器上成功执行的语句导致复制从服务器出错。(错误#28643405、错误#29155451、错误#93750)

  • Replication: 如果一个存储引擎有能力记录 STATEMENTformat但没有 ROWformat,当 binlog_format设置为 STATEMENT,应该记录一个不安全的SQL语句,并且应该在错误日志中写入一条警告信息。但是,这样的语句并没有被执行,错误消息被写入错误日志,这binlog_format是设置为MIXEDROW。该问题现已得到纠正,当 binlog_format设置为 STATEMENT。(错误#28429993,错误#73936)

  • 复制: 复制组成员可能会短暂脱机,然后在组检测到故障并重新配置以删除成员之前再次尝试重新加入复制组。以前,在这种情况下,如果重新加入的成员接收并处理了用于其崩溃前化身的消息,则它可以参与 XCom 的共识协议。这可能会导致 XCom 为同一轮共识提供不同的价值,因为重新加入的成员可能会在失败前后做出不同的决定。为了防止这种情况,重新加入的成员现在会忽略用于其崩溃前化身的消息。(漏洞#27383487)

  • 复制: 复制组成员由于失去多数而被逐出组后可能会触发本地视图。这导致一条消息错误地指出该成员在被驱逐后已恢复正常运营。Group Replication 现在会在发送本地视图之前检查该成员是否已被驱逐。(漏洞 #27349236)

  • 复制: 如果为系统变量指定了无效值 group_replication_communication_debug_options ,群通系统将其对应的内部变量设置为 GCS_DEBUG_NONE,服务器返回无效值进行SHOW VARIABLES查询。现在在服务器初始化期间检查系统变量的值,如果指定了无效值,则会记录一条错误消息并且组复制不会自动启动。(缺陷号 26729404)

  • 复制: 在过载的服务器上,当成员加入组时,VIEW_CHANGE_LOG_EVENT 标记该点的事件可能没有记录在正确的位置。这可能会导致向新加入的服务器传输数据时出现错误和数据分歧。现在, VIEW_CHANGE_LOG_EVENT事件记录在二进制日志中的正确位置。此外,还会记录有关事件记录延迟的警告。(漏洞 #93347,漏洞 #28971594)

  • 复制: 当一个成员在服务器启动时加入一个组,如果加入过程失败,例如因为服务器与组不兼容,离线成员有可能仍然看到另一个成员在线。现在,在这种情况下, performance_schema.replication_group_members 表中显示的信息仅限于本地成员 OFFLINE。(缺陷 #92110,缺陷 #28533993)

  • 复制: 如果恢复通道出现故障,未处理的中继日志将被删除。(漏洞 #90671,漏洞 #27940732)

  • macOS: 如果使用 Xcode 而不是 Makefiles 构建,macOS 现在需要CMake3.12.4 或更高版本(强制 UseModernBuildSystem = NO(漏洞#28893131)

  • Microsoft Windows:系统变量 的有效性测试 named_pipe_full_access_group 未考虑NULL 值。(漏洞 #29256690)

  • Microsoft Windows:当mysqld的 多个实例--no-monitor 在同一主机上为同一用户启动时,该 SHUTDOWN命令会关闭错误的服务器进程。--no-monitor此修复通过附加进程的进程 ID创建一个唯一的关闭事件名称以供使用(漏洞#28723675)

  • JSON: JSON 路径解析器现在以与 MySQL 服务器的大多数其他组件相同的方式传播错误,错误时返回 true,成功时返回 false。(漏洞#28851426)

  • JSON: 删除了 Json_wrapper::get_datetime(). (漏洞#28851324)

  • authentication_ldap_simple插件可能会错误地强制执行身份验证。(漏洞#29637712)

  • 更新了过时的 RPM 包,以便在 EL8 上从 MariaDB 成功升级到 MySQL。(漏洞#29413354)

  • 外部联接的结果可能包含一个非NULL行,而该NULL 行是预期的扩展行。(漏洞 #29402481)

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

  • SET PASSWORD FOR ...无法作为准备好的语句执行。(缺陷 #29387041,缺陷 #94416)

  • 在构建 MySQL 路由器库时,在 Visual Studio 下构建可能会失败。(漏洞#29382197)

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

  • 如果在引用表之前定义,导入的外键不起作用。(缺陷 #29379078,缺陷 #94400)

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

  • 当在解析时评估表达式的 ESCAPE子句LIKE 时出现错误时,错误状态不会传播给调用者。(缺陷号 29368521)

  • 从 MySQL 5.7 就地升级到 MySQL 8.0 后,未删除元数据备份表的innodb_table_stats_backup表 空间文件 。innodb_index_stats_backup(漏洞 #29365552)

  • 在展平子查询时,如果存在始终为 false 的谓词,则 MySQL 优化器不会执行任何类型的转换,从而导致子查询未准备好,并在稍后执行时断言。为解决此问题,当子查询中存在此类谓词时,子查询的查询表达式现在与查询块断开链接。(漏洞#29356132)

  • ALLOW_INVALID_DATES如果使用SQL 模式 定义事件、例程或触发器,则从 MySQL 8.0.11、8.0.12 或 8.0.13 升级到 MySQL 8.0.14 或 8.0.15 失败。MySQL 8.0.14修改了数据字典中的SQL模式标识,导致迁移失败。(漏洞 #29350955)

  • RPM 构建忽略了WITH_SSL 配置设置。(缺陷号 29347534)

  • 函数的长度元数据 TO_SECONDS()并不总是计算正确。(漏洞#29321387)

  • 由于始终为真或假而删除的使用窗口函数的条件并不总是正确处理。(缺陷号 29320484)

  • SET ROLE语句可能会泄漏内存。(漏洞 #29304583)

  • 在 Windows 上从 MySQL 5.7 升级到 MySQL 8.0 失败,出现 迁移表空间时来自 SE 的错误 197。该错误是由于尝试打开表空间文件时发生的访问共享冲突造成的。(缺陷号 29292860)

    参考资料:这个问题是 Bug #28642608 的回归。

  • RPM 包中的COMPILATION_COMMENT_SERVER 值可能不正确。(漏洞 #29284651)

  • CREATE TABLE IF NOT EXISTSsql_require_primary_key如果新表定义没有主键并且启用了系统变量,即使表已经存在也会失败 。(缺陷 #29283055,缺陷 #94134)

  • 从已删除所有分区的分区表中删除并不总是能正确处理。(漏洞 #29280186)

  • GNU 链接器的CMake检查 gold可能因 Clang 而失败。(缺陷号 29278244)

  • MySQL 8.0.16 版本增加了数据字典版本。(缺陷号 29278241)

  • 与函数一起使用的错误类型的参数 DISTINCT并不总是被正确处理。(漏洞#29277571)

  • 函数的长度元数据QUOTE() 并不总是计算正确。(缺陷号 29276074)

  • 在计算GREATEST()or LEAST()时,MySQL 在检查 之前先检查返回值的正确符号 NULL。(漏洞#29275835)

  • 当严格的 SQL 模式未生效时,某些字符串函数返回的值NULL指示大于 max_allowed_packet处理不一致行为的结果,这可能导致错误排序的输出和其他可能的不当行为。(漏洞#29272683)

    参考资料:另请参阅:Bug #97301、Bug #29133127。

  • 检查是否支持升级到特定服务器版本的逻辑被反转为检查不支持升级的服务器版本。(缺陷号 29270297)

  • 事件创建可能会存储不正确的重复间隔。(缺陷 #29269819,缺陷 #94085)

  • 包含视图引用或由转换创建的项目的 WHERE 条件并不总是得到正确处理。(错误#29268867、错误#29268698、错误#28723669、错误#29244238)

  • mysql_ssl_rsa_setup无法使用 GCC 9 进行编译。(缺陷 #29245251)

  • 如果CMake发现一个libtirpc 库太旧而无法与 MySQL 一起使用,它会尝试使用 Sun RPCglibc代替。(缺陷号 29240701)

  • 由于查询执行时间的计算不正确,服务器可能无法将慢速查询写入慢速查询日志。(缺陷 #29232684,缺陷 #93963)

  • 使用位置的 MySQL 正则表达式函数采用基于 16 位块而不是代码点位置的内部索引。(漏洞#29231490)

  • 在 Windows 上,MySQL MSI 安装程序可能无法正确检测是否安装了 Visual Studio 2015 Redistributable。(缺陷号 29227209)

  • SDIJSON文件不包括 对象m_hidden字段 。Index_impl这使得很难使用 SDIJSON为表重新创建 CREATE语句,因为 InnoDB添加了许多隐藏索引。SDIJSON现在包括该 m_hidden字段。这改变了 SDI 格式,因此 SDI 版本号增加到当前服务器版本号。(缺陷 #29210646,缺陷 #93914)

  • 范围框架中最后一行的位置提示已更新为框架中实际最后一行之后的一行。(漏洞 #29201831)

  • 在列定义中,当第一个是约束时,不接受多个约束定义CHECK 。(漏洞 #29191994)

  • 如果服务器正在执行升级,则启动期间缓冲的错误日志信息可能缓冲时间过长。(错误号 29189532)

  • 对于可为空的列,如果我们发现一个表达式始终为真,除非该列为NULL,则表达式折叠为 column IS NOT NULL。当嵌套这样的表达式时,这会导致 NULL错误地选择行。为防止这种情况发生,嵌套时的此类表达式现在折叠为. (缺陷号 29179604)IF(column IS NULL, NULL, TRUE)

  • PERIOD_ADD()period没有在 Windows 平台上为参数正确处理长度大于 32 位的值 。(漏洞 #29175262)

  • sql_auto_is_null启用时,形式的 子句WHERE被 重写为. 这种转换只对每个自增值执行一次,这使得很难提前知道是否会执行转换。现在只要 启用,转换就会无条件地执行。 WHERE auto_increment_col IS NULLWHERE auto_increment_col = LAST_INSERT_ID()sql_auto_is_null

    此外,返回的值 LAST_INSERT_ID()现在被视为无符号,修复了无法匹配有符号范围之外的自动递增值的问题BIGINT。(漏洞#29171668)

  • 在 Debian 和 Ubuntu 上,非交互模式下的安装操作会忽略root密码,导致auth_socket默认安装身份验证插件。(漏洞 #29165407)

  • harness_plugin_eventlog声明在某些构建环境中导致了编译错误。(缺陷号 29160214)

  • 缺少在常量折叠期间将十进制常量截断或扩展为所需小数位数的逻辑。分数中额外的尾随零可能会触发扩大派系的尝试,因为扩大的决定是基于非零小数位数的数量,而不是小数位数的总数,从而导致断言(在调试版本中)在内部函数 widen_fraction()中。通过确定仅在何处可以截断多余的尾随零来解决此问题。在这种情况下,不需要调整比较运算符,而是可以用一个尾随零较少的常量代替。(漏洞 #29155439)

  • 在 Windows 上,内部函数 get_mysql_time_from_str_no_warn()并不总是执行正确的错误检查。(漏洞 #29155126)

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

  • 在某些情况下,RENAME TABLE多次重命名同一个表的语句可能会引发断言或导致服务器退出。(漏洞 #29140407)

  • 对于调试版本,启动服务器 --event-scheduler=DISABLED可能会导致针对某些事件引发断言。(缺陷 #29140298,缺陷 #93719)

  • 在调试版本中,当严格 SQL 模式未生效时, 如果结果长于 ,则CONCAT()和 函数会引发断言。(漏洞 #29133127)CONCAT_WS()max_allowed_packet

  • 超出范围的小数部分可能会在SET SESSION timestamp 语句中产生不正确的时间戳。(缺陷 #29120569,缺陷 #93600)

  • mysql_service_component_sys_variable 服务可以访问组件系统变量,但不能访问服务器或插件系统变量。(漏洞 #29113463)

  • ALTER TABLE ... CONVERT TO CHARACTER SET 可能会产生内存访问错误。(缺陷 #29058369,缺陷 #93603)

  • mysql.tablespaces.name限制为 259 字节,小于允许的标识符长度所需的长度。列限制提高到 268 字节。(缺陷 #29053560,缺陷 #93587)

  • 对于调试版本,对于引发断言的空间计算,分区处理代码忽略了错误,导致服务器退出。(缺陷号 29047811)

  • 外部存储的零长度 LOB 导致断言失败。(缺陷号 29047795)

  • COMPILE_DEFINITIONS调整了和 COMPILE_FLAGS CMake选项 的处理以避免交叉编译失败。(漏洞 #29041100)

  • 即使max_error_count 系统变量设置为零,服务器也可能会尝试读取第一条诊断区域消息,从而导致内存访问错误。(缺陷号 29031684)

  • 与常量字符串比较DATE值时,MySQL 首先尝试将字符串转换为 a DATE,然后再执行比较。当转换失败时,MySQL 将DATE当作一个字符串来执行比较,这可能会导致不可预知的行为。现在在这种情况下,如果将字符串转换为 aDATE失败,则比较失败并返回ER_WRONG_VALUE. (漏洞 #29025656)

    参考资料:另请参阅:Bug #95466、Bug #29812087。

  • 使用该--users选项, mysqlpump向输出写入CREATE USERGRANT语句,但为时已晚,无法应用于由转储创建的其他对象。因此,恢复创建用户帐户的转储文件为时已晚,无法应用于该文件创建的其他对象。 mysqlpump现在在其他对象之前将用户帐户写入转储文件。(缺陷号 29023216)

  • 对于 WITH关键字位置的语法错误,解析器错误消息会在不正确的位置识别问题。(漏洞 #29022263)

  • 使用最新版本的 Unicode 国际组件 (ICU) 构建的 MySQL 现在返回 ER_REGEXP_ILLEGAL_ARGUMENT 而不是 格式错误ER_REGEXP_ERROR的正则表达式的一般错误。(缺陷号 29016798)

  • 在 Windows 上,如果文件系统区分大小写,则无法找到 LDAP 库。(漏洞 #29016220)

  • 从表的TABLE_COMMENT列中选择的值INFORMATION_SCHEMA.TABLES 可能会被截断。(缺陷 #29014272,缺陷 #93451)

  • 在 ASAN 和 Valgrind 构建中发现了与未释放模式相关的数据层内存泄漏。(缺陷号 29008688)

  • 与包含表达式 的子句一起使用时错误引发 的GROUP BY查询 。ROLLUPER_WRONG_FIELD_WITH_GROUPORDER BY

    同样的问题还导致GROUP BY在对函数进行排序时使用 ROLLUP 查询的结果排序不正确。(错误#29006668,错误#29054096)

  • 解析器COLLATE在生成的列定义中接受了多个子句。它现在接受一个 COLLATE子句。(漏洞#28997518)

  • INSERT ... ON DUPLICATE KEY UPDATE可能会执行不正确的更新。(缺陷 #28995498,缺陷 #93410)

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

  • 损坏的mysql.user表可能导致服务器退出。(缺陷号 28986737)

  • 从 Performance Schema data_locksdata_lock_waits表中读取行可能会在扫描期间返回无限数量的行,导致服务器因内存分配过多而退出。这种情况现在会产生错误。(漏洞 #28977428,漏洞 #87748)

  • 计算 LATERAL空表上连接的物化成本导致断言。现在在这种情况下,查询成本报告为零。(缺陷号 28976533)

  • 对于调试版本,列类型或DDL 语句utf8的注释字符串中 的无效字符引发断言。(缺陷 #28972424,缺陷 #93321)CREATEALTER

  • CMake对标头 的检查tirpc 现在回退到使用pkgconfig, 以便能够在更多 Linux 平台上查找标头。这需要安装pkgconfig。(错误#28970313、错误#93341、错误#28997093)

  • 当子查询子句中的组件不确定时, mysqld可能会意外关闭WHERE,在这种特殊情况下,由于引用了也在同一语句中设置的用户变量。通过忽略具有非确定性组件的谓词来解决此问题。

    此外,由于作为一般规则的非确定性子查询应该按外行进行评估,因此这些不应该是物化策略的目标。这可以通过不去关联非确定性谓词来防止。如果可能,现在也对非半连接和非确定性子查询执行相同的策略选择。(缺陷号 28970261)

  • ALTER TABLE当较早获得用户级锁和显式表锁时,更改表存储引擎的语句可能会挂起。(漏洞#28966941)

  • COUNT()withLIMIT ... OFFSET返回的结果与使用此子句使用的其他聚合函数获得的结果不同。(漏洞#28961843)

  • 提取MYSQL_HOME 环境变量的值可以更改存储MYSQL_HOME在环境中的变量值。(缺陷号 28960613)

  • Item_subselect::walk_body()现在步行 FROM条款。(缺陷号 28955358)

  • 在具有以下两个子查询的查询的查询计划中发现了一个问题IN

    • 具有派生表的子查询包含对最顶层查询的外部引用

    • 带有非外相关派生表的子查询是半连接的,并且不是横向的。

    对于第二个子查询:依赖映射的计算忽略了排除不相关的侧表,并且错误地将派生表的依赖关系包含在第一个子查询中。(漏洞#28954838)

  • GROUP BY未及时检查 在某些查询中计算常量表达式时产生的错误。(漏洞#28949452)

  • DATEor DATETIME值与字符串进行比较时,MySQL 首先尝试将字符串转换为相同类型(DATEDATETIME),然后将两者作为该类型的值进行比较。如果此转换失败,MySQL 会发出不正确的日期值警告,然​​后回退到将值作为字符串进行比较,这是预期的行为。在某些情况下,即使转换后的字符串没有反映有效的DATEor DATETIME值,也不会发出警告,并且将其作为该类型的值与DATEor DATETIME值进行比较。现在在这种情况下,总是检查转换后的字符串是否DATE有效 DATETIME在进行比较之前,除非 ALLOW_INVALID_DATES已明确设置服务器 SQL 模式。(缺陷号 28940878)

  • 长客户端主机名可能会导致意外的服务器行为。(缺陷号 28936359)

  • 在单个准备好的语句中替换大量参数可能会导致过多和不必要的内存重新分配。这是通过 String::replace()使用指数缓冲区增长来解决的String::append()。(漏洞#28929977)

  • 由于未能检查事务相关操作的结果,数据字典缓存可能与数据字典内容不同步。(漏洞 #28923782,漏洞 #93196)

  • 对mysqld进程 可用的在线 CPU 数量的确定 现在更加准确。感谢 Daniel Black 的贡献。(缺陷 #28907677,缺陷 #93144)

  • 由于视图无效, 该列报告了错误的错误消息。(漏洞 #28901919)INFORMATION_SCHEMA.TABLES TABLE_COMMENT

  • 升级后, INFORMATION_SCHEMA.TABLES视图报告视图' view_name'引用了无效的表或列或函数或视图的定义者/调用者缺乏使用它们的权利用于多个sys模式视图。升级过程没有更新引用视图状态。(漏洞 #28901821)

  • 为具有许多不同列值的大型表(数百万行)创建直方图花费了过多的时间。

    此修复使此过程对于具有很少不同值的数据集稍微慢一些,并且消耗的内存比以前略多,但对于具有许多不同值的大型数据集,它明显更快。(漏洞#28888936)

  • 对于页面大小为 4K 的实例,从 MySQL 5.7 升级到 MySQL 8.0 失败,InnoDB原因是升级期间应抑制的密钥长度错误。(漏洞#28884503)

  • 错误配置的密钥环插件可能会导致服务器退出。(缺陷号 28876033)

  • COUNT()在使用该功能 的案例中发现了两个问题 :

    • 当传递给的参数COUNT()是可为 null 的表达式时,函数可能会返回不正确的结果。

    • 与子查询COUNT()一起使用的 EXISTS 查询返回了不正确的结果。

    (错误#28857990,错误#29240516)

  • 在 MySQL 构建期间 调用ccache的命令生成不正确。(缺陷 #28841612,缺陷 #92927)

  • 以前,对于INSERT多次列出插入列名称的语句,只会报告第一个重复的名称。现在,所有重复的名称都会被报告。(漏洞#28836669)

  • 使用ROLLUP时,GROUP BY可能会NULL在某些行中产生。引用任何这些行的表达式可能会丢失 NULL,从而产生不正确的结果。(缺陷号 28836345)

  • 尝试打开表失败后,从存储引擎发现表的尝试不会检查错误返回,如果发生错误,这可能导致服务器挂起。(缺陷号 28828450)

  • 当试图删除已被授予特定角色的用户时,服务器可能会退出。(漏洞#28817441)

  • 如果 MySQL 配置为 -DWITH_MYSQLX=0. (漏洞#28811356)

  • 在数据字典升级期间调用的函数临时修改了avoid_temporal_upgrade参数,以便始终执行对旧时间类型的检查。因为多个线程可以并发调用该函数,所以增加了一个检查以确保在数据字典升级期间可以安全地修改参数值。(漏洞 #28805429)

  • EXISTS子查询转换为半连接操作 。优化器为这个半连接选择了物化查找策略,但由于子查询与外部查询块没有关联,没有键可用于查找,导致父查询失败。为了解决这个问题,我们使用两个相等的常量项作为键,以确保物化查询获取常量作为键(并且使得物化表最多由一行组成)。(漏洞 #28805105)

  • Last_query_coststatus 变量现在显示包含多个块(例如子查询或联合)的查询的成本 。(以前,此变量仅为由单个查询块组成的简单查询设置。)(缺陷 #28786951)

  • 出现致命信号时mysqld 显示的消息已被简化并提供更多信息。它也不显示内存使用情况的计算,该计算已经过时且不准确。(漏洞 #28773322,漏洞 #92731)

  • 可以使用启用skip_name_resolve系统变量来持久化 SET PERSIST_ONLY它,但不能禁用它。(缺陷号 28749668)

  • 删除了迭代器中过时和不必要的条件下推处理,除非单表更新和删除查询需要。(漏洞 #28745859)

  • IS NOT NULLNULL添加谓词作为优化器执行的引用访问的早期过滤的一部分。对于具有星形连接拓扑的查询,添加了这些谓词的冗余副本,这使得受影响WHERE 条件的评估效率降低。(漏洞#28727717)

  • 当 MySQL 配置为使用系统库的捆绑版本时, CMake可能会生成错误的系统包含顺序。(缺陷 #28727631,缺陷 #92615)

  • 某些涉及 double 到 long long 转换的数字运算可能会在 Windows 和 Linux 上返回不同的结果。(缺陷号 28706832)

  • 在准备好的语句执行期间可能会尝试访问空指针。(漏洞#28692136)

  • FROM_UNIXTIME()如果传递的参数在四舍五入时超过纪元值,则返回超出范围的值。现在它返回NULL 其他超出范围的值。(缺陷 #28671811,缺陷 #92501)

  • slave_parallel_workers在使用系统变量 启动的服务器上进行恢复期间,复制的 DDL 操作可能会导致“主键上的重复条目”错误 。(漏洞#28670843)

  • 帐户中的空主机名可能会导致服务器行为异常。(漏洞#28653104)

  • MySQL 5.7 到 MySQL 8.0 的升级过程没有检查表空间文件是否存在,这可能导致数据字典不一致。(漏洞#28642608)

  • 类型转换在子查询中的ENUM行为与在子查询中的行为不同。(漏洞 #28547906,漏洞 #92173)

  • 即使包含服务器 SQL 模式,导致浮点值截断的语句也可以作为准备好的语句执行 STRICT_TRANS_TABLES。此外,如果二进制日志记录模式为 MIXED,则此类语句会传播到从站,从而导致错误。(漏洞 #28546855)

  • 减少 thread_cache_size运行时的值并不会减少线程缓存的大小。(漏洞 #28508923,漏洞 #92024)

  • 一些错误消息仍然提到该 PASSWORD()功能,该功能已被删除。(漏洞#28498714)

  • 如果Aborted_connects连接由 thread_pool插件管理,则状态变量不会因连接尝试失败而增加。(缺陷号 28490126)

  • mysqladmin shutdown没有等待 mysqld关闭。(缺陷 #28466137,缺陷 #91803)

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

  • 在语句中 指定CURRENT_USER为用户可能会失败。GRANT(漏洞#28454014)

  • 执行短路评估查询的存储过程的重复调用并不总是得到正确处理。(缺陷号 28379655)

  • 密钥环迁移应该只需要对源密钥环的读取权限,但除非用户具有写入权限,否则失败。(缺陷号 28339014)

  • 如果执行密钥环迁移的用户没有对密钥环文件的写入权限,则迁移失败但在其最终错误日志消息中报告成功。(缺陷号 28330922)

  • FLUSH STATUS执行期间,Performance Schema 不必要地将会话状态聚合到全局状态,导致某些状态变量的重复计数。(缺陷 #28291258,缺陷 #91541)

  • mysql_secure_installation不再尝试从.mysql_secret 文件中读取密码。这是由 已删除的程序mysql_install_db创建的。(缺陷 #28235716,缺陷 #91270)

  • 某些状态变量值可能会在恢复到原始值之前暂时增加。(缺陷 #27839644,缺陷 #90351)

  • 如果给出,则客户端程序不会退出, --ssl-fips-mode但无法将 FIPS 模式设置为指定的选项值。(漏洞 #27809371)

  • 执行ALTER INSTANCE ROTATE INNODB MASTER KEY密钥并将其从 keyring_file插件迁移到 keyring_encrypted_file插件可能会使加密表无法使用。(漏洞#27760952)

  • 从 MySQL Community 升级到 Commercial 时, root即使数据目录存在,也会显示密码提示。(漏洞#27741998)

  • 在客户端/服务器协议中,准备好的语句的格式错误的数据包可能未被发现并导致引发断言。(漏洞#27627731)

  • 对线程的会话连接和断开连接处理进行了更改,以便在使用 X 插件时加快查询吞吐量。以前,Srv_session每个命令都会将会话 ( ) 附加到当前线程并从中分离;现在,这个线程切换只有在断开当前会话时,或者当前线程和被附加的线程属于不同的插件时才会发生。(漏洞#27463277)

  • 和关键字被错误地保留了PERSISTPERSIST_ONLY它们现在是非保留关键字。(缺陷号 25220656)

  • 在客户端连接活动的同时安装和卸载插件可能会导致服务器退出。(缺陷号 22980441)

  • 对于LOAD_FILE()stat()应被视为建议性文件的文件,例如 /proc. (缺陷 #18394503,缺陷 #72027)

  • ORDER BY当被查询的表具有隐式全文索引并且排序缓冲区的大小不足以包含已排序的键时, 使用子句的查询会无提示地失败。(缺陷 #93241,缺陷 #28940361)

  • 返回字符串值的可加载函数现在设置显式返回类型。根据传递给函数的参数,这是VARCHARMEDIUMBLOB或 之一LONGBLOB。(缺陷 #92890,缺陷 #28828169)

  • 使内部方法中的比较 Item_result::item_cmp_type()更有效。感谢 Daniel Black 的贡献。(漏洞 #92784,漏洞 #28796107)

  • 当包含它的查询使用 时,算术表达式中使用的窗口函数产生了不正确的结果 DISTINCT。(漏洞 #92503,漏洞 #28672483)

  • 一些涉及复杂连接的查询会泄露文件句柄。(缺陷 #90902,缺陷 #28039829)

  • Fedora 打包现在支持 Fedora 30。

  • Ubuntu 14.04 和 SLES 11 已停产,不再受支持。