有关升级、降级、平台支持等的一般信息,请访问https://mysql.net.cn/doc/relnotes/mysql/8.0/en/。
改进了涉及授权表的语句的锁定处理。(错误#31291237,错误#31576185)
修改
mysql.infoschema和mysql.sys保留帐户现在需要SYSTEM_USER权限。(缺陷号 31255458)对于
CREATE USER、DROP USER和RENAME USER帐户管理语句,服务器现在执行额外的安全检查,旨在防止(可能无意中)导致存储对象成为孤立对象或导致采用当前孤立的存储对象的操作。此类操作现在会因错误而失败。如果您有SET_USER_ID特权,它会覆盖检查,并且这些操作会产生警告而不是错误;这使管理员能够在有意执行操作时执行操作。请参阅 孤立存储对象。
对于JSON格式的日志文件,MySQL Enterprise Audit支持使用
audit_log_read()自定义函数进行日志读取操作。以前,只能通过传递audit_log_read()一个包含书签的参数来指定开始阅读的位置,该书签指示特定事件的确切时间戳和事件 ID。为了更大的灵活性,参数现在可以是一个开始说明符,它命名任何时间戳,从该时间戳或之后发生的第一个事件开始读取。请参阅读取审计日志文件。
-
MySQL 客户端库现在包括一个
mysql_real_connect_dns_srv()C API 函数,它类似于mysql_real_connect()但使用 DNS SRV 记录来确定候选主机以建立与 MySQL 服务器的连接,而不是显式主机、端口和套接字参数。使用 C API 的应用程序可以直接调用新函数。另外修改mysql客户端程序,使用DNS SRV能力;它现在支持
--dns-srv-name优先于--host并导致连接基于 DNS SRV 记录的选项。请参阅 mysql_real_connect_dns_srv()。其他上下文中的连接建立不受影响,包括副本、 存储引擎和mysql
FEDERATED以外的客户端程序建立的连接。
在 Windows 上,Visual Studio 2019 Update 4 现在是 MySQL 编译的最低版本。(缺陷号 31655401)
服务器构建的 Boost 库的最低版本现在是 1.73.0。(缺陷号 31309800)
新的CMake选项指示是否与 . 如果启用,内置 、、 和 例程将被禁用。默认值为。 并且 是互斥的。(缺陷号 31785166)
WITH_TCMALLOC-ltcmallocmalloc()calloc()realloc()free()OFFWITH_TCMALLOCWITH_JEMALLOC新的CMake选项指示是否压缩二进制可执行文件的调试部分(仅限 Linux)。压缩可执行调试部分可以在构建过程中以额外的 CPU 时间为代价节省空间。默认值为 。如果未显式设置此选项但设置了环境变量,则该选项将从该变量中获取其值。(缺陷号 31498296)
COMPRESS_DEBUG_SECTIONSOFFCOMPRESS_DEBUG_SECTIONS删除 了CMake选项。(缺陷号 31122507)
WITH_DEFAULT_FEATURE_SET-
在实现网络命名空间支持的平台(例如 Linux)上,MySQL 现在可以为从客户端程序到 MySQL 服务器或 X 插件的 TCP/IP 连接配置网络命名空间:
在服务器端,
bind_address、admin_address和mysqlx_bind_address系统变量具有扩展语法,用于指定网络名称空间以用于给定的 IP 地址或主机名,用于侦听传入连接。对于客户端连接,mysql客户端和mysqlxtest测试套件客户端支持
--network-namespace指定网络命名空间的选项。对于从副本服务器到源服务器的复制连接,该
CHANGE MASTER TO语句支持NETWORK_NAMESPACE指定网络命名空间的选项。
出于复制监控目的,Performance Schema
replication_connection_configuration表、副本服务器连接元数据存储库(请参阅 复制元数据存储库)和SHOW REPLICA | SLAVE STATUS语句都有一个新列,用于显示连接的适用网络命名空间。有关更多信息,包括使用此功能必须满足的主机系统先决条件,请参阅 网络命名空间支持。
-
从 MySQL 8.0.22 开始,
group_replication_ip_whitelist系统变量被弃用,group_replication_ip_allowlist添加了系统变量来替代它。系统变量的工作方式与以前相同,只是术语发生了变化。对于这两个系统变量,默认值为
AUTOMATIC. 如果其中一个系统变量已设置为用户定义的值而另一个尚未设置,则使用更改后的值。如果两个系统变量都已设置为用户定义的值,group_replication_ip_allowlist则使用的值。 -
从 MySQL 8.0.22 开始,不推荐使用语句
START SLAVE、STOP SLAVE、和 。应改用以下别名:SHOW SLAVE STATUSSHOW SLAVE HOSTSRESET SLAVE而不是
START SLAVE使用START REPLICA而不是
STOP SLAVE使用STOP REPLICA而不是
SHOW SLAVE STATUS使用SHOW REPLICA STATUS而不是
SHOW SLAVE HOSTS使用SHOW REPLICAS而不是
RESET SLAVE使用RESET REPLICA
这些语句的工作方式与以前相同,只是每条语句使用的术语及其输出发生了变化。
添加了新的状态变量作为相关状态变量的别名。语句的旧版本和新版本都会更新这些状态变量的旧版本和新版本:
Com_slave_start相当于Com_replica_startCom_slave_stop相当于Com_replica_stopCom_show_slave_status相当于Com_show_replica_statusCom_show_slave_hosts相当于Com_show_replicas
InnoDB memcached 插件已弃用,在未来的 MySQL 版本中将删除对它的支持。
该
INFORMATION_SCHEMA.TABLESPACES表未使用。它现在已被弃用,并将在未来的 MySQL 版本中删除。其他INFORMATION_SCHEMA表可能会提供相关信息,如 INFORMATION_SCHEMA TABLESPACES 表中所述。
MySQL 企业版现在包含一个
keyring_oci插件,该插件使用 Oracle Cloud Infrastructure Vault 作为密钥环存储的后端。没有关键信息永久存储在 MySQL 服务器本地存储中。所有密钥都存储在 Oracle Cloud Infrastructure Vault 中,使该插件非常适合 Oracle Cloud Infrastructure MySQL 客户管理其 MySQL Enterprise Edition 密钥。有关详细信息,请参阅MySQL 密钥环。
-
重要变化: 准备好的语句现在只在执行时准备一次
PREPARE,而不是每次执行一次。此外,存储过程中的语句现在也仅在首次执行存储过程时准备一次。此更改增强了此类语句的性能,因为它避免了重复准备和准备结构回滚的额外成本,后者是几个错误的来源。作为这项工作的一部分,准备语句中使用的动态参数的解析方式发生了变化,由此导致的准备语句用例的变化如下所列:
准备语句中使用的参数在准备语句时确定其数据类型,并且该类型在语句的每次后续执行中保持不变,除非语句被重新准备( 有关何时可能发生这种情况的信息, 请参阅PREPARE 语句)。
对于 形式的准备语句,为参数传递一个整数值不再导致结果按 选择列表中的第 th 个 表达式排序;结果不再按 . 预期的那样排序。
SELECTexpr1,expr2, ... FROMtableORDER BY ?NNORDER BYconstant窗口函数
NTILE(NULL)、 、 和 ,其中 是负数,现在已被禁止,以符合 SQL 标准。NTH_VALUE(expr, NULL)LEAD(expr,nn)LAG(expr,nn)nn准备语句读取的用户变量现在在准备语句时确定其类型;该类型对于该语句的每次后续执行都保持不变。
由存储过程中的语句读取的用户变量现在在第一次执行该语句时确定其类型;该类型对于包含存储过程的所有后续调用都保持不变。
对于没有上下文信息可用于确定参数类型的参数,服务器假定参数是具有默认字符集的字符串,而不是二进制字符串。不正确的参数可以放在
CAST()表达式中。
请参阅PREPARE 语句,了解有关如何确定准备语句中使用的参数和用户变量的有效数据类型的规则。
此外,
N窗口函数LAG()、LEAD()和 的 rows ( ) 参数NTILE()现在必须是 到 范围内的整数1, 包括以下任何形式:263无符号整数常量文字
位置参数标记 (
?)用户定义的变量
存储例程中的局部变量
此外,不再允许此参数为
NULL. 有关详细信息,请参阅刚刚引用的函数的描述。(错误#48612,错误#99601,错误#100150,错误#105166,错误#11756670,错误#23599127,错误#31119132,错误#31365678,错误#31393719,错误#31592822,错误#318105374,错误#35) 该
filesort算法现在支持对多个表的连接进行排序,而不仅仅是单个表。(错误#31310238,错误#31559978,错误#31563876)-
使用 a 时
RIGHT JOIN,一些内部对象未按预期转换为适合与 a 一起使用的对象LEFT JOIN。其中包括一些在解析时构建的表列表,但它们的顺序没有颠倒。这需要维护代码来处理 aLEFT JOIN最初RIGHT JOIN作为特殊情况的实例,并且是几个错误的来源。现在服务器在解析时执行任何必要的反转,因此在解析之后, aRIGHT JOIN实际上在所有方面都是 aLEFT JOIN。(错误#30887665,错误#30964002)参考资料:另请参阅:Bug #12567331、Bug #21350125。
-
SELECT INTO DUMPFILE使用andSELECT INTO OUTFILE语句 写入文件时添加了对定期同步的支持。可以通过将select_into_disk_sync系统变量设置为启用此功能ON;使用服务器系统变量设置写入缓冲区 cn 的大小select_into_buffer_size;默认缓冲区大小为 131072 (2 17 ) 字节。也可以使用select_into_disk_sync_delay系统变量设置同步到磁盘后的可选延迟;默认行为是不允许任何延迟(即延迟时间为 0 毫秒)。有关详细信息,请参阅前面引用的系统变量的说明。
感谢 Facebook 对 MySQL 8.0 的贡献。(缺陷号 30284861)
-
MySQL 现在为符合条件的查询实现派生条件下推。这意味着,对于诸如 的查询 ,现在在许多情况下可以将外部 条件下推到派生表,在这种情况下会导致. 以前,如果派生表被具体化但未合并,MySQL 会具体化整个表(在本例中),然后使用条件限定行。
SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i >constantWHERESELECT * FROM (SELECT i, j FROM t1 WHERE i >constant) AS dtt1WHERE当派生表无法合并到外层查询时(例如,如果派生表使用聚合),将外部
WHERE条件下推到派生表可以减少需要处理的行数,这应该会提高查询的性能.当派生表不使用聚合或窗口函数时,可以将外部
WHERE条件直接下推到物化派生表。另外,当派生表有aGROUP BY且不使用窗口函数时,WHERE可以将外部条件作为条件下推到派生表HAVING。如果派生表使用窗口函数并且外部WHERE引用列在窗口函数的PARTITION子句中使用,则WHERE条件也可以下推。此优化不能用于包含
UNIONorLIMIT子句的派生表。要启用派生条件下推,必须将
optimizer_switch系统变量的derived_condition_pushdown标志(在此版本中添加)设置为on. 这是默认设置。如果此优化被优化器开关设置禁用,您可以使用DERIVED_CONDITION_PUSHDOWN优化器提示(也在本版本中添加)为特定查询启用它。使用NO_DERIVED_CONDITION_PUSHDOWN优化器提示禁用给定查询的优化。有关更多信息和示例,请参阅 派生条件下推优化。(错误#59870、错误#88381、错误#11766303、错误#27590273)
对于 RPM 和 Debian 包,客户端插件被移动到它们自己的客户端插件包中。(缺陷号 31584093)
由于与 Boost 的命名冲突, MySQL 源代码分发中 的
VERSION文件现在已命名。MYSQL_VERSION(缺陷号 31466846)对于使用 systemd 运行 MySQL 的平台,软件包不再包含遗留的 System V 文件: mysqld_multi.server和 mysql.server脚本,以及
mysql.server.1、mysqld_multi.1和mysqld_safe.1手册页。(缺陷号 31450888)
-
该
SHOW PROCESSLIST语句通过从所有活动线程收集线程数据来提供进程信息。但是,由于该实现在持有全局互斥体的同时从线程管理器内部遍历活动线程,因此会对性能产生负面影响,尤其是在繁忙的系统上。基于新的 Performance Schema表
SHOW PROCESSLIST,现在可以使用 替代实现。processlist此实现从性能模式而不是线程管理器查询活动线程数据,并且不需要互斥锁:要启用替代实现,请启用
performance_schema_show_processlist系统变量。的替代实现
SHOW PROCESSLIST也适用于 mysqladmin processlist命令。替代实现不适用于 MySQL 客户端/服务器协议的
INFORMATION_SCHEMAPROCESSLIST表或COM_PROCESS_INFO命令。为确保默认和替代实现产生相同的信息,必须满足某些配置要求;请参阅 进程列表表。
写入 MySQL 服务器错误日志的最新事件的 SQL 接口现在可以通过查询新的性能模式
error_log表获得。该表具有固定大小,必要时会自动丢弃旧事件以为新事件腾出空间。如果错误日志配置包含支持此功能的日志接收器组件(目前为传统格式log_sink_internal和 JSON 格式接收器log_sink_json),则会填充该表。几个新的状态变量提供有关error_log表操作的信息。请参阅 error_log 表。
-
这些更改是针对 LDAP 身份验证插件进行的:
对于 SASL LDAP 身份验证插件,
SCRAM-SHA-1身份验证方法在 SLES 12 和 15 以及 EL6 系统上不受支持。这些系统上的默认方法是 nowGSSAPI。如果未设置 LDAP 主机,则不会初始化 LDAP 连接池,这样可以在以前失败的情况下成功安装身份验证插件。(这可能是网站先安装插件,然后再配置的情况。)
如果在运行时更改了 LDAP 连接参数,则会为第一次后续身份验证尝试重新初始化 LDAP 连接池。
如果重新启动 LDAP 服务器,连接池中的现有连接将失效。LDAP 身份验证插件检测到这种情况并重新初始化连接池,并且(对于 SASL LDAP 插件)重新发送 SASL 质询。
(错误#31664270,错误#31219323)
-
解析器现在支持使用以下语法的带括号的查询表达式:
( query_expression ) [order_by_clause] [limit_clause] [into_clause]其他变化是可能的;请参阅 带括号的查询表达式 (缺陷号 30592703)
-
现在可以
YEAR使用CAST()函数或CONVERT()函数将其他类型的值转换为 。这些函数现在支持YEAR0-99 范围内的一位或两位数值,以及 1901-2155 范围内的四位数值。整数 0 转换为 Year 0;一个由一个或多个零组成的字符串(在可能的截断之后)被转换为 2000 年。转换将 2000 添加到 1-69 范围内的值(含),并将 1900 添加到 70-99 范围内的值(含)。以一位、两位或四位数字开头后跟至少一个非数字字符(可能还有其他数字或非数字字符)的字符串在转换为之前被截断
YEAR;在这种情况下,服务器会发出截断警告。浮点值在转换前四舍五入;CAST(1944.5 AS YEAR)由于舍入而返回 1945,CAST("1944.5" AS YEAR)由于截断而返回 1944(带有警告)。DATE、DATETIME和TIMESTAMP被转换为YEAR值的一部分。值TIME被转换为当前年份。不指定要转换为值的TIME值可能会产生与预期不同的结果;CAST("13:47" AS YEAR)由于字符串值被截断,返回 2013,并CAST(TIME "13:47" AS YEAR)返回截至此版本发布年份的 2020。不支持 将
GEOMETRY值转换 为。YEAR不兼容类型或超出范围或非法值的转换返回NULL。YEAR也可以用作JSON_VALUE()函数的返回类型。此函数仅支持四位数年份,否则遵循与适用于CAST()和CONVERT()执行转换为 时 相同的规则YEAR。有关详细信息,请参阅
CONVERT()功能说明。 -
选择
TIMESTAMP列值时,现在可以DATETIME在检索时将其从系统时区转换为 UTC,使用此版本AT TIME ZONE中为CAST()函数实现的运算符。语法是,其中 the是一个 ,而 the 是 or 之一。(对于说明符的第一种形式是可选的,不能与 一起使用。) 可以选择指定最多 6位 小数。
CAST(valueAT TIME ZONEspecifierAS DATETIME[(precision)])valueTIMESTAMPspecifier[INTERVAL] '+00:00''UTC'INTERVAL'UTC'precisionDATETIME还支持使用时区偏移量插入到表中的值。
AT TIME ZONE不能与 一起使用 ,也不能在 函数调用CONVERT()以外的任何其他上下文中使用。CAST()使用ARRAY时也不支持关键字和创建多值索引AT TIME ZONE。此处显示了一个简短示例:
mysql> SELECT @@system_time_zone; +--------------------+ | @@system_time_zone | +--------------------+ | EDT | +--------------------+ 1 row in set (0.00 sec) mysql> CREATE TABLE ex (ts TIMESTAMP); Query OK, 0 rows affected (0.81 sec) mysql> INSERT INTO ex VALUES > ROW(CURRENT_TIMESTAMP), > ROW('2020-07-31 21:44:30-08:00'); Query OK, 2 rows affected (0.09 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> TABLE ex; +---------------------+ | ts | +---------------------+ | 2020-07-28 21:39:31 | | 2020-08-01 01:44:30 | +---------------------+ 2 rows in set (0.00 sec) mysql> SELECT ts, CAST(ts AT TIME ZONE 'UTC' AS DATETIME) AS ut FROM ex; +---------------------+---------------------+ | ts | ut | +---------------------+---------------------+ | 2020-07-28 21:39:31 | 2020-07-29 01:39:31 | | 2020-08-01 01:44:30 | 2020-08-01 05:44:30 | +---------------------+---------------------+ 2 rows in set (0.00 sec)有关更多信息和示例,请参阅 MySQL 手册
CAST()中的函数 说明。
LOCK TABLES视图的特权检查得到改进。(缺陷号 31304432)您可以使用 MySQL Server 的新异步连接故障转移机制在从副本到其源的现有连接失败后自动建立到新源的异步(源到副本)复制连接。如果复制 I/O 线程由于源停止或网络故障而停止,则连接将故障转移。异步连接故障转移机制可用于使副本与共享数据的多个 MySQL 服务器或服务器组保持同步。为在通道语句 上设置
SOURCE_CONNECTION_AUTO_FAILOVER=1的 复制通道激活异步连接故障转移 ,并使用CHANGE MASTER TOasynchronous_connection_failover_add_source和asynchronous_connection_failover_delete_source功能。-
新
innodb_extend_and_initialize变量允许配置如何InnoDB在 Linux 上为 file-per-table 和通用表空间分配空间。默认情况下,当操作需要表空间中的额外空间时,InnoDB将页面分配给表空间并将 NULL 物理写入这些页面。如果频繁分配新页面,此行为会影响性能。从 MySQL 8.0.22 开始,您可以innodb_extend_and_initialize在 Linux 系统上禁用以避免将 NULL 物理写入新分配的表空间页面。innodb_extend_and_initialize禁用时,将使用调用分配空间 ,posix_fallocate()这会保留空间而无需实际写入 NULL。操作不是原子的
posix_fallocate(),这使得在为表空间文件分配空间和更新文件元数据之间可能发生失败。这种故障会使新分配的页面处于未初始化状态,从而导致在InnoDB尝试访问这些页面时失败。为了防止这种情况,InnoDB在分配新的表空间页面之前写入重做日志记录。如果页面分配操作被中断,则在恢复期间从重做日志记录中重播该操作。 -
为了允许对 MySQL 授权表进行并发 DML 和 DDL 操作,以前在 MySQL 授权表上获取行锁的读取操作现在作为非锁定读取执行。现在在 MySQL 授权表上作为非锁定读取执行的操作包括:
SELECT语句和其他只读语句,它们通过连接列表和子查询从授权表中读取数据,包括SELECT ... FOR SHARE使用任何事务隔离级别的语句。使用任何事务隔离级别从授权表(通过连接列表或子查询)读取数据但不修改它们的 DML 操作。
如果在使用基于语句的复制时执行,从授权表读取数据时不再获取行锁的语句会报告警告。
使用 -
binlog_format=mixed时,从授权表读取数据的 DML 操作现在作为行事件写入二进制日志,以使操作对于混合模式复制是安全的。SELECT ... FOR SHARE从授权表中读取数据的语句现在会报告警告。使用该FOR SHARE子句,授权表不支持读锁。从授权表读取数据并使用
SERIALIZABLE隔离级别执行的 DML 操作现在会报告警告。SERIALIZABLE授权表不支持 通常在使用隔离级别时获取的读取锁 。 -
该
ALTER DATABASE语句现在支持一个READ ONLY选项,该选项控制是否允许修改数据库和其中的对象。此选项对于数据库迁移很有用,因为READ ONLY可以将启用的数据库迁移到另一个 MySQL 实例,而无需担心数据库在操作过程中可能会发生更改。请参见 ALTER DATABASE 语句。INFORMATION_SCHEMA名为SCHEMATA_EXTENSIONS显示数据库选项 的新表。目前,它显示READ ONLY=1为只读数据库。请参阅 INFORMATION_SCHEMA SCHEMATA_EXTENSIONS 表。
InnoDB: 删除了与直方图采样的事务支持相关的代码,包括导致测试失败的相关断言代码。直方图抽样不需要事务支持。(缺陷号 31787736)
InnoDB: 没有为重做日志存档日志编写器线程写入操作设置加密信息。(缺陷号 31690196)
InnoDB: 该
TTASEventMutex::exit功能针对 ARM64 进行了优化。感谢 Krunal Bauskar 的贡献。(漏洞 #31589019,漏洞 #100132)InnoDB:
InnoDB无法在DISABLE_PSI_RWLOCK启用 CMake 选项的情况下进行编译。(缺陷号 31578289)InnoDB:为直方图采样 设置为以避免不必要的旧记录版本查找的事务隔离级别
READ UNCOMMITTED在采样操作完成后未重置。(缺陷号 31564407)-
InnoDB: 更新内部临时表的聚集索引的查询返回了不正确的结果。聚集索引的修改页面未添加到刷新列表中,导致在修改页面从缓冲池中逐出时丢失更改。(缺陷号 31560679)
参考:这个问题是 Bug #29207450 的回归。
InnoDB: 删除了对为 TempTable 存储引擎定义的 Boost 库的构建依赖性。(缺陷号 31505048)
InnoDB: 实施了一个解决方法来处理 32 位构建中的 Clang 编译器问题,该问题导致
ATOMIC_LLONG_LOCK_FREE值被定义为 “有时无锁”,同时__atomic_always_lock_free在同一平台上为同一类型返回 true。(缺陷号 31504609)InnoDB:在早期版本的 MySQL 中创建 的
REDUNDANT行格式表,其中行格式未明确定义,允许添加超过REDUNDANT行格式索引列大小限制的索引。(错误#31479542,错误#99791)InnoDB: 对使用多值索引定义的列的 DML 操作导致失败。(缺陷号 31479282)
InnoDB: 主密钥轮换期间发生故障。撤消表空间内存对象过早释放。(缺陷号 31467626)
InnoDB: 未使用的物理预读代码已从并行读取接口中删除。(缺陷号 31429385)
InnoDB: 主键轮换操作未能跳过已被截断的撤消表空间,这导致关闭服务器时断言失败。(缺陷号 31400195)
InnoDB: 为页面压缩表导入表空间后,页面不再压缩,
INFORMATION_SCHEMA.INNODB_TABLESPACES元数据错误地指示页面被压缩。表的压缩信息在导入操作期间不可用。(缺陷号 31396947)InnoDB: 执行即时 DDL 操作后的回滚和更新操作引发断言。(缺陷号 31391126)
InnoDB: 日志系统 (
log_sys) 分片读写锁导致 CPU 绑定工作负载的性能下降。(缺陷号 31389135)InnoDB:
UNIV_ENCRYPT_DEBUG使用启用 的选项编译(缺陷号 31369540)InnoDB: 分区表上的 DDL 操作可能会导致失败。
TABLE_SHARE并且不必要地为所有分区打开了表实例对象。(缺陷号 31365127)InnoDB:在就地
VARCHAR列排序规则从 更改为utf8mb4并 在同一列上添加索引后,对该列的区分大小写的查询 返回了不正确的结果。列 排序规则在数据字典中更改,但在内存表对象中未更改。因此,在该列上创建的索引使用了陈旧的列信息,导致比较使用先前定义的排序规则。(缺陷号 31361838)utf8mb4_binALTER TABLEVARCHARVARCHARVARCHARInnoDB:
ALTER TABLE ... IMPORT TABLESPACE对大型加密和压缩表 的错误读取后失败。解密操作未使用加密期间使用的加密块大小。另外,加密过程不考虑压缩长度,而解密过程只根据压缩长度对数据进行解密。(缺陷号 31313533)InnoDB: 并发更新操作期间发生故障。失败是由于先前的记录值无效。(漏洞 #31205266,漏洞 #99286)
InnoDB: 在一个实例上从 MySQL 5.7 升级到 MySQL 8.0 失败,该实例具有在通用表空间中创建并使用
FULLTEXT索引定义的表。无法确定表的正确数据字典空间 ID。(漏洞 #31154128,漏洞 #99211)InnoDB: 用于处理
SHOW ENGINE INNODB MUTEX语句的函数与同时添加新互斥锁的其他线程的隔离不够充分。(缺陷号 31105262)InnoDB: 未能调用缓冲池页面 I/O 完成例程导致孤立缓冲池 I/O 写入页面。(缺陷号 31073853)
InnoDB: 缓冲池刷新列表尾部的许多系统临时表页面导致性能下降。
flush_list_mutex当刷新列表扫描遍历系统临时表页面时,将举行。 刷新列表扫描现在排除系统临时表页面。(漏洞 #31060470,漏洞 #98974)InnoDB: 缓冲区控制块结构 (
buf_block_t) 被释放,同时减少了缓冲池的大小,导致断言失败。此 bug 的修复还向后移植了 Bug #20735882 / Bug #76343 修复的重要方面,并用函数替换了内部buf_block_is_uncompressed()函数buf_pointer_is_block_field_instance()。该buf_block_is_uncompressed()函数在太多情况下返回 false,影响 OLTP 查询吞吐量。(错误#31036301,错误#31389823)InnoDB: 并行读取线程无法响应显式事务中断。(缺陷号 31016076)
-
InnoDB: 在以 开始的会话中
START TRANSACTION WITH CONSISTENT SNAPSHOT,范围查询返回了截断的结果。结束范围标志未在索引读取开始时重置,导致读取中止和丢失行。(漏洞 #30950714,漏洞 #98642)参考资料:此问题是 Bug #23481444 的回归。
-
InnoDB: 全文短语搜索引发断言失败。感谢 TXSQL(腾讯 MySQL)的贡献。(错误#30933728,错误#31228694)
参考资料:此问题是 Bug #22709692 的回归。
InnoDB: 尝试在原始磁盘分区上初始化系统表空间时发生故障。此外,
INPLACE对原始磁盘分区表空间的 DDL 操作因错误而失败,而不是切换到COPY算法。(缺陷 #30867065,缺陷 #98091)InnoDB: LOB 清除代码 (
lob::purge()) 没有正确处理在 B-tree mini-transaction (btr_mtr) 提交和恢复操作期间获取的闩锁,这可能导致 B-tree 和 LOB mini-transactions 之间发生冲突。(缺陷号 30620011)InnoDB: 对大型表进行的长时间运行的统计计算操作阻塞了需要访问表统计信息的其他操作,导致这些操作失败。引入了一个新的统计计算互斥量,它允许并发访问表统计信息。感谢 Kamil Holubicki 的贡献。(缺陷号 30607708)
InnoDB: 两个连接尝试使用相同的事务处理程序对象,导致查询停止。(缺陷号 30594501)
InnoDB: 关闭
innodb_fast_shutdown设置大于 0 的服务器会引发断言失败。该断言是由尚未回滚的已恢复事务的存在引起的。修改了断言代码以在快速关闭期间忽略恢复的事务。当快速关闭留下未回滚的恢复事务时,消息现在写入错误日志。缓慢关闭现在等待恢复的事务回滚。实施了各种其他关机逻辑改进。(缺陷号 30226841)InnoDB: MySQL 8.0.11 中引入的专用日志写入线程导致低并发系统上的 CPU 绑定性能回归。为了解决这个问题,新的
innodb_log_writer_threads变量允许禁用专用日志写入器线程,以便每个用户线程将重做日志记录从日志缓冲区写入系统缓冲区并从系统缓冲区刷新到重做日志文件,这是引入专用日志写入器之前的行为线程。实施了其他重做日志优化,包括删除浪费 CPU 时间的不必要的日志关闭线程,以及优化以补救过于激进的检查点活动和过多的刷新调用。此修复解决的问题还表现为LOAD DATA性能下降。(错误#30088404,错误#30003849)InnoDB:
lower_case_table_names在失败导致挂起情况后 重新启动具有不正确设置的服务器 启动时,InnoDB等待一个事务回滚,但是设置错误导致启动验证失败,回滚线程没有启动lower_case_table_names。(漏洞#29833945)复制: 如果在建立新的 X 协议连接之后但在创建会话之前发出组复制通知,则 X 插件可能会意外停止。处理组复制通知的调度程序线程现在检查会话指针是否有效。(缺陷号 31742798)
复制: 改进了组复制在添加事务写入集时对内存分配问题的处理。(缺陷号 31586243)
复制: 您现在可以
gtid_purged在存储过程中设置系统变量的值,这在以前是不允许的。您不能gtid_purged在存储功能中设置。(缺陷号 31571427)-
复制:
gtid_executed在分布式恢复期间,在加入成员上进行远程克隆过程时,Group Replication在识别已应用于所有成员的公共事务集时 考虑了加入成员的预克隆这意味着从组的认证信息集中(显示为count_transactions_rows_validating性能模式表中的字段)replication_group_member_stats) 在远程克隆过程中没有发生。如果远程克隆过程花费了很长时间,那么在远程克隆过程后重新启动时,认证信息可能会变得太大而无法传输给加入的成员,在这种情况下会引发错误并且该成员无法加入该组.为避免此问题,Group Replication 现在
ONLINE在识别已应用于所有成员的通用事务集时仅考虑具有状态的组成员。当加入成员ONLINE在分布式恢复后进入状态时,其认证信息将更新为成员加入时捐赠者的认证信息,并在以后的回合中为此进行垃圾收集。作为早期版本中此问题的解决方法,远程克隆操作完成后,等待两分钟以允许进行一轮垃圾收集以减少组认证信息的大小。然后在加入成员上发出以下声明,使其停止尝试应用前一组认证信息:
RESET SLAVE FOR CHANNEL group_replication_recovery;(错误#31446381,错误#99778)
复制: 由于通信错误而离开群组的群组成员可能会在自动重新加入尝试之间重新连接,而自动重新加入过程仍在进行中,这导致群组复制无法在该成员上运行。Group Replication 的错误管理和成员状态处理现已更正,以防止出现这种情况。(缺陷号 31401797)
复制: 当复制源服务器关闭并重新启动时,其
MEMORY表变为空。为了将这种效果复制到副本,源MEMORY在启动后第一次使用给定表时,它会记录一个事件,通知副本必须通过将语句写入二进制日志来清空该表。以前,这是一个DELETE声明,但现在是一个TRUNCATE TABLE声明。副本服务器在关闭和重新启动时也会将此语句写入自己的二进制日志。该语句始终以语句格式记录,即使二进制日志记录格式设置为ROW,即使read_only或super_read_only模式在服务器上设置。(缺陷 #29848785,缺陷 #95496)复制: 当系统变量
session_track_gtids设置为OWN_GTID多线程副本时,副本的性能会随着时间的推移而下降并开始落后于主服务器。原因是副本的工作线程在每次事务提交时记录的 GTID 累积,这增加了工作线程插入新线程所花费的时间。现在对多线程副本上的工作线程禁用会话状态跟踪。感谢 Facebook 的贡献。(缺陷 #29049207,缺陷 #92964)复制: 使用基于行的复制时,允许副本在搜索要同步的行时使用不可见索引。(缺陷 #96148,缺陷 #30072179)
Microsoft Windows: 在 Windows 上,如果构建位于文件系统根目录(例如
R:/. (缺陷号 31315467)JSON:
JSON_OBJECT()并不总是对NULL值执行正确的检查。(缺陷号 31393934)新的CMake选项(如果启用)会为使用 systemd 运行 MySQL 的平台生成额外的 systemd 调试信息。默认值为。(缺陷号 31788834)
WITH_SYSTEMD_DEBUGOFF-
对于 RPM 和 Debian 包,客户端插件已从 MySQL 8.0.21 中的服务器包移动到客户端包。从 5.7 包升级到 8.0 包时,这可能会导致与 LDAP 身份验证插件相关的故障。已对包装进行调整以避免此问题。(缺陷号 31782612)
参考资料:此问题是 Bug #31123564、Bug #31336340 的回归。
tsJSON 格式错误日志接收器为密钥 写入的log_sink_json时间戳与同一日志消息中的其他时间戳的值不同。(缺陷号 31749103)SASL LDAP 身份验证插件的 Kerberos 身份验证错误地处理了获取票证授予票证的失败。(缺陷号 31727195)
对于某些第三方库,启用链接时优化会导致构建失败。(漏洞 #31701553,漏洞 #100410)
打印过长的诊断消息可能会导致服务器意外退出。(缺陷号 31686926)
页面压缩表被克隆为未压缩表。包含压缩标志的关联表空间对象在克隆操作之前未初始化。(错误#31677990,错误#100243)
LDAP 身份验证成功的某些情况可能会导致服务器挂起。(缺陷号 31661437)
在将分组查询转换为派生表期间,当
WHERE子句和HAVING子句成为派生表的一部分时,不会为派生表更新条件计数。这导致在创建ref访问密钥时减少内存分配。(缺陷号 31661309)LIKE当使用未定义为 MySQL 字符串类型之一的表列 比较值时,服务器有时不会引发预期的错误。(缺陷号 31659015)服务函数在
acquire_related()某些情况下应该返回错误时返回默认服务。(错误号 31655906)在引导模式下,某些多语句事务可能会导致意外的服务器行为。(缺陷号 31650096)
远程克隆操作检查了先前从捐赠者实例中删除的接受者上插件的可用性。尚未发布对已卸载插件的引用。还解决了与插件不匹配和可用性相关的错误报告问题。(错误#31639732,错误#100244)
MySQL Server Docker 映像未公开组复制推荐端口 (33061)。(缺陷号 31627536)
-
在调试版本中,服务器尝试在创建视图时评估子查询。(缺陷号 31590301)
参考资料:此问题是 Bug #25466100 的回归。
RAND()即使在安全的情况下,也没有下推 条件 using ,即没有窗口功能或GROUP BY正在使用时。(缺陷号 31587575)-
在将条件下推到派生表时,常量条件如
WHERE FALSEorWHERE TRUE被下推到派生表中的第一个表,这是不必要的,因为条件与派生表无关。MySQL 现在避免在这种情况下将常量条件下推到派生表。此外,使用的表现在针对需要下推到派生表的条件进行了更新,代码检查显示在用派生表表达式替换条件中的列后没有这样做。(缺陷号 31587493)
-
使用的查询有时会触发范围优化器中的断言。(缺陷号 31586906)
WHEREcolumn> (... IN (SELECT ...))参考:这个问题是 Bug #30473261 的回归。
如果在检查行是否存在和执行插入之间的间隔内插入一行,并且并发更新统计表, 则可能
ANALYZE TABLE会失败并返回Duplicate key 错误。ANALYZE TABLE现在忽略这种情况下的错误。(缺陷号 31582758)-
范围优化器在克隆执行合并扫描所需的处理程序后没有使用正确的锁类型,而是无条件地使用读锁。这导致了不同场景的各种不同副作用。
例如,
SELECTwithFOR UPDATE请求写锁,但在为索引合并扫描克隆处理程序后,范围优化器请求读锁,导致不匹配。类似地,对于数据字典表,锁定类型设置为LOCK_NONE由于此类表所需的特殊处理。为防止出现此问题,我们现在确保在克隆的处理程序中也始终使用处理程序的原始锁类型。(缺陷号 31582383)
在某些情况下,启用优化器开关后,使用子查询的
ANY查询会给出不正确的结果 。subquery_to_derived(缺陷号 31566339)当简化为 时,为 分配的临时表资源并不总是在之后释放。(缺陷号 31565009)
FALSE ANDconditionFALSEcondition等于的值
ULLONG_MAX可以插入到BIT(64)列中,但不能检索。(错误#31564742,错误#100053)-
删除未使用的窗口定义时,
ORDER BY未删除属于 的子查询。然后优化器尝试在不锁定表的情况下优化子查询。现在,当删除未使用的窗口定义时,服务器会清除作为定义一部分存在的任何子查询。(缺陷号 31518806)参考:这个问题是 Bug #27062031 的回归。
-
MySQL 8.0.20 中引入的编码问题可能会导致客户端应用程序在关闭期间意外退出。(缺陷号 31515752)
参考资料:此问题是 Bug #27045306 的回归。
添加了从 ICU U_REGEX_NUMBER_TOO_BIG到 MySQL 的缺失错误代码转换
ER_REGEX_NUMBER_TOO_BIG。(缺陷号 31514995)在操作期间合并
filesort可能无法删除使用的查询的重复项DISTINCT。(缺陷 #31498664,缺陷 #99900)MySQL 的内部
DYNAMIC_STRING类以前以线性方式分配内存,即按预定的字节数分配。该类已被修改,现在它以指数方式分配内存,这应该使重复字符串追加等操作更有效率。(缺陷号 31491799)LOCK_mutex处理不当可能会导致内存泄漏。(漏洞#31491146)未添加新添加的排序规则,可能导致关机时意外退出。(缺陷号 31470422)
在 Windows 上,
GetTempFileName()函数重用文件名可能会引发断言。(缺陷号 31468590)子
LATERAL查询被错误地转换为反连接。(缺陷号 31465717)NATURAL JOIN评估可能会无意中匹配由功能索引创建的隐藏虚拟列。(缺陷 #31463511,缺陷 #99807)服务器未正确处理使用超过 1024 字节的字符串散列连接键的排序键。(缺陷号 31437753)
服务器尝试从一个视图中删除其定义包含
HAVING在该HAVING子句为常量且被评估为 true 的视图,即使HAVING作为其定义一部分的视图不应更新。(缺陷号 31429865)未正确检查
INFORMATION_SCHEMA.USER_ATTRIBUTES表的权限要求。(缺陷号 31427410)当内部函数
replace_index_subquery()失败时,服务器仍会尝试为受影响的子查询创建迭代器。现在该函数会引发一个明显的错误。(缺陷号 31427072)未正确处理 使用的查询。(缺陷号 31425664)
WHERE NOT EXISTS (SELECTconstFROMtableWHEREcolumn=FROM_UNIXTIME(value)在某些情况下,
key_hint对派生表和内部临时表的处理不当。(缺陷号 31424455)对于通过视图插入,准备好的语句的重新执行
INSERT可能会失败。(缺陷号 31417951)JSON标量评估可能会进入无限循环。(缺陷号 31406724)表行中的
user_attributes列mysql.user可能会受到部分撤销的错误影响。(缺陷号 31405985)不正确的窗口函数初始化可能导致服务器退出。(错误#31389573,错误#31437834)
在 SQL 语句中检索时,敏感的 LDAP 身份验证插件系统变量现在显示为星号。(错误#31388444,错误#31391864)
mysql-test-run.pl在无线程连接处理下的测试由于不正确的资源组初始化而在 ASAN 构建中失败。这已得到修复。感谢腾讯科技王晓宇的投稿。(漏洞 #31378900,漏洞 #99609)
将
authentication_ldap_simple身份验证插件与 SSL 一起使用可能会在关闭期间导致分段错误。(缺陷号 31364927)终止查询可能会在散列连接迭代器中引发虚假断言。(缺陷号 31361354)
LATERAL在某些情况下,未按预期标记为只读 的外部引用 。(缺陷号 31359965)由于对孤立事件(数据库不再存在的事件)的引用无效,从 MySQL 5.7 升级到 MySQL 8.0 时发生故障。当升级过程中遇到孤立事件时,服务器现在会失败并显示相应的错误消息。还修改了孤立存储例程的错误消息。(缺陷号 31335554)
启用
create_admin_listener_thread系统变量可能会导致服务器在启动期间退出。(缺陷号 31335279)在
ALTER TABLE将表达式默认值添加到列之后,第一个插入插入了一个值,就好像该表达式是在更改时间而不是插入时间计算的。(漏洞 #31330789,漏洞 #99513)LDAP 身份验证插件没有正确地将用户提供的身份验证方法与允许的方法进行比较。(缺陷号 31320532)
某些视图可能会导致以下
USE语句导致服务器意外退出。(缺陷号 31311312)当文件排序对缓冲区进行排序并
LIMIT处于活动状态时,它首先对所有行进行排序,然后丢弃那些不符合限制的行,这需要对以后肯定会丢弃的许多行进行排序。现在优化器只对实际需要的行进行排序。内部测试表明,此更改可以将简单字符串排序基准(由 衡量EXPLAIN ANALYZE)的排序阶段加速高达 15%。(缺陷号 31303537)-
动态范围扫描为从连接中第一个表中提取的每一行运行范围优化器,以确定是否可以使用该行中的可用值为第二个表选择范围扫描。如果该行不包含可用索引,则可以选择表扫描。对于导致此问题的查询,选择了一次表扫描,然后是对非覆盖索引的范围扫描,动态范围迭代器有两个读取集,用于这两种情况。其中之一用于表扫描,包括处理查询所需的生成列的基列;另一个读取集不包括用于范围扫描的读取集中的基列。这是因为,对于覆盖索引,读取集不应包含基列,以避免通过散列连接或批量密钥访问添加不需要的列。出现此问题是因为第二个读取集也用于非覆盖索引,这导致断言。
为防止这种情况发生,在动态范围迭代器中初始化表读取集时,我们现在确保在范围优化器选择非覆盖索引时它包含基列。(缺陷号 31280526)
参考资料:此问题是 Bug #30417361 的回归。
TIMESTAMP如果 a 包含时区偏移量,则可 以为 a 插入超出范围的值 。(缺陷号 31239157)密钥环
keyring_hashicorp插件没有限制密钥操作的密钥大小。(缺陷号 31205715)-DWITH_ZSTD=system为旧版本的zstd库 配置 失败。CMake现在检查zstd版本并要求至少 1.0.0 用于编译,1.2.0 用于运行压缩检查。(漏洞 #31174920,漏洞 #99241)在某些情况下,
SELECT未正确处理从 Performance Schema 表中获取状态变量信息并按包含时间值的列进行排序的 a。(缺陷号 31168097)-
在某些情况下,
ROUND()并TRUNCATE()没有按预期返回第一个参数的数据类型。此修复确保这些函数的返回类型遵循这些规则,其中第一个参数是所示类型:有关详细信息,请参阅
ROUND()功能说明。(缺陷号 31128028) SELECT ... FOR SHARE声明现在只需要 权限SELECT。以前,该SELECT权限至少需要DELETE、LOCK TABLES或UPDATE权限之一。(漏洞 #31096384,漏洞 #99101)选择了半连接策略来连接具有
LIMIT子句并需要第一行以外的行的相关子查询,这导致该LIMIT子句被忽略并返回无效行。现在,当LIMIT与这种类型的连接一起使用时指定第一行以外的一行或多行时,不再采用半连接策略。(缺陷号 31096309)-
在修复 Bug #81009 后,截断性能模式表的权限检查在 启用
read_only或super_read_only启用时过于严格,导致截断失败,即使对于具有适当表权限的用户也是如此。(漏洞 #31080309,漏洞 #99072)参考资料:这个问题是 Bug #81009 的回归。
ORDER BYROLLUP对于还使用了窗口函数的查询,没有按预期工作。(缺陷号 31073133)某些
INSERT语句未正确处理。(缺陷号 31072198)日期间隔计算检查溢出但不检查下溢。现在他们检查两者。(缺陷号 31054071)
如果 XA 准备好的事务回滚 XID 格式不正确,事务将保持恢复状态
XA COMMIT并XA ROLLBACK声明(或为调试构建提出断言)而不是报告错误。(缺陷号 31030205)对于包含通配符的数据库名称,通过角色继承的数据库级权限未得到正确处理。(漏洞 #31013538,漏洞 #98876)
当
--local给出该选项时,mysqlimport错误处理了该MYSQL_OPT_LOAD_DATA_LOCAL_DIR选项,mysql_options()因此它没有任何效果。(缺陷号 31001550)某些准备好的语句可能会导致服务器意外退出。(缺陷号 30943963)
OPTIMIZE TABLEforMyISAMtables 可能导致表大小增加和查询性能降低。REPAIR TABLEforMyISAMtables 可能导致Table is already up to dateprevious 产生的状态OPTIMIZE TABLE丢失。(错误#30869674,错误#98511,错误#29755517)mysqlpump对象验证包括排除数据库中的对象。(缺陷号 30819012)
-
插入一个
TIMESTAMP具有时区偏移量且月、日或两者均为零的值会导致断言。无论设置如何,这样的值应该并且现在已被拒绝sql_mode。(缺陷号 30786762)参考资料:另请参阅:Bug #31239157。
使用角色授予的权限可能在列权限级别处理不当。(漏洞 #30660403,漏洞 #97971)
-
TIME在某些情况下,将某个值与 某个值进行 比较会NULL提出一个断言。(缺陷号 30324587)参考:这个问题是 Bug #25949639 的回归。
LDAP 身份验证插件错误地执行了 CA 验证,这可能导致使用不正确的 CA。(缺陷号 30220357)
ORDER BYsort_buffer_size当和max_sort_length被设置为导致每个排序缓冲区允许的最大键数的内部限制被设置为 0 的值时,查询未正确执行。(缺陷 #30175483)全文搜索查询中的大量嵌套参数导致错误。(缺陷号 29929684)
Performance Schema 对内存使用的潜在错误报告已得到纠正。(漏洞#29912403)
当
explicit_defaults_for_timestamp被禁用并且 aNULL被插入到声明为 的生成列中 时,服务器将尝试将插入的值转换为。这样的插入现在被拒绝了 。(漏洞#29449518)TIMESTAMPNOT NULLCURRENT_TIMESTAMPER_BAD_NULL_ERROR该
SET_VAR提示不接受指定为系统变量设置的浮点值。(漏洞#29349748)以前, when
NULL被用作 的格式参数STR_TO_DATE(),会打印不相关的警告。现在,当NULL传递给它时,函数返回NULL。(漏洞 #27265863)在某些情况下,不正确的使用会
IS NULL生成多个关于无效参数的警告。(漏洞#27264652)在执行某些准备好的语句时,无法正确解析
ORDER BY引用SELECT派生表中的列表列的列。(缺陷号 26808862)在条件中引用生成的列
EXPLAIN的多表UPDATE语句上使用时,输出始终显示包含此列的表正在更新,无论该表是否实际更新。(缺陷号 22671310)当 SQL 层将不正确的信息传递给
InnoDB有关要在临时表上执行的操作类型时,可能会引发断言。(漏洞 #22503696)-
此构造适用于基表,以使用所有默认值插入一行,但对视图无效:
INSERT INTO name () VALUES ();(错误#15988466,错误#67863)
在某些情况下,当在索引提示中使用不可见索引时,即使
use_invisible_indexes优化器开关未设置为,服务器也会发出错误OFF。(缺陷 #100024,缺陷 #31550839)正则表达式函数例如
REGEXP_LIKE()产生与二进制字符串参数不一致的结果。这些函数现在拒绝带有错误的二进制字符串。(错误#98950、错误#98951、错误#31031886、错误#31031888)-
当谓词中指定的范围值与值所比较的列的数据类型不兼容时,范围优化器会舍入范围值并分配某些标志,这样它就不会排除符合范围的行,因为四舍五入。在触发报告问题的特定查询中, 使用 测试名为
idtype的列,测试的值四舍五入为整数,因此谓词被视为。然后优化器将其视为间隔和INTid NOT IN (-0.1, 0.1)NOT IN (0,0)id < 00 < id < 0, 但在这种情况下,它还将一个标志设置为一个值,该值指示读取应从包含 0 的行开始,以作为要比较的值。现在在这种情况下,标志的设置方式可以正确处理四舍五入的值。(缺陷 #98826,缺陷 #30988735)参考资料:此问题是 Bug #80244、Bug #22661012 的回归。
对于基于具有可更新部分和不可更新部分的连接的视图,尝试更新此视图的不可更新列时生成的错误消息引用了源表或视图,而不是在有问题的
UPDATE语句中实际命名的视图. (缺陷 #80655,缺陷 #22891840)