有关升级、降级、平台支持等的一般信息,请访问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 更改:
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_bin
是PAD 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_SCHEMA
和sys
架构中与主机名相关的列;声明的MASTER_HOST
价值CHANGE MASTER TO
;语句输出中的Host
列;SHOW PROCESSLIST
帐户名中的主机名(例如在帐户管理语句和DEFINER
属性中使用);和主机名相关的命令选项和系统变量。注意事项:
允许的主机名长度的增加会影响在主机名列上具有索引的表。例如,
mysql
系统模式中索引主机名的表现在具有显式ROW_FORMAT
属性DYNAMIC
以容纳更长的索引值。一些文件名值配置设置可能是基于服务器主机名构建的。允许的值受底层操作系统的限制,它可能不允许文件名足够长以包含 255 个字符的主机名。这会影响
general_log_file
、log_error
、pid_file
、relay_log
和slow_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_upgrade
mysql_upgrade_info
程序在之前升级过程中创建的文件 只能由执行mysql_upgrade程序的操作系统用户修改,导致升级错误。现在发出警告而不是错误,这允许升级操作继续进行。该 文件已弃用,将在未来的 MySQL 版本中删除。(缺陷 #29702060,缺陷 #95165)mysql_upgrade_info
FLOAT(
和 语法来指定类型列的位数 并且 (和任何同义词)是一个非标准的 MySQL 扩展。此语法已弃用,并且在未来的 MySQL 版本中将删除对它的支持。(漏洞 #25328973,漏洞 #84363)M
,D
)DOUBLE(
M
,D
)FLOAT
DOUBLE
-
对于字符串数据类型,该
BINARY
属性是一个非标准的 MySQL 扩展,它是指定_bin
列字符集(如果未指定列字符集,则为表默认字符集)的二进制 ( ) 排序规则的简写。在 MySQL 8.0 中,这种非标准使用BINARY
是不明确的,因为utf8mb4
字符集有多个_bin
排序规则,因此BINARY
不推荐使用该属性,并且在未来的 MySQL 版本中将删除对它的支持。应调整应用程序以改为使用显式_bin
排序规则。使用
BINARY
指定数据类型或字符集保持不变。 -
非标准 C-style
&&
、||
和!
operators 分别是标准 SQLAND
、OR
和 operators 的同义词NOT
,已被弃用,并且在未来的 MySQL 版本中将删除对它们的支持。使用非标准运算符的应用程序应调整为使用标准运算符。笔记||
除非PIPES_AS_CONCAT
启用 SQL 模式,否则不推荐 使用。在这种情况下,||
表示 SQL 标准字符串连接运算符)。 对于数字数据类型,该
ZEROFILL
属性已弃用,整数数据类型的显示宽度属性也是如此。ZEROFILL
在未来的 MySQL 版本中将删除对整数数据类型的支持和显示宽度。考虑使用替代方法来产生这些属性的效果。例如,应用程序可以使用该LPAD()
函数将数字补零到所需的宽度,或者它们可以将格式化后的数字存储在CHAR
列中。对于类型为、 和 (以及任何同义词)
UNSIGNED
的列, 该属性已弃用,并且在未来的 MySQL 版本中将删除对它的支持。考虑对此类列使用简单的约束。FLOAT
DOUBLE
DECIMAL
CHECK
AUTO_INCREMENT
FLOAT
不推荐使用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-server
Linux 包的下载大小和磁盘占用空间,调试二进制文件和插件已被移动到这些平台的单独包中: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-load
8.0.17 之前的 MySQL 发行版编译的插件二进制文件加载到 8.0.17 或更高版本的服务器中将会失败。必须针对 MySQL 8.0.17 或更高版本重新编译插件。(缺陷 #29040456,缺陷 #93550)
对于捆绑了 OpenSSL 库的平台,用于 MySQL Server 的链接 OpenSSL 库已更新至版本 1.0.2s。在https://www.openssl.org/news/cl102.txt和 https://www.openssl.org/news/vulnerabilities.html中描述了新 OpenSSL 版本中修复的问题 。(漏洞#29881152)
由于 MySQL 8.0.16 中的回归,该
createIndex()
方法不支持DOUBLE(M,D)
指定双精度值的语法。(漏洞#29748841)X 协议对带有编码为八位字节的参数的消息的处理已得到纠正,以支持非标量数据,例如字符串数组。(漏洞#29721046)
当 SSL 连接 ( ) 的主机名身份验证处于活动状态时
--ssl-mode=VERIFY_IDENTITY
,X 协议不会检查与服务器证书颁发机构 (CA) 证书中的主题备用名称 (SAN) 的匹配项。这可能会导致连接请求被不必要地拒绝,因为它们使用了指定为 SAN 而不是证书的 Common Name 值的有效主机名。(漏洞#29691694)当准备好的语句与 X 插件一起使用时, 在修改或查找操作中使用
IN
orNOT 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()
之外,可以使用 支持的所有类型说明符。只有 支持对函数的这种用法,并且仅用于在数组 上创建多值索引。BINARY
JSON
CAST()
InnoDB
JSON
作为这项工作的一部分,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 值的函数。笔记ARRAY
和MEMBER
now 是保留字,不能在没有标识符引用的情况下用作标识符。 -
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 模式验证函数。
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_user
和os_sudouser
连接属性(如果可用)分别指示运行该程序的操作系统用户的名称和SUDO_USER
环境变量的值。有关连接属性的一般信息,请参阅 性能模式连接属性表。感谢 Daniël van Eeden 对此功能所做出的贡献。(缺陷 #29210935,缺陷 #93916)-
优化器现在将内部
WHERE
具有、、 或的条件 转换为反连接,从而删除子查询。这类似于现有的( ) 外连接优化;有关详细信息,请参阅 EXPLAIN Extra Information。NOT IN (
subquery
)NOT EXISTS (
subquery
)IN (
subquery
) IS NOT TRUEEXISTS (
subquery
) IS NOT TRUEIS NULL
Not exists
此外,半连接具体化现在可用于
WHERE
具有、 或 的条件,或者当条件属于左连接(例如 )时。请参阅 使用半连接转换优化 IN 和 EXISTS 子查询谓词。IN (
subquery
) IS TRUEEXISTS (
subquery
) IS TRUEIN
SELECT * FROM t1 LEFT JOIN t2 ON t2.x IN (SELECT * FROM t3)
同样由于这项工作,MySQL 现在能够简化 as 形式
(x IS TRUE) IS FALSE
的x IS NOT TRUE
条件,与最初编写的条件相比,可以更快地测试和更容易地优化它。(漏洞 #29027883) IDENTIFIED WITH
output 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 现在支持对 , 的显式转换
DOUBLE
,FLOAT
以及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
value
value
WHERE
value
<> 0EXPLAIN
true
false
1
0
-
InnoDB
通过更好地利用读取线程、减少并行扫描期间发生的预取活动的读取线程 I/O 以及支持分区并行扫描,提高了大型数据集的并行读取线程性能。并行读取线程功能由
innodb_parallel_read_threads
变量控制。现在最大设置为 256,这是所有客户端连接的线程总数。如果达到线程限制,连接将退回到使用单个线程。 mysqlbinlog现在支持
--compress
(或-C
)选项以在客户端/服务器协议中启用压缩。
NDB Cluster:使用包含的compile_cluster构建脚本 的 NDB Cluster 的编译时间 已通过删除运行 MySQL Cluster 并非绝对必要的软件组件选项得到改进。(漏洞 #29355872)
NDB Cluster: 尝试更改
NDB
表的列属性(例如COLUMN_FORMAT
)ALTER 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 时遇到此错误,请执行以下解决方法:
重新启动服务器
--upgrade=FORCE
以强制升级操作继续进行。-
使用小写分区名称分隔符
(#p#
或#sp#
) 标识分区表文件名:SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%';
-
对于每个识别的文件,使用临时名称重命名关联的表,然后将表重命名回其原始名称。
mysql> RENAME TABLE table_name TO temporary_table_name; mysql> RENAME TABLE temporary_table_name TO table_name;
-
验证没有分区表文件名带有小写分区名称定界符(应返回空结果集)。
mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES -> WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%'; Empty set (0.00 sec)
在每个重命名的表上运行
ANALYZE TABLE
以更新mysql.innodb_index_stats
和mysql.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: 修改了错误消息以删除对
.frm
MySQL 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_PATH
InnoDB
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_path
和innodb_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_increment
和auto_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_format
或SET @@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_SCAN
slave_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 TABLE
andDELETE
语句的线程ID被错误识别或根本没有识别。在涉及临时表的多线程复制从站上(需要正确的线程 ID,因为它们是特定于会话的),这种遗漏导致在使用mysqlbinlog重放二进制日志以进行时间点恢复时出错。线程 ID 现在已正确设置。(错误#28642318,错误#92398)-
复制: 当触发器调用将列设置为其默认值
INSERT
or 列的表达式是不确定的时,当触发器在基于语句的复制下触发时,不会引发预期的警告。此外,如果二进制日志记录格式为 ,则非确定性语句将以用于 而不是用于。UPDATE
DEFAULT
MIXED
STATEMENT
ROW
导致触发器触发的语句在解析时检查是否有任何触发语句是不确定的。此时触发语句已经被解析,但还没有被解析,所以唯一可以检查的是触发语句是否直接引用了非确定性运算符。当
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.ibd
MySQL 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.7keyring_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 TRUE
FALSE
NULL
IS NOT FALSE
WHERE
如果
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_switch
firstmatch=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_effect
unknown) 是专门检查的,如果找到,扇出也被认为是未知的,因此从第一个表中选择的行数不会被整个连接的扇出修改。(错误#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)
单表
UPDATE
和DELETE
使用索引表达式的语句在作为准备好的语句执行时可能会导致服务器退出。(漏洞#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 utf8mb4
andSET 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 PRIVILEGES
与CREATE USER
or 并发执行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_cost
JOIN::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 时,CMake
Boost
通过在目标目录中创建一个零长度的 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 TABLE
forARCHIVE
tables 可能导致服务器退出。(漏洞 #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 ALL
with 的查询处理速度非常慢。(缺陷 #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_timestamp
为ON
以及MODE_NO_ZERO_IN_DATE
、MODE_NO_ZERO_DATE
或MODE_INVALID_DATES
作为服务器 SQL 模式的一部分,以帮助避免此问题。(缺陷 #90398,缺陷 #27970159)