MySQL8.0.30已经正式GA好几天了,为大家翻译一下release note。由于内容比较长,部分内容机器翻译。重点内容有校对。
主要变化
字符集支持
编译说明
过期和移除说明
生成隐藏主键(GIPKs)
密钥说明
可插拔身份验证
安全说明
空间数据支持
SQL语法说明
XA事说明
功能添加或更改
Bugs修复
字符集支持
重要变化 之前的变化是将过期tf8_前缀改为utf8mb3_。在这个版本中,我们使用 utf8mb3_ 前缀重命名了utf8_ 排序规则;这是为了使排序规则名称与字符集的名称保持一致,不再依赖已弃用的排序规则名称,并澄清 utf8mb3 和 utf8mb4 之间的区别。使用 utf8mb3_ 前缀的名称现在专门用于 SHOW 语句(如 SHOW CREATE TABLE)的输出中的这些排序规则,以及在Information Schema库中表的(包括 COLLATIONS 和 COLUMNS 表)列值显示。(Bug#33787300)
参考: 另见: Bug #30624990.
重要变化 当不止一种语言具有相同的排序规则定义时,MySQL 只为其中一种语言实现排序规则。这意味着某些语言仅由特定于其他语言的 utf8mb4 Unicode 9.0 排序规则覆盖。此版本为以前仅由其他语言的排序规则覆盖的语言添加排序规则来解决此类问题。此处列出了新的排序规则:
Norwegian
(Bokmål) utf8mb4_nb_0900_ai_ci
(Bokmål) utf8mb4_nb_0900_as_cs
(Nynorsk) utf8mb4_nn_0900_ai_ci
(Nynorsk) utf8mb4_nn_0900_as_cs
Serbian with Latin characters:
utf8mb4_sr_latn_0900_ai_ci
utf8mb4_sr_latn_0900_as_cs
Bosnian with Latin characters:
utf8mb4_bs_0900_ai_ci
utf8mb4_bs_0900_as_cs
Bulgarian:
utf8mb4_bg_0900_ai_ci
utf8mb4_bg_0900_as_cs
Galician:
utf8mb4_gl_0900_ai_ci
utf8mb4_gl_0900_as_cs
Mongolian with Cyrillic letters:
utf8mb4_mn_cyrl_0900_ai_ci
utf8mb4_mn_cyrl_0900_as_cs
更多信息,参考 Language-Specific Collations. (Bug #31885256)
编译说明
在 Enterprise Linux 上, 修复了 ADD_LINUX_RPM_FLAGS 以便在修改之前使用 CMAKE_C_FLAGS 和CMAKE_CXX_FLAGS 的初始值。
参考: 这个问题是回归: Bug #33730302.
添加了一个新 的SHOW_SUPPRESSED_COMPILER_WARNINGS CMake 选项。启用它以显示抑制的编译器警告,并且不会因 -Werror 而失败。它默认为关闭。
在 Windows 上,使用 /wd4996 命令行选项全局禁用弃用警告 (C4996);现在在适当的地方禁用弃用警告。(Bug #33975638)
改进了对 GCC 8 的支持以include -lstdc++fs 以使用 std::filesystem。(Bug #33939798)
弃用和移除声明
复制 将replica_parallel_workers 系统变量(或等效的服务器选项--replica-parallel-workers)设置为0现在已弃用,现在这样做会引发警告。
为了达到同样的效果(即利用单线程)而不警告,设置 replica_parallel_workers=1 代替。
--skip-host-cache系统选项弃用了,将在未来的版本移除。
请改用 SET GLOBAL host_cache_size = 0 之类的语句,或在 my.cnf 文件中设置 host_cache_size。
--old-style-user-limits 选项使服务器强制执行 MySQL 5.0.3 之前的用户限制,旨在向后兼容非常旧的版本。此选项现已弃用,现在使用它会引发警告。您应该期望在 MySQL 的未来版本中删除此选项,因此建议您现在开始删除您的 MySQL 应用程序可能对该选项的任何依赖关系。
生成隐藏主键
MySQL 8.0.30 现在支持 GIPK 模式,这会导致将生成的隐藏主键 (GIPK) 添加到任何没有显式主键的情况下创建的 InnoDB 表中。此增强仅适用于 InnoDB 表。
通过 GIPK 模式添加到 InnoDB 表的生成键列的定义如下所示:
my_row_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT INVISIBLE PRIMARY KEY
生成的主键名称始终为 my_row_id;在 GIPK 模式生效时,您不能将其用作创建新 InnoDB 表的 CREATE TABLE 语句中的列名,除非它包含显式主键。
默认情况下不启用 GIPK。要启用它们,请将 sql_generate_invisible_primary_key 服务器系统变量(也在此版本中引入)设置为 ON。此设置对复制应用线程没有影响;这意味着副本永远不会为未在源上使用主键创建的复制表生成主键。
当 GIPK 生效时,您不能更改生成的不可见主键,但有一个例外:你可以使用如下语句切换隐藏主键的可见性:
ALTER TABLE tbl CHANGE COLUMN my_row_id SET VISIBLE;
ALTER TABLE tbl CHANGE COLUMN my_row_id SET INVISIBLE;
默认情况下,生成的不可见主键可以在 SHOW CREATE TABLE 和 SHOW INDEX 的输出中看到;它们在 MySQL Information Schema 表中也可见,例如 COLUMNS 和 STATISTICS 表。您可以通过将 show_gipk_in_create_table_and_information_schema 设置为 OFF 来隐藏它们。
您可以使用此版本中添加的 --skip-generated-invisible-primary-key 选项从 mysqldump 的输出中排除生成的不可见主键。mysqlpump 现在还支持 --skip-generated-invisible-primary-key 选项,该选项将 GIPK 从其输出中排除。
有关更多信息和示例,请参阅生成的不可见主键。有关 MySQL 中不可见列支持的一般信息,请参阅不可见列。 (Bug #34092605)
密钥说明
keyring_aws 插件已更新为使用最新的 AWS Encryption SDK for C(版本 1.9.186)。
keyring_aws_region 变量支持新开发工具包支持的其他 AWS 区域。有关受支持的 AWS 区域的列表,请参阅变量描述。
插件式身份验证
SASL LDAP 插件无法正确解析从 Kerberos 配置文件读取的 Kerberos 密钥分发中心 (KDC) 主机信息,从而导致 SASL 身份验证错误。(Bug #31862170)
安全说明
现在可以在支持的平台上使用OpenSSL 3.0编译MySQL服务器包(mysqld + libmysql + 客户端工具),不会改变服务器或客户端程序的行为。有关其他信息,请参见https://wiki.openssl.org/index.php/OpenSSL_3.0。
空间数据支持
以前,MySQL 8.0.13中添加的ST_TRANSFORM()函数不支持笛卡尔空间参考系统。从这个版本开始,这个函数为大众可视化伪墨卡托(EPSG 1024)投影方法提供支持,用于WGS 84伪墨卡托(SRID 3857)。
SQL语法说明
现在可以确定无法执行的REVOKE语句是否会引发错误或警告。这是通过增加两个新的语句选项来实现的,这里列出了简单的描述。
目标用户或角色不存在,IF EXISTS使REVOKE引发警告,而不是错误。
IGNORE UNKNOWN USER使REVOKE在目标用户或角色不知道的情况下发出警告而不是错误,但该语句在其他情况下会成功。
对于单个目标用户或角色和要删除的特权或角色,在同一个REVOKE语句中同时使用IF EXISTS和IGNORE UNKNOWN USER选项,意味着该语句成功(尽管什么都不做,并发出警告),即使目标用户或角色和要删除的特权或角色都不知道,只要该语句是有效的。如果有多个目标、多个要删除的权限或角色,或者两者都有,该语句就会成功,执行那些有效的删除,并对那些无效的删除发出警告。
欲了解更多信息,请参见REVOKE语句。(Bug #102232, Bug #32495441)
XA事务说明
以前,当复制拓扑中的一个服务器节点在执行XA PREPARE、XA COMMIT或XA ROLLBACK时意外停止时,不能保证恢复。为了解决这个问题,现在当一个服务器节点从拓扑结构中丢失,然后重新获得时,MySQL使用MySQL "经典 "复制或MySQL组复制在整个拓扑结构中保持一致的XA事务状态。这也意味着,XA事务状态现在被传播,以便在一个服务器节点停止、恢复并重新加入拓扑结构的情况下,节点在给定的事务中进行工作时不会出现分歧。
对于任何多服务器复制拓扑结构(包括使用组复制的拓扑结构),XA事务状态的传播是一致的,因此所有服务器在任何时候都保持相同的状态。对于任何这种规模的拓扑结构(包括单台服务器,只要启用二进制日志),现在可以在任何服务器意外停止并在退出拓扑结构后被重新加入后,将其恢复到一致的状态。
这一改进是针对单个服务器的情况实现的,增加了对存储引擎和服务器的内部事务协调器(ITC)之间的两阶段XA准备的支持,准备的状态由两者保留。这意味着ITC可以安全地清除其内部日志,而没有丢失状态的风险,如果服务器在清除后停止。在单节点的情况下,在存储引擎和二进制日志之间强加的执行顺序可以防止在相应的变化对存储引擎可见之前GTID的外部化;在由多个服务器组成的拓扑结构中,这使得交易状态在保证本地一致性和持久性之前不会被广播到拓扑结构。在所有情况下,XA事务的状态都是从最后写入的二进制日志文件中提取的,并与从存储引擎获得的事务状态同步。
当同一事务的XID被用来连续执行XA事务时,这个版本的一个已知问题可能会遇到。如果在服务器使用这个相同的XID处理XA COMMIT ... ONE PHASE时发生操作中断,在存储引擎中准备好事务后,二进制日志和存储引擎之间的状态就不能再可靠地同步了。见
更多信息,请参见XA事务。
增加或改变的功能
重要的变化。包含curl而不是链接到系统curl库的二进制包已经升级到使用curl 7.83.1。(Bug #34138733)
重要变更。对于捆绑了OpenSSL库的平台,用于MySQL服务器的链接OpenSSL库已经更新到了1.1.1o版本。在OpenSSL 1.1.1o版本中修复的问题在https://www.openssl.org/news/cl111.txt 和https://www.openssl.org/news/vulnerabilities.html。(Bug #34133985)
重要变化。包括在MySQL中的fido2库,与authentication_fido插件一起使用,已经升级到1.8.0版本。(以前,MySQL中包含的是1.5.0版本)。
增加或改变的功能
重要变化。包含 curl 而不是链接到系统 curl 库的二进制包已经升级为使用 curl 7.83.1。
重要变更。对于捆绑了OpenSSL库的平台,用于MySQL服务器的链接OpenSSL库已经更新到了1.1.1o版本。在OpenSSL 1.1.1o版本中修复的问题在https://www.openssl.org/news/cl111.txt 和https://www.openssl.org/news/vulnerabilities.html。(Bug #34133985)
重要变化。包括在MySQL中的fido2库,与authentication_fido插件一起使用,已经升级到1.8.0版本。(以前,MySQL中包含的是1.5.0版本)。
欲了解更多信息,请参见FIDO可插拔认证。
InnoDB:innodb_doublewrite系统变量(用于启用或禁用重写缓冲区)有两个新设置:DETECT_ONLY和DETECT_AND_RECOVER。在DETECT_ONLY设置下,数据库页面内容不会被写入双写缓冲区,恢复也不会使用双写缓冲区来修复不完整的页面写入。这个轻量级的设置只用于检测不完整的页面写入。DETECT_AND_RECOVER设置等同于现有的ON设置。更多信息,请参见Doublewrite Buffer。
感谢Facebook的贡献。(Bug #32727919, Bug #103211)
InnoDB:InnoDB现在支持重做日志容量的动态配置。innodb_redo_log_capacity系统变量可以在运行时设置,以增加或减少重做日志文件占用的磁盘空间总量。
随着这一变化,重做日志文件的数量和它们的默认位置也发生了变化。从MySQL 8.0.30开始,InnoDB在数据目录中的#innodb_redo目录下维护32个重做日志文件。以前,InnoDB默认在数据目录中创建两个重做日志文件,重做日志文件的数量和大小由innodb_log_files_in_group和innodb_log_file_size变量控制。这两个变量现在已经被废弃了。
当定义了innodb_redo_log_capacity设置时,innodb_log_files_in_group和innodb_log_file_size设置会被忽略;否则,这些设置会被用来计算innodb_redo_log_capacity设置(innodb_log_files_in_group*innodb_log_file_size=innodb_redo_log_capacity)。如果这些变量都没有设置,重做日志容量被设置为innodb_redo_log_capacity默认值,即104857600字节(100MB)。
提供了几个状态变量来监控重做日志和重做日志容量调整的操作。
如同任何升级的一般要求,这一变化需要在升级前进行清洁关机。
关于这个功能的更多信息,见重做日志。
增加了对Ubuntu 22.04的支持。(Bug #34123545)
mysql模式中的几个表的主键定义中的列的顺序已经改变,所以包含主机名和用户名的列在主键的开始处依次在一起。对这些表的ACL查询只使用主机名和用户名,如果这些列没有按顺序在一起,就必须进行全表扫描以识别相关记录。将主机名和用户名放在一起意味着可以使用索引查询,这提高了CREATE USER、DROP USER和RENAME USER语句的性能,以及对具有多种权限的多个用户的ACL检查。
改变的表是mysql.db、mysql.table_priv、mysql.columns_priv和mysql.procs_priv。当你升级到MySQL 8.0.30或更高版本时,这些表在MySQL升级过程的第二步被修改。当使用备份或导出工具(如mysqldump或mysqlpump)执行逻辑升级时,使用--upgrade=FORCE选项,这可以确保表结构被检查并以新的列顺序重建。(Bug #33644645, Bug #33637244)
删除了myisam_repair_threads系统变量和myisamchk --parallel-recover选项。(Bug #31052408)
一个新的mysqldump选项--mysqld-long-query-time让你为mysqldump的会话设置long_query_time系统变量的自定义值。使用这个新选项可以增加mysqldump的查询在写入慢速查询日志文件之前允许的经过时间,以避免不必要的记录。感谢Facebook的贡献。(Bug #96369, Bug #96369, Bug #30110717)
在InnoDB存储引擎可用之前,错误日志组件现在可以在启动时隐式加载。这种加载错误日志组件的新方法加载并启用由log_error_services变量定义的组件。
以前,错误日志组件必须首先使用INSTALL COMPONENT进行安装,并且只有在InnoDB完全可用之后才会被加载,因为要加载的组件列表是从mysql.component表中读取的,而该表是一个InnoDB表。
隐式加载错误日志组件有这些优点。
日志组件在启动序列的早期被加载,使日志信息更快可用。
如果在启动过程中发生故障,它有助于避免损失缓冲的日志信息。
不需要使用INSTALL COMPONENT加载日志组件,简化了错误日志配置。
关于这个功能的更多信息,请参阅错误日志配置。
如果你以前使用INSTALL COMPONENT安装了可加载的日志组件,并且在启动时读取的log_error_services设置中列出了这些组件(例如,从选项文件中),你的配置应该被更新以避免启动警告。欲了解更多信息,请参阅错误日志配置方法。
MySQL企业审计的审计日志文件现在可以用可选的数据字段进行扩展,以显示查询时间、发送和接收的字节数、返回给客户端的行数以及检查的行数。这个数据在慢速查询日志中可用于合格的查询,在审计日志的背景下,它同样有助于检测活动分析的异常值。它是通过新的组件服务传递到审计日志的,你将其设置为审计日志过滤功能。只有当审计日志是JSON格式(audit_log_format=JSON)时,才能添加扩展数据字段,这不是默认设置。
MySQL服务器的AES_ENCRYPT()和AES_DECRYPT()函数现在支持使用密钥衍生函数(KDF),以便从你传递给该函数的密码或口令等信息中创建一个加密强度高的秘钥。派生的密钥用于加密和解密数据,它保留在MySQL服务器实例中,用户无法访问。强烈建议使用KDF,因为它比指定你自己的预制密钥或在你使用函数时通过更简单的方法导出密钥提供更好的安全性。这些函数支持HKDF(从OpenSSL 1.1.0开始可用),对于HKDF,你可以指定一个可选的盐和包含在钥匙材料中的上下文特定信息,以及PBKDF2(从OpenSSL 1.0.2开始可用),对于PBKDF,你可以指定一个可选的盐并设置用于产生钥匙的迭代次数。
一个新的系统状态变量Tls_library_version显示了正在为MySQL实例使用的OpenSSL库的运行时版本。OpenSSL的版本会影响到诸如对TLSv1.3的支持等功能。
从MySQL 8.0.30开始,MySQL企业加密的功能由一个组件提供,而不是从openssl_udf共享库安装。该组件提供的新功能只使用普遍喜欢的RSA算法,而不是DSA算法或Diffie-Hellman密钥交换方法,并且它们遵循当前关于最小密钥大小的最佳实践。组件函数还增加了对SHA3摘要的支持(前提是使用OpenSSL 1.1.1),并且不要求签名的摘要,尽管它们支持它们。
如果你从较早的版本升级到MySQL 8.0.30,其中的函数是从openssl_udf共享库文件中手动安装的,那么你创建的函数仍然可用并得到支持。然而,这些遗留函数从这个版本开始被废弃,建议你安装组件来代替。组件函数是向后兼容的,所以由传统函数产生的RSA公钥和私钥、加密数据和签名都可以使用组件函数。为了使组件函数支持对传统函数产生的内容进行解密和验证,你必须将新的系统变量enterprise_encryption.rsa_support_legacy_padding设置为ON(默认是OFF)。
组件函数以PKCS #8格式生成公共和私人RSA密钥。它们允许最小的密钥大小为2048位,这是目前最佳实践中合适的最小RSA密钥长度。你可以使用系统变量enterprise_encryption.maximum_rsa_key_size来设置最大的密钥大小,最高可达16384位,其默认的最大密钥大小为4096位。
当MySQL服务器被设置为离线模式时,其用户拥有CONNECTION_ADMIN权限的连接不会被终止,这可以通过将offline_mode系统变量的值改为ON来实现。以前,检查具有CONNECTION_ADMIN权限的连接可能会导致竞赛条件,因为它涉及访问其他线程。现在,每个线程都有一个标志来缓存该线程的用户是否有CONNECTION_ADMIN权限。如果用户权限发生变化,该标志会被更新。当服务器的离线模式被激活时,这个标志被检查到每个线程,而不是另一个线程的安全环境。这一变化使得操作是线程安全的。
此外,当离线模式被激活时,那些用户拥有SYSTEM_USER权限的连接现在只有在运行操作的用户也拥有SYSTEM_USER权限时才会被终止。只有SYSTEM_VARIABLES_ADMIN权限而没有SYSTEM_USER权限的用户,可以将offline_mode系统变量设置为ON来激活脱机模式。然而,当他们运行该操作时,除了用户拥有SYSTEM_USER权限的会话外,任何用户拥有CONNECTION_ADMIN权限的会话也保持连接。这只适用于操作时的现有连接;拥有SYSTEM_USER权限但没有CONNECTION_ADMIN权限的用户不能与处于离线模式的系统建立新的连接。
性能模式提供了对Group Replication内存使用情况进行性能监控的工具。
参见使用Performance Schema内存仪表监控Group Replication内存使用情况。
Bug 修复
InnoDB:TRUNCATE TABLE操作未能移除使用ALGORITHM=INSTANT丢弃的列的数据字典条目。
感谢Marcelo Altmann的贡献。(Bug #34302445)
InnoDB:在有即时添加列的表上,错误的nullable列计算导致数据被错误地解释。(Bug #34243694)
InnoDB:升级到MySQL 8.0.29后,在试图访问有即时添加列的表时发生故障。(Bug #34233264)
InnoDB:只记录了即时添加的列的物理位置,这对索引恢复来说是不够的。列的逻辑位置也是需要的。(Bug #34181432)
InnoDB:在级联更新操作中,InnoDB源中的field_phy_pos调试变量没有为子表更新。(Bug #34181419)
InnoDB:InnoDB源中的rec_get_instant_row_version_old()函数的某些实例没有检查行的版本。(Bug #34173616)
InnoDB:InnoDB源中的read_2_bytes()函数从日志缓冲区中读取字节,返回一个空指针。(Bug #34173425)
InnoDB:在InnoDB读写锁的性能模式检测中,对TRY(无等待)操作的锁获取失败和成功进行了错误的检测。(Bug #34131395)
InnoDB:在一个特定的锁场景中,隐式锁没有按照预期转换为显式锁,引发lock_rec_has_expl(LOCK_X | LOCK_REC_NOT_GAP, block, heap_no, trx) 调试断言失败。(Bug #34123159)
InnoDB: 对每一列进行检查,以确定表是否有即时添加的列,这影响了对有许多列的表进行ADD和DROP COLUMN操作的性能。现在,该检查在每个表中执行一次。(Bug #34112147)
InnoDB:一个产生大量锁请求和大量超时的工作负载导致了长时间的信号灯等待失败。为了解决这个问题,我们进行了优化,以减少独占全局锁系统锁的数量。(Bug #34097862)
InnoDB:重做日志块头中的m_flush_bit被设置为在一次日志写入调用中写入多个块的第一个块,它没有提供任何好处,已被删除。(Bug #34091444)
InnoDB:修正了clang-tidy和cppcheck的警告,其中包括删除了未使用的代码和不必要的检查。(Bug #33957087)
InnoDB:恢复重做日志文件的迷你交易(mtr)在设置了小的innodb_log_buffer_size的MySQL服务器实例上引起了调试断言失败。
感谢Mengchu Shi的贡献。(Bug #33945602)
InnoDB:使用WITH_VALGRIND源配置选项编译时产生了Wunused-variable警告。(Bug #33899862)
InnoDB:解决了无锁哈希表(ut_lock_free_hash_t)的多个问题。(Bug #33830934)
InnoDB:对一个带有二级索引的生成列的查询导致失败。代表生成列位置的字段号是无效的。(Bug #33825077)
InnoDB:在更新和插入具有多值索引列的行时,内存消耗大于预期。为每行更新的多值列分配的内存被保留到文件句柄被释放。(Bug #33766482)
InnoDB:InnoDB源中的UT_LOCATION_HERE结构使用不一致。(Bug #33436161)
InnoDB:在计算生成列的值时,需要从多值索引列中检索数组值的表对象不可用。(Bug #32725063)
InnoDB:在Widows 32位系统上的4GB表空间文件大小限制已经被移除。该限制是由于在扩展表空间时进行了错误的计算。(Bug #28934351)
InnoDB:InnoDB源中的哈希和随机生成器函数得到了改进。(Bug #16739204, Bug #23584861)
InnoDB:对一个有废弃表空间的表进行DROP TABLE操作会导致不必要的断言失败。(Bug #107207, Bug #34135187)
InnoDB:在添加多值索引后,对有JSON列的表的查询只返回部分结果集。(Bug #106621, Bug #33917625)
InnoDB:清除一个具有多个二进制大对象值的记录时,由于迷你交易(mtr)的冲突,引起了插入失败。(Bug #105592, Bug #33574272)
InnoDB: 在高并发实例上启用自适应散列索引(AHI),在建立散列索引时,会引起临时AHI搜索锁存器的争用。
感谢腾讯CDB团队的Zhou Xinjing提供的补丁。(Bug #100512, Bug #31750840)
包装。SASL LDAP客户端插件在Windows的MySQL社区包中丢失。
复制。当一个表的定义在源表和复制表之间出现分歧时,因为复制表有一个额外的主键,如果该表的索引在源表和复制表上都存在,则复制表的更新和删除会失败。InnoDB表的主键自动包含在所有索引中,复制应用者需要在事件中包含键的所有部分的值,以便搜索索引。以前,应用者检查所有用户定义的键的部分是否存在,但检查不包括自动包含的隐藏主键。现在,应用者在使用索引搜索数据之前,会验证用户定义的和自动包含的关键部分是否存在于一个事件中。(Bug #34122738)
复制。当启用transaction_write_set_extraction系统变量时(这是默认的),MySQL Replication从事务中提取的写集是从主键、唯一键和外键中提取的。它们被用来检测事务之间的依赖关系和冲突。以前,涉及多列外键的写集不正确地将每一列识别为一个单独的外键。现在这个问题已经被修复,外键写入集包括所有被引用的键列。(Bug #34095747, Bug #34144531)
复制。当使用基于行的复制时,复制有时会覆盖由源发送的SQL模式值,以试图避免与从属上的额外列的问题。在极端情况下,这可能导致数据分歧。这个问题已经得到纠正,现在复制体尽可能保留源的SQL模式。(Bug #33945038)
复制。性能模式表replication_group_member_stats中的COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE列可能持续显示与已经应用的视图变更事件(View_change_log_event)相关的事务。这些事件在组复制应用者通道中排队,但在组复制恢复通道中应用,导致竞赛条件,可能导致计数器的递减丢失。现在,计数的递增发生在一个更合适的点上,而且当应用者不忙时,COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE的计数器也被设置为零。(BUG #33602354, Bug #33674059)
复制。当一个成员试图重新加入一个组复制拓扑结构时,当同一服务器的旧版本仍然存在时,所记录的信息已经从信息说明升级为警告信息。(BUG #32651024)
复制。MySQL的半同步复制没有尊重net_read_timeout系统变量的值,并强制读取一毫秒的超时。这可能导致该功能遇到部分读取确认信息和数据包不按顺序到达的情况,而MySQL系统中的其他连接是正常运行的。net_read_timeout系统变量的值现在被应用于半同步复制的连接。(Bug #101056, Bug #31976209)
复制。当使用 --replicate-same-server-id 选项使复制不跳过有自己的服务器ID的事件时,如果日志文件被旋转,复制就会以错误方式停止。现在,日志旋转事件会检查并应用该选项的当前值。(Bug #89375, Bug #27492990)
API。以前使用MySQL客户端库来执行与服务器的自动重新连接的应用程序在服务器升级后收到以下mysql_query错误。
[4031] 客户端因不活动而被服务器断开连接。参见wait_timeout和interactive_timeout来配置这种行为。(Bug #105229, Bug #34007830)
不是在所有情况下都能正确处理将条件下推至派生表的问题。(Bug #34311090)
在将一个条件下推到具有设置操作的派生表后,同时折叠一个始终为真的布尔条件,由于在条件下推到具有设置操作的派生表时,没有为克隆的条件设置abort_on_null为真,所以重写不正确。(Bug #34298238)
在视图定义中处理无效的ORDER BY表达式时,缺少错误返回,导致在调试构建中出现断言。(Bug #34239456)
MySQL服务器在最新版本的Visual Studio 2022中无法编译。(Bug #34231639)
当试图在条件推倒期间克隆一个系统变量时,服务器有时无法确定克隆表达式的正确上下文。
为了防止这种情况,当派生表使用系统变量,或者派生表中的底层表达式包含系统变量时,我们不允许向派生表推送条件。(Bug #34205559)
增加了对Enterprise Linux 9 (EL9)的支持。(Bug #34190004)
在macOS 11上,MySQL服务器没有正确的权利在服务器意外停止的情况下生成核心转储。已经添加了一个构建选项WITH_DEVELOPER_ENTITLEMENTS,允许构建产生核心转储。(Bug #34163987)
改进了在缺少libevent-devel或libedit-devel的系统上对'-DWITH_LIBEVENT=system'和'-DWITH_EDITLINE=system'的错误处理。(Bug #34131334, Bug #34123545)
在MySQL 8.0.29中对Bug #33830493的修复解决了以下情况:如果MySQL实例意外停止或在使用SET PERSIST语句记录系统变量设置后不久重新启动,配置文件mysqld-auto.cnf可能留空,在这种情况下,服务器重新启动无法继续。现在,持久化的系统变量被写入一个备份文件,该文件只有在验证写入成功后才被重命名为mysqld-auto.cnf,而原始的mysqld-auto.cnf文件仍然可用。在重启时,如果发现一个具有有效内容的备份文件,服务器会从该文件中读取。否则,使用 mysqld-auto.cnf 文件,并删除备份文件。该文件没有被这个修复程序刷新到磁盘,所以仍有可能发生该问题。这个补丁增加了这些操作。(BUG #34122866)
修正了CMake的-DENABLE_GCOV选项。(BUG #34113243)
在MySQL 8.0.29中引入的SENSITIVE_VARIABLES_OBSERVER权限,现在在升级期间被授予具有SYSTEM_VARIABLES_ADMIN权限的用户。以前,在升级期间,该权限不授予任何数据库用户。(BUG #34068378)
从一个使用左连接的视图中进行选择时,没有返回任何结果。(BUG #34060289)
在某些情况下,TRUNCATE performance_schema.accounts会在global_status中引起重复的计数。
如果一些主机没有被检测到,就会发生这种情况。例如,如果performance_schema_hosts_size被设置为一个低值。
我们感谢蒋宇翔和腾讯团队的贡献。(Bug #34057013, Bug #106939)
在某些情况下,EXPLAIN ANALYZE可能会尝试访问一个不存在的迭代器。(Bug #34051681)
参考文献。这个问题是一个回归的问题。Bug #33905399。
增加了对OpenSSL 3编译keyring_oci插件的支持(Bug #34043013)。
在性能模式表中记录的线程创建和删除的事件被保留到服务器关闭,而不是在客户端连接结束时被删除。现在,线程创建和删除发生在为用户会话创建性能模式工具之后,因此在会话结束时被清理掉了。(Bug #34019988)
将捆绑的zlib库升级到了zlib 1.2.12。还将 zlib 1.2.12 作为支持的最小 zlib 版本,并从 WITH_SYSTEM_LIBS 的 CMake 选项中删除了 WITH_ZLIB。(Bug #34015600)
CONNECTION_ID()函数,因为它返回一个会话ID,在会话的生命周期内保持不变,所以被视为一个常量函数。当CONNECTION_ID()被用于连接到一个可能被其他会话重用的表的触发器时,这就造成了问题。我们通过使该函数在执行时成为常数,并在函数被评估时返回实际的会话ID来解决这个问题。(Bug #34009876)
对大部分源代码执行了codespell,并修正了代码注释中报告的拼写错误。(Bug #34006439)
对MySQL企业加密openssl_udf函数库插件进行了重新实现,以使用OpenSSL 3 API。(Bug #33992115)
修改了FEDERATED存储引擎代码,以解决NULL指针和变量访问问题。(Bug #33962357)
MySQL中的直方图对桶外的值返回了一个选择性估计值0。这意味着直方图中的值可能会被遗漏,因为它们在采样过程中被遗漏了,或者因为直方图已经变得陈旧。为了防止这种情况,我们对直方图产生的选择性估计值引入了一个0.001的恒定下限。这个下限的选择对应于我们在抽样过程中可能会遗漏的数值或范围的选择性。
对缺失值的选择性使用一个常数下限而不是一个统计估计,具有简单性和可预测性的优点,并提供一些保护,以防止由于陈旧的直方图和桶内启发式方法而低估了选择性。
关于MySQL中直方图的更多信息,请参阅优化器统计。(Bug #33935417)
对于某些使用通用表表达式(CTE)的查询,即使已知CTE被执行,EXPLAIN ANALYZE也没有为CTE提供任何分析数据。这种情况发生在满足以下条件的情况下。
CTE在查询计划中被引用了一次以上。
对CTE的第一次引用(按照EXPLAIN FORMAT=TREE的输出顺序)从未被执行。
随后的引用中至少有一个被执行了一次。
问题是,当遇到对CTE的第一个引用时,CTE计划总是被打印出来;如果那个引用从未被执行,那么CTE就没有被物化;因此没有剖析数据可以打印。
对这个问题的修复确保了我们在CTE计划第一次执行时打印它,也就是说,在它被物化的那一刻。然后输出包括剖析数据。如果CTE从未被执行,我们会在最后一次引用时打印计划,这时没有剖析数据。(Bug #33905399)
mysqld --verbose --help命令的输出以前显示插件加载选项为ON,即使它们在默认情况下是关闭的,或使用选项关闭。现在输出显示插件的当前值。(Bug #33870892)
服务器现在捆绑了curl(7.83.1),并且只在使用其他SSL系统时使用它,例如EL7上的openssl11。(Bug #33859507, Bug #34154806)
调试的MySQL二进制文件现在可以使用-0g和-fno-inline来构建。(Bug #33855533)
在MySQL 8.0.27中引入的FIREWALL_EXEMPT特权,现在在升级期间被授予具有SYSTEM_USER的用户。以前,在升级期间,该权限不授予任何数据库用户。(Bug #33854409)
一个相关的子查询没有按照预期使用功能索引。这发生在子查询内部使用的外部列引用没有被视为子查询执行的常量,这使得对功能索引的考虑被跳过。
我们通过确保在执行子查询时将外部列引用视为常量来解决这个问题。(Bug #33851055)
通过在WITH_SSL Cmake选项中传入EL7上的openssl11或EL8上的openssl3,增加了备用的OpenSSL系统包支持。认证插件,如 LDAP 和 Kerberos,由于不支持这些替代版本的 OpenSSL,因此被禁用。(Bug #33835934)
带有子查询的准备语句没有访问任何表,但子查询的评估引发了一个错误,在调试构建中触发了断言失败。(Bug #33773799)
一些存储函数在第一次调用后没有被正确执行。(Bug #33754993)
当使用递归公共表表达式(CTE)执行查询时,在常量谓词消除后删除查询表达式,预计当CTE临时表的表对象的引用计数为零时,应该可以再次重新创建表,但在某些情况下,其中一个表的引用没有被正确记录为附属于CTE。(Bug #33725503)
参考文献。也请参见。Bug #32962511.
在解析器中增加了一个缺失的错误返回。(Bug #33725502)
与使用外部引用的条件推倒有关的一些问题,与MySQL 8.0.22中为实现物化派生表的条件推倒所做的工作有关,已经被确认并解决。(Bug #33725403, Bug #33725500, Bug #33725508, Bug #33725534, Bug #33725545)
为使用普通表表达式的SELECT生成的计划涉及到表的物化和对物化表的索引扫描。因为temptable引擎还不支持所有的索引扫描方法,这样的查询可能不总是正确执行。
对于其他MySQL引擎,当访问路径不被认为是基本的时候,物化访问路径有特殊处理;对于temptable,索引扫描不被认为是基本的,这导致了未定义的行为。
我们通过将索引扫描访问路径视为基本,从而避免在temptable表上使用任何索引扫描访问方法来修复这个问题。(Bug #33700735)
INFORMATION_SCHEMA.FILES表中的Data_free列在向InnoDB系统表空间添加新的数据文件后没有更新。(BUG #33508534)
如果一个插件试图用一个与现有系统变量重复的名字注册一个系统变量,现有的静态系统变量可能会被覆盖,并且卸载插件可能会留下指向释放内存的指针。现在这些问题已经被修复。(BUG #33451101)
SHOW TABLES和SELECT * FROM INFORMATION_SCHEMA.TABLES,如果用户只有对单个性能模式表的访问权限,则不会从性能模式返回任何结果。(Bug #33283709)
在没有安装data_masking插件的情况下调用该插件的相关函数,导致服务器意外关闭。与该插件有关的函数是通过调用init函数来初始化的,而init函数又会访问UDF元数据服务,但这只有在安装了数据屏蔽插件后才有效。我们通过增加一个检查来解决这个问题,即在初始化此类函数之前验证该插件是否已经安装,如果提供这些函数的插件没有安装,则返回一个适当的错误信息。(Bug #33234046)
在某些情况下,服务器没有正确处理max_execution_time的过期或KILL语句的执行。(Bug #33218625)
mysqlslap,使用多线程连接到服务器,不能用使用FIDO认证的用户账户运行。这个问题已经通过对FIDO库的更新得到修复,允许在多线程上进行认证。(Bug #33067183)
当成员与服务基础设施进行交互时,在组复制中可能会出现死锁,例如加入的成员检查不兼容的配置,然后由于这个原因离开组。这个问题现在已经被修复。(Bug #32688091)
如果在会话中为binlog_checksum系统变量设置了一个不正确的值,那么在同一会话中发出的COM_BINLOG_DUMP命令从一个源头请求二进制日志流就会失败。现在服务器在启动校验算法设置过程之前会验证指定的校验值。(Bug #32442749)
对于慢速查询日志,除非启用了慢速查询日志,否则没有实现Slow_queries状态变量,这与文档内容相反。(Bug #28268680, Bug #91496)
一个准备好的语句可以接受一个空字符串作为有效的浮动值,这代表了8.0.27行为的倒退。这个修正明确地检查了解释的字符串的长度是非空的,并且完全解释为一个(浮点数)。此外,新的验证现在确保。
所有的数值都支持空字符串和全部为空格的字符串。
支持常规的数字值,以及带有前导和尾部空格的数字值。
(Bug #107399, Bug #34213338)
参考文献。这个问题是一个退步。Bug #32213576。
升级到MySQL 8.0.29导致现有空间索引的问题(见创建空间索引)。问题的根本原因是所包含的Boost库在地理区域计算方面的变化,该库在MySQL 8.0.29中已升级到1.77.0版本。我们通过确保在执行此类计算时适应新方法来解决这个问题。(Bug #107320, Bug #34184111)
参考文献。这个问题是一个回归的问题。Bug #33353637。
当为准备好的语句向下推送条件到派生表时,当派生表包含联合体时,我们克隆了一个条件,其中也包括参数。当语句在执行过程中需要重新准备时--例如,当指定的值的符号性与实际的数据类型不一致时,参数没有被正确克隆,导致错误。出现这种情况是因为为参数指定的值被用来打印用于重新解析的字符串,而不是一个字面的?
现在,在这种情况下,我们为打印用于修复的参数设置了一个标志QT_NO_DATA_EXPANSION,当它被启用时,会导致打印出占位符,而不是实际值。(Bug #107230, Bug #34148712)
在MacOS上,改进了Homebrew的Boost库检测逻辑,因为即使设置了-DWITH_BOOST,也有可能使用不兼容的系统的Boost版本。(Bug #107151, Bug #34121866)
参考文献。这个问题是一个退步的问题。Bug #33769505。
在RHEL 7.x上,在s390x RHEL 7.x上获取CPU缓存行大小返回0,导致rpl_commit_order_queue和 integrals_lockfree_queue失败。
我们感谢Namrata Bhave的贡献。(Bug #107081, Bug #34095278)
当mysql客户端在服务器意外停止后无法重新连接到服务器时,构建完成哈希的过程分配了没有被释放的内存。现在,如果客户端未能重新连接,则重新连接操作不会建立完成哈希值,如果客户端断开连接,则相关内存被释放。(Bug #106864, Bug #34019571)
为 s390x 架构增加了一个循环定时器。
我们感谢Namrata Bhave的贡献。(Bug #106824, Bug #33997819)
在某些情况下,当子查询的WHERE子句包含一个等价物时,执行具有物化功能的半联接可能导致不正确的结果。在某些情况下,例如当这种等价关系的一方是IN或NOT IN子查询时,该等价关系既没有被下推到物化子查询中,也没有作为半联接的一部分被评估。这也导致了一些内部哈希连接的问题。(Bug #106710, Bug #106718, Bug #33952115, Bug #33957233)
参考文献。也请参见。Bug #84705, Bug #25466100.
(<日期列> <非日期列>) IN ((val1, val2), (val3, val4), ...)等查询的比较器函数可能会返回错误的结果。(Bug #106567, Bug #33897969)
修正了SetOsLimitMaxOpenFiles中的一个断言定义;我们感谢hongyuan li的贡献。(Bug #106555, Bug #33893197)
此前,我们假设当同一个非空表达式同时作为LIKE的第一个和第二个参数时,其结果总是真实的,因此可以被优化掉。这个假设原来是不成立的,因为LIKE把反斜杠(\)当作一个转义字符,即使没有指定ESCAPE。这导致了在SELECT列表中使用条件而不是在WHERE子句中使用条件时的不同结果。为了解决这个问题,我们不再对LIKE进行这种优化,无论是否有ESCAPE子句。(Bug #106444, Bug #33852756)
在某些情况下,当全局事务ID以外的参数(如列值)被传递给GTID_SUBSET()时,该函数返回的值并不是预期的NULL。(Bug #106298, Bug #33793942)
当谓词的左侧为NULL时,在评估一般量化的比较谓词时出现了问题。在这种情况下,来自当前最后一行的子查询的评估值被保存,因此不需要重新评估,但在执行之间没有清除缓存值(result_for_null_param),因此下一次执行可以重新使用前一次执行的结果。这样做的一个后果是,当一个子查询的执行首先导致子查询中的零行匹配--对于一个ALL谓词来说应该返回TRUE--随后的执行导致至少有一行匹配,也会返回TRUE,尽管预期是FALSE。
为了解决这个问题,我们现在确保在执行后清理子查询谓词时清除result_for_null_param。(Bug #106164, Bug #37755139)
使用 --async-client 选项和 shutdown 命令执行的测试案例导致 mysqltest 意外停止。(Bug #105797, Bug #33643149)
MySQL支持使用等高直方图来改进选择性估计。一个列的等高直方图中的每个桶应该包含大致相同数量的值(行);保持小桶有助于最小化任何误差。
在构建等高直方图时,有时会有太多的值被放在同一个桶里,这可能会导致选择性估计的重大错误。我们通过引入一个新的等高直方图构建算法来解决这个问题,该算法保证了低误差,并适应数据的分布以有效利用其桶。此外,一个新的直方图桶中独特值的数量估计器提供了改进的最坏情况下的误差保证。
更多信息请参见 INFORMATION_SCHEMA COLUMN_STATISTICS 表和优化器统计。(Bug #104789, Bug #33302021)
返回给客户端程序的删减警告被发送到stdout而不是stderr,在mysqldump的情况下,这可能意味着转储文件不再工作,因为警告被包含在其中。现在这个问题已经被修复,警告被发送到stderr。(Bug #104769, Bug #33733529)
扩展了对链式SSL证书的支持。(Bug #54158, Bug #27491518)