暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 9.3 正式发行(GA)

18

推荐一篇徐老师的文章。

正文如下:

MySQL 9.3创新版于2025年4月15日正式发行,与此同时,长期支持版8.4也推出补丁程序MySQL 8.4.5。让我们快速浏览一下都有哪些方面的内容。

### 账户管理

在某些情况下,管理员可以授予用户执行(EXECUTE)权限,但随后却无法从同一用户处撤销该权限。(错误编号#37570206)

### 审计日志

对于<NAME>Execute</NAME>,<COMMAND_CLASS>未填充内容。错误编号(#36686351)

### 编译

1. **组复制**:由于一些Linux发行版(包括Fedora)不再将其包含在OpenSSL v3的主软件包中,OpenSSL引擎接口已被弃用。为避免出现编译问题,组通信系统(GCS)对OpenSSL引擎接口的使用现在仅限于1.1版本之前的OpenSSL版本。(错误编号#37475769)

2. **Linux**:在Oracle Linux 10上编译服务器时,请使用/usr/bin/gcc(GCC 14.2.1)。(错误编号#37616148)

3. **Linux**:使用protoc版本3.14或更早版本进行编译时,请使用--experimental_allow_proto3_optional。(错误编号#37579947)

4. **Microsoft Windows**:启用MSVC_CPPCHECK时,无法使用Visual Studio 17.13.1编译服务器。(错误编号#36925076)

5. 绑定的Curl库已经升级到8.12.1版本。(错误编号#37633587)

6. 在FreeBSD上编译MySQL时,已禁用-ftls-model=initial-exec选项。(错误编号#37613105)

7. 在FreeBSD上无法编译Abseil。(错误编号#37611924)

8. 运行comp_err时,不读取share/charsets/Index.xml文件。(错误编号#37569683)

9. mysql_version.cmake文件被多次引用。(错误编号#37559512)

10. 已删除未使用的文件strings/utr11-dump.cc。(错误编号#37549844)

11. 绑定的opentelemetry-cpp版本已经升级到1.19.0版本。(错误编号#37506554)

12. 修复了clang-tidy生成的大量警告。(错误编号#37471922)

13. include/my_systime.h包含了不需要的std::chrono,现已将其删除。(错误编号#37458343)

14. 为了独立于lz4库(绑定的或源代码)使用xxhash函数,已经将xxhash.c编译到MySQL的二进制文件中,这需要使用大量的CMake指令。现在,已经变更为xxhash构建一个接口库,并在使用这些函数的地方与之链接。(错误编号#37417386)

15. 使用来自GitHub的xxHash-0.8.2版本,而不是与lz4绑定的版本。(错误编号#37387318)

16. 已将绑定的opentelemetry-cpp版本升级到1.18.0版本。(错误编号#36708755)

17. 为Protocol::ColumnDefinition41末尾的未使用字节添加了文档说明。

感谢Daniyaal Khan的贡献。(错误编号#117346,错误编号#37541403)

### 组件

1. **重要变更**:从本次版本发布开始,MySQL企业数据屏蔽和去标识化功能更改名称为MySQL企业数据屏蔽。从9.2版本开始,MySQL的文档已进行更新以反映这一变化。有关更多信息,请参阅“MySQL企业数据屏蔽”。(WL #16721)

2. **组复制**:流控制统计信息组件的正常文件和调试文件的软件包规范文件中的一些条目位置错误。流控制统计信息组件是MySQL企业版的一部分。有关更多信息,请参阅“组复制流控制统计信息组件”。(错误编号#37486491)

3. **组复制**:添加了组复制主选举组件,该组件在故障转移情况下可以指定最新的选择方法来选择新的主节点。组复制插件是此组件的先决条件,必须在每个组成员上安装。此外,为了使该组件正常工作,必须在每个组成员上将group_replication_elect_prefers_most_updated.enabled系统变量设置为ON。该组件还提供了两个用于监控的状态变量:Gr_latest_primary_election_by_most_uptodate_members_trx_delta是上次使用最新主节点选择方法时,新主节点与次新主节点之间的事务数量差异。Gr_latest_primary_election_by_most_uptodate_member_timestamp提供了利用最新选择方法最近一次选举新主节点的时间戳。

当选出新的主节点时,该组件会在日志中记录该事件。日志条目中的此信息包括时间戳、提升为新主节点的从节点的UUID,以及用于选择新主节点的方法:可以是最新方法,或者是加权方法。 有关此组件的更多信息,请参阅“组复制主选举组件”。此组件是MySQL企业版(商业产品)的一部分。有关更多信息,请参阅“MySQL企业版”。(WL #16432)

4. **对MySQL企业版的MySQL选项跟踪器组件进行了以下增强**:

现在,每个支持选项跟踪器的功能都提供了一个名为option_tracker_usage:feature_name的全局状态变量,该变量提供了某个功能被使用的次数计数。无论是否安装了选项跟踪器组件,都会提供此变量。

用户可以使用SHOW GLOBAL STATUS LIKE 'option_tracker_usage%' 来查看这些状态变量,或者从Performance Schema的global_status表中进行。

在用于使用情况数据的JSON格式中,布尔值used键已被计数器usedCounter取代。升级到本次版本后,选项跟踪器不会在此数据中添加或更新任何used成员。

有关更多信息,请参阅“选项跟踪器状态变量”以及“选项跟踪器支持的组件”。(WL #16721)

### 配置

1. **Microsoft Windows**:MySQL配置器CLI忽略了--install-sample-database选项。(错误编号#37701034)

2. **Microsoft Windows**:除了configure选项外,MySQL配置器CLI不执行--action选项指定的任何操作。(错误编号#37473745)

3. **Microsoft Windows**:在从MySQL 9.1.0升级到9.2.0期间,MySQL配置器未能找到my.ini配置文件,需要手动选择其文件路径。(错误编号#37468826)

4. **Microsoft Windows**:除非在命令中使用--old-instance-protocol选项,否则MySQL配置器CLI无法升级具有非默认实例端口的现有服务器。(错误编号#37459238)

### 弃用和移除

1. **NDB集群**:ndb_restore的--restore-privilege-tables选项在NDB 8.0.16中已被弃用,现在已被移除。(错误编号#36298807)

2. **复制**:replica_parallel_workers服务器系统变量不能再设置为0,现在允许的最小值为1。(WL #13957)

3. 已移除在MySQL 8.0.14中已被弃用的系统变量innodb_undo_tablespaces。(WL #16746)

4. 已移除在MySQL 8.0.30中已被弃用的系统变量innodb_log_file_size和innodb_log_files_in_group。(WL #16743)

5. 在MySQL 9.2.0中已被弃用的Version Tokens插件在本次版本中已被移除。(WL #16614)

### Doxygen说明

1. **解决了服务器源代码文档中的以下问题**:

索引页面链接到了MySQL 8.0手册。此修复通过使用无版本链接来避免此处的版本问题。

在protocol_classic.cc中,参数类型和标志描述不清晰,现已进行改进。

感谢Daniël van Eeden的贡献。(错误编号#117391,错误编号#117503,错误编号#37559971,错误编号#37607749)

2. **解决了服务器源代码文档中关于COM_STMT_PREPARE响应数据包的以下问题**:

有效负载规范显示了检查警告计数的错误条件。

从第一个示例中删除了多余的竖线字符(|)。

感谢Kanno Satoshi的贡献。(错误编号#117373,错误编号#37552681)

3. **解决了服务器源代码文档中的以下问题**:

纠正了MySQL客户端/服务器通信协议文档中关于AuthSwitchRequest的拼写错误。

protocol_classic.cc:区分OK数据包和EOF数据包的表格使用了错误的运算符;现已纠正。

记录了之前未记录的关于在COM_FIELD_LIST中发送默认值的行为。

感谢Daniyaal Khan的贡献。(错误编号#117325,错误编号#117374,错误编号#117596,错误编号#37534532,错误编号#37552684,错误编号#37645678)

### SQL函数和运算符说明

1. **重要变更**:当一个SQL函数从一个版本到下一个版本得到改进时,以往不会抛出SQL错误的情况下,它现在可能会抛出错误。原因在于如果这种情况发生在表的约束、默认表达式、分区表达式或虚拟列中,该表可能无法打开。这既阻止了分析问题(例如使用SHOW CREATE TABLE),也阻止了解决问题(例如使用ALTER TABLE ... DROP ...语句)。

现在,在服务器升级时,MySQL会扫描数据字典中使用了上述功能的表。然后尝试打开这些表,如果无法打开,MySQL会提醒用户。本次版本引入的--check-table-functions服务器选项有助于解决此问题,通过该选项可以指定服务器在遇到此类函数错误时的行为。将此选项设置为WARN,以便为服务器无法打开的每个表记录一个警告。如果将其设置为ABORT也会将这些警告记录为WARN,但会中止服务器升级。

 ABORT是默认设置。这使得用户能够在升级到新版本之前,通过旧版本的服务器修复问题。WARN会标记问题,但允许用户在解决问题时以交互模式继续操作。(错误编号#36890891)

### INFORMATION_SCHEMA

修复了PROCESSLIST表中的性能问题。(错误编号#36778475)

### InnoDB

1. **在某些情况下,由于页面仍处于固定或脏状态,MySQL在关闭时可能会崩溃**:记录了类似以下的错误:

[ERROR] [MY-011908] [InnoDB] [FATAL] Page [page id: space=46, page number=75] still fixed or dirty

[ERROR] [MY-013183] [InnoDB] Assertion failure: buf0buf.cc:5889:ib::fatal triggered thread 139963705668608

(错误编号#37391519)另请参阅:错误编号#35115601。

2. **InnoDB现在支持容器感知的资源分配,使其能够遵守容器施加的限制**:现在,InnoDB配置的默认值是根据容器分配的逻辑CPU和物理内存计算的,而不是依赖于系统范围的资源。

有关更多信息,请参阅xrefHere。(WL #16484)

### JavaScript程序

1. **重要变更**:JavaScript存储程序现在完全支持DECIMAL类型,包括其别名NUMERIC;现在可以在JavaScript程序中用作输入参数、输出参数、预处理语句的bind()参数和返回值。

为了保持精度,MySQL DECIMAL默认转换为JavaScript String,但可以覆盖此行为,通过将decimalType选项的值设置为NUMBER(或mysql.DecimalType.NUMBER),使其转换为Number。可以将JavaScript的Boolean、Number、String和BigInt值转换为DECIMAL(或NUMERIC)。不支持将任何其他JavaScript类型转换为MySQL十进制类型,并且会拒绝并报错。

 JavaScript存储程序支持需要多语言引擎组件(MLE),该组件可在MySQL企业版中使用。请参阅“多语言引擎组件(MLE)”。(WL #16747)

2. 已将MLE组件升级为使用GraalVM Truffle版本24.2.0。(错误编号#37668857)

3. 导入带有全局等待的库会导致内部错误。(错误编号#37425528)

4. 错误处理方面的一个问题导致在sql/sql_class.cc中出现断言。(错误编号#36777428)

5. **mle_session_reset()函数增加了一个可选的字符串参数,该参数可以取“stderr”、“stdout”或“output”之一,分别用于清除stderr、stdout或两者**:

当不带参数调用时,mle_session_reset()的行为与以前版本的MySQL中完全相同:它会清除stderr和stdout,重置会话时区并清除堆栈跟踪;这会删除mle_session_state()的任何可观察输出。

mle_session_reset()由MLE组件提供,MLE组件是MySQL企业版的一部分。有关此组件的更多信息,请参阅“多语言引擎组件(MLE)”。(WL #16660)

6. **MySQL JavaScript程序现在通过支持Intl全局对象,提供了数字、日期和其他值的本地化和国际化功能**:MySQL区域设置通过用破折号替换下划线映射到JavaScript区域设置;例如,设置lc_time_names = "ja_JP"意味着JavaScript返回“ja-JP”作为区域设置。

也可以通过调用对象的toLocaleString()方法或使用Intl格式化对象,在存储程序中覆盖会话或默认区域设置。

在给定会话中首次调用JavaScript存储程序时生效的区域设置,将保持为该存储程序的默认区域设置(除非它显式覆盖该区域设置),直到会话重置,即使在将lc_time_names设置为新值之后也是如此。

有关更多信息和示例,请参阅“JavaScript本地化和国际化”。(WL #16709)

7. **本次版本包括了一些与JavaScript库SQL相关的更改和添加内容**:

ALTER PROCEDURE和ALTER FUNCTION语句现在接受USING子句,因此可以添加、替换或删除由命名的JavaScript存储过程或存储函数导入的库列表。

CREATE LIBRARY现在支持COMMENT子句。此注释将显示在SHOW CREATE LIBRARY和SHOW LIBRARY STATUS的输出中。它还将显示在infromance schema的ROUTINES表的ROUTINE_COMMENT列中,LIBRARIES表也添加了一个LIBRARY_COMMENT列用于显示此值。

本次版本还实现了SHOW LIBRARY STATUS语句,该语句提供有关一个或多个JavaScript库的基本信息。与SHOW PROCEDURE STATUS类似,此语句支持LIKE和WHERE子句来过滤输出。

本次版本实现的ALTER LIBRARY语句使得可以更新JavaScript库的注释。

本次版本添加的状态变量Com_alter_library和Com_show_library_status分别提供了ALTER LIBRARY和SHOW LIBRARY STATUS语句的计数。

有关JavaScript存储程序的一般信息,请参阅“JavaScript存储程序”。另请参阅“多语言引擎组件(MLE)”。(WL #16737)

### JSON

1. 在默认的sql_mode下,可以创建一个包含JSON列且默认值为''的表,但是当在另一个mysqld上运行SHOW CREATE TABLE时,该表的输出会导致错误“BLOB, TEXT, GEOMETRY or JSON column ... can't have a default value”,即使第二个mysqld的sql_mode是非严格模式。此问题不会出现在BLOB或TEXT列上。(错误编号#116479,错误编号#37219226)

2. 使用WHERE EXISTS( SELECT ... FROM JSON_TABLE(...) )的查询没有返回预期的结果。(错误编号#114897,错误编号#3666073)

### MySQL企业版

选项跟踪器组件已添加了对两个MySQL功能的支持——传统的MySQL优化器和MySQLHypergraph优化器(仅在MySQL HeatWave)

有关更多信息,请参阅“选项跟踪器支持的组件”。(WL #16548)

### 优化器

在以前的MySQL版本中,当启用了`subquery_to_derived`优化时,支持将查询的WHERE子句中使用量化比较操作符`=ANY`(等同于`IN`)或`<>ALL`(等同于`NOT IN`)的子查询,转换为与派生表的内连接或外连接。本次版本从两个方面扩展了此优化器的功能:

现在支持所有此类比较操作符(`>ANY`、`>=ANY`、`<ANY`、`<=ANY`;`>ALL`、`>=ALL`、`<ALL`、`<=ALL`;`=ANY`、`<>ALL`)。

现在在SELECT子句和WHERE子句中都支持此类比较操作的转换。

有关更多信息和示例,请参阅“优化ANY和ALL子查询”。(WL #13052)

### Performance Schema

性能模式(PERFORMANCE_SCHEMA)服务线程v7未公开,导致组件无法使用它。(错误编号#37579218)

现在,用户可以在Linux平台上为遥测端点配置网络命名空间。添加了以下系统变量:

`telemetry.otel_exporter_otlp_traces_network_namespace`

`telemetry.otel_exporter_otlp_metrics_network_namespace`

`telemetry.otel_exporter_otlp_logs_network_namespace`

(WL #16735)

### 功能新增或变更

1. **重要变更**:从本次版本开始,不允许在单个MySQL创新系列版本之间进行降级,即使是在同一系列内。例如,如果发布了9.3.1版本,在升级到该版本后,将无法从MySQL 9.3.1降级回9.3.0版本。(错误编号#37387488)

2. **重要变更**:对于捆绑了OpenSSL库的平台,MySQL服务器链接的OpenSSL库已更新到3.0.16版本。有关更多信息,请参阅《OpenSSL 3.0系列版本说明》和《OpenSSL安全公告(2025年2月11日)》。(错误编号#36033684)

3. **性能方面**:mysql客户端对查询结果中二进制值(以十六进制字符串形式打印)的输出处理过程已得到优化,略微加快了包含二进制值的大型结果集的输出速度。(错误编号#37334107)

4. 增加了对企业Linux 10(EL10)的支持。(错误编号#37592019)

5. `handlerton drop_database_t` API的签名已更改:现在它接受数据库名称作为参数,而不是数据库路径。这一更改使API更高效。(错误编号#37191149)

6. 现在,当使用本次版本中引入的`--users`命令行选项运行时,`mysqldump`实用程序可以提供用户账户信息的逻辑转储,将相应的`CREATE USER`和`GRANT` SQL语句写入转储文件中。

 用户还可以通过包含`--add-drop-user`选项,使`mysqldump`生成的`CREATE USER`语句前面加上`DROP USER`语句。

也可以使用`--include-user`或`--exclude-user`选项中的任何一个,在转储中包含或排除特定的用户账户。

有关更多信息和示例,请参阅所引用选项的说明以及“`mysqldump — 数据库备份程序`”。(错误编号#28038954,WL #15658)

7. mysql客户端现在以三位小数的精度显示查询执行时间,以表示毫秒。

感谢Marcelo Altmann的贡献。(错误编号#117270,错误编号#37510263)

以下内容为已修复错误列表。

### 已修复的错误

**InnoDB**:在某些情况下,`get_better_lower_bound_for_already_active_id()`过程中`Trx_by_id_with_min::insert()`可能会设置不正确的`s_lower_bound`值。(错误编号#37548045)

**InnoDB**:修复了innobase代码中多个位置的潜在内存泄漏问题。(错误编号#37403052)

**InnoDB**:对空间索引执行`CHECK TABLE`时,未针对聚簇索引记录中存储的几何最小边界矩形(MBR)来验证MBR。这可能会导致空间索引的行为不正确。

从本次版本开始,`CHECK TABLE EXTENDED`会验证MBR是否与聚簇索引记录中存储的MBR匹配。(错误编号#37359538)

**InnoDB**:修复了与悲观行更新相关的问题。

感谢Shi Mengchu和阿里巴巴团队的贡献。(错误编号#37292404)

 **InnoDB**:`CHECK TABLE`操作可能会错误地报告空间索引已损坏。(错误编号#37286473)

 **InnoDB**:修复了与InnoDB重做日志恢复相关的问题。(错误编号#37061960)

 **InnoDB**:修复了与读取`index_id`值相关的问题。(错误编号#36993445,错误编号#37709706)

 **InnoDB**:在某些情况下,如果InnoDB引擎对范围结束检查执行了不必要的转换,会发生断言失败。

这会导致类似以下的错误:

`Assertion failure: lob0lob.cc:897:trx == nullptr || trx->is_read_uncommitted()`

(错误编号#35006212)

 **InnoDB**:修复了与`lower_case_table_names`相关的问题。(错误编号#32288105)

**InnoDB**:当另一个客户端会话正在更改分区表的定义时,在检索记录计数时未检查分区表索引。记录计数的执行没有出错。从本次版本开始,在检索记录计数时会检查索引以确保其可用。(错误编号#117459,错误编号#37617773)

**InnoDB**:重构了与恢复操作的`BPR_PCUR_*`定位相关的代码。(错误编号#117259,错误编号#37505746)

**InnoDB**:在某些情况下,使用`ALTER TABLE`并结合`INPLACE`修改列的大小时,可能会导致索引超过有效大小限制(767字节)。这种情况发生在行格式为`Redundant`或`Compact`且在表创建时未显式定义行格式的表上。从本次版本开始,会对导致无效索引大小的`ALTER TABLE, INPLACE`操作执行验证并返回错误。(错误编号#116353,错误编号#37168132)

**InnoDB**:修复了`Clone_persist_gtid`线程中的内存泄漏问题。

感谢Baolin Huang和阿里巴巴团队的贡献。(错误编号#107991,错误编号#34454572)

**分区**:当将`NOW()`插入到分区表中不属于分区键的列时,会检索所有分区,并且不会进行分区修剪。(错误编号#37397306)

**复制**:消除了`rpl_opt_tracker.cc`中潜在的竞态条件。(错误编号#37644518)

**复制**:当日志清理器分析中继日志文件时,它首先会搜索一个起始点(例如轮换事件或事务结束点),但在某些情况下,可能会因为认为包含所需GTID的二进制日志文件没有相关数据而将其删除,这会导致时间点恢复过程在等待应用缺失的GTID时无限期挂起。现在发生这种情况时,在确定起始点之前,分析过程会跳过对事务边界的解析。(错误编号#37635908)

**复制**:在主从设置中,从库在同一个表上遇到`UPDATE`和`DELETE`语句的不规则失败,并出现`ER_KEY_NOT_FOUND`错误。(从库的二进制日志和GTID记录显示所需的行已提交,并且没有被删除或更新。)当从库使用的行匹配算法是`HASH_SCAN`,并且同一个表中的两行具有相同的CRC32值时,就会发生这种情况。当出现CRC32冲突的情况,在哈希表中找到匹配的CRC32值并不能保证正在更新的是正确的行,因此算法会遍历具有相同CRC32值的任何多个条目,并在循环中比较每个条目的完整记录。问题的发生原因是退出此循环的逻辑不正确。现在这个逻辑已得到纠正。(错误编号#37462058)

**复制**:在测试中发现,有可能强制负责终止从库线程的进程访问已删除的对象。(错误编号#37375269)

**复制**:`asynchronous_connection_failover_delete_source()`函数在并非所有情况下都能按预期运行。(错误编号#36479088)

**复制**:在某些情况下,`asynchronous_connection_failover_add_source()`函数没有按预期运行。(错误编号#36479083)

**复制**:在某些情况下,`MASTER_POS_WAIT()`函数没有按预期运行。(错误编号#36421684,错误编号#37709187)

**复制**:在某些情况下,`asynchronous_connection_failover_add_managed()`函数没有产生预期的结果。(错误编号#34648589)

**复制**:当服务器处于高写入负载时,性能模式`log_status`表中显示的`gtid_executed`的二进制日志位置与二进制日志文件中显示的`gtid`位置不匹配。MySQL通过在查询`log_status`表时扩大对该表的锁定范围来修复此问题,以确保提交管道中的事务已完成。这确保了对`log_status`表的查询会等待,直到`gtid_executed`已完全更新,从而保证其与二进制日志中的位置一致。(错误编号#102175,错误编号#32442772)

**组复制**:当一个从库加入组时,可能会出现所有组成员开始无限期地增加Performance Schema的`replication_group_member_stats`表中`COUNT_TRANSACTIONS_ROWS_VALIDATING`列的值的情况。这会影响所有组成员的内存消耗,如果不通过重启触发该行为的从库组成员,或者在某些情况下通过重启整个组来缓解,最终可能会导致系统颠簸。

通过分析,组复制启动操作存在问题,该操作会检查`group_replication_applier`通道上是否存在来自先前组参与的部分事务,如果发现有部分事务,在应用所有完整事务并清除其中继日志后,该通道会停止,然后重新启动该通道。在此之后,会执行分布式恢复,应用来自组成员的任何缺失数据。问题出现在组复制管道操作停止`group_replication_applier`通道时,错误地停止了来自验证器模块的一个周期性任务,这导致一些周期性的内部操作无法进行。其中一个任务是周期性地发送已提交的事务,此遗漏阻止了验证的垃圾回收,进而导致性能模式`replication_group_member_stats`表中的`COUNT_TRANSACTIONS_ROWS_VALIDATING`持续增加。

为了解决这个问题,MySQL已采取措施确保停止`group_replication_applier`通道的管道操作不再干扰验证器模块,这也阻止了为`COUNT_TRANSACTIONS_ROWS_VALIDATING`添加虚假值。(错误编号#37613510)

**组复制**:在运行组复制时,一些事务可能没有写入集,例如指定了`GTID_NEXT`的空事务或DDL语句。对于此类事务,组复制无法检查冲突,因此,无法确定它们是否可以并行应用,出于这个原因,组复制采用悲观方法,按顺序运行这些事务,这可能会对性能产生影响。虽然DDL必须按顺序应用,但实际上没有理由对空事务强制这种行为,所以此修复使得空事务可以与其他非依赖事务并发应用。(错误编号#37597512,错误编号#37569333)

**组复制**:删除了冗余的GCS代码,该代码连续两次测试了相同的条件变量。(错误编号#37538338)

**组复制**:一个运行组复制的组,其主节点为i1,两个从节点为i2和i3,由于主节点的高内存使用开始出现间歇性问题。从节点开始报告主节点不可访问,然后又可访问,主节点也开始报告从节点间歇性不可访问,然后又可访问。在经历了一段这样的不稳定期后,从节点驱逐了原来的主节点(i1)并选举了一个新的主节点(i2)。在这些情况下,在以前的主节点(i1)上对`performance_schema.replication_group_members`表的查询,在很长一段时间(12小时或更长时间)内都报告i1为`ONLINE`且`PRIMARY`,i2为`ONLINE`且`SECONDARY`,i3为`ONLINE`且`SECONDARY`,直到在i1上重启`mysqld`进程。该问题被发现始于原来的主节点(i1),当时其中一个从节点过载并开始间歇性地离开和加入组,其连接在主服务器上被反复断开和重新创建。在重新连接过程中,主节点在尝试创建连接时挂起,从而阻塞了单个XCom线程。这可追溯到XCom通信栈上对`SSL_connect()`的调用,在MySQL 8.0.27中,该调用从异步形式变为了同步形式。当一个节点过载时,它可能不会响应`SSL_connect()`调用,从而使连接端无限期阻塞。为了解决这个问题,MySQL现在以非阻塞的方式进行连接,并且在超时时返回,将重试尝试留给调用者——在这种特定情况下,是XCom线程在尝试重新连接到另一个节点时。(错误编号#34348094,错误编号#36047891)参考:另请参阅:错误编号#37587252。

`mysqldump`中的`fprintf_string()`函数在进行字符串转义时未使用实际的引号字符。(错误编号#37607195)

清理了`overflow_bitset.h`中的代码。(错误编号#37591520)

在查找字符集和排序规则时,使用`std::string_view`而不是`std::string`,这节省了内存分配和释放的开销。(错误编号#37586193)

删除了先前修复后留下的未使用代码。(错误编号#37574896)

使用`std::string::starts_with()`而不是`strings/ctype.cc`中定义的`starts_with()`函数,并删除了后者,因为不再需要它。(错误编号#37568373)

`EXPLAIN`并不总是能正确处理子查询。(错误编号#37560280)

排序规则名称别名有时会以区分大小写的方式处理。(错误编号#37554688)

如果堆栈跟踪中已解码的函数名称超过512字节,函数名称会被截断并且不会打印换行符。从本次版本开始,长字符串,如文件名和已解码的函数名称,将直接写入输出。(错误编号#37543598)

`mysqldump`在其输出中未正确转义某些特殊字符。通过此修复,`mysqldump`现在遵循“字符串字面量”中描述的规则。(错误编号#37540722,错误编号#37709163)

对具有函数索引的表的一些操作未得到正确处理。(错误编号#37523857)

如果在使用RPM软件包在企业Linux平台上安装服务器后,安装`component_log_sink_json`,尝试设置`log_error_services`会导致错误。这是由于JSON日志文件的文件路径存在权限问题,此补丁已修复该问题。(错误编号#37508168)

使用`INSTALL COMPONENT`尝试安装未知组件时,并不总是能得到正确处理。(错误编号#37437317)

对于诸如`COLLATE utf8_bin`这样的用户输入,MySQL会进行别名查找以找到实际的排序规则(在这种情况下是`utf8mb3_bin`)。现在,在报告SQL错误时,MySQL使用这个实际的名称,而不是输入的字符串。(错误编号#37412963)

移除了内部的`binary_keyword`变量,该变量实际上并未被使用。(错误编号 #37408338)

在`libmysqld`中,`udf_handler::add()`函数在处理聚合函数时,未能正确处理错误。(错误编号 #37398919)

消除了内部函数`check_if_server_ddse_readonly()`在某些情况下出现未定义行为的可能性。(错误编号 #37394933)

内部函数`recover_innodb_upon_upgrade()`已不再使用,现已移除。(错误编号 #37394850)

审计日志插件在写入JSON输出时,未能正确处理错误。更多信息请参考《MySQL企业审计》。(错误编号 #37370439)

`ER_SERVER_OFFLINE_MODE`并不总是能得到正确处理。(错误编号 #37355755)

当对具有`BEFORE INSERT`触发器的表执行`INSERT`操作后紧接着进行`UPDATE`操作时,如果`INSERT`操作将一个`NOT NULL`列设置为`NULL`,即使当前服务器的`sql_mode`允许这种操作,有时也会因空值错误而拒绝`UPDATE`操作。(错误编号 #37337527)

在某些情况下,组件无法复用同一个连接来运行多个查询。(错误编号 #37286895)

改进了存储过程的错误处理。(错误编号 #37193011)

存储过程在预编译语句中并不总是能被正确调用。(错误编号 #37077424、错误编号 #37292797)

修复了存储函数准备过程中发现的一个错误。(错误编号 #36684438)

将`SEL_ROOT::elements`的大小从`uint16`增加到`size_t`。(错误编号 #36610878)

解决了多字节UTF - 8处理方面的一个问题。(错误编号 #36593253)

包含聚合函数的`ORDER BY`子句并不总是能得到正确处理。(错误编号 #36593253)

查询包含`UNION`的视图时,优化器提示被忽略,意外地需要使用`FORCE INDEX`。更多信息请参考《优化器提示》。(错误编号 #36536936)

一些子查询没有得到正确处理。(错误编号 #36421690)

与`SET`子查询相关的错误没有得到正确处理。(错误编号 #36335695)

在某些情况下,无效的DDL语句并不总是能按预期被拒绝。(错误编号 #35721121)

改进了内部函数`append_identifier()`。(错误编号 #35633084)

通常情况下,包含未使用窗口定义的视图应该是可更新的,但当视图中包含子查询时,它会被标记为不可更新。在更新时,窗口会被消除,但此时进行更新已经太晚了。MySQL通过检查窗口函数的存在性而非窗口定义的存在性来测试可合并性,以此解决这个问题;这样视图就可以更新,有问题的`UPDATE`操作也能成功执行。(错误编号 #35507777)

在某些情况下,`SET`语句在预编译语句中不能正确执行。(错误编号 #35308309)

`PARTITION BY ... (DEFAULT (column))`并不总是能得到正确处理。(错误编号 #35044654)

此修复解决了以下问题:

`Query_expression::is_set_operation()`并不总是能正确执行。

 某些DML语句序列可能导致程序意外退出。

 一些嵌套子查询并不总是能得到正确处理。(错误编号 #34361287、错误编号 #35889583、错误编号 #35996409、错误编号 #36404149、错误编号 #37611264)

在Debian系统上,不再对软件包中的zip和gzip文件执行`dh_strip_nondeterminism`操作。(错误编号 #33791880)

解决了与无效UTF - 8值相关的问题。(错误编号 #27618273、错误编号 #37709687)

解决了与无效标识符相关的问题。(错误编号 #22958632、错误编号 #37709664)

修正了`sql/statement/protocol_local_v2.cc`中一个未初始化的变量。(错误编号 #117541、错误编号 #37622633)

当给`LPAD()`函数传入用双引号括起来的空字符串时,除非字符串长度超过指定的长度变量,否则该函数不会返回正确的值。(错误编号 #117227、错误编号 #37498117)

空值安全相等运算符`<=>`在比较包含`NULL`的多个列(行值)时表现出意外行为。通过简化该运算符的实现修复了此问题。(错误编号 #117168、错误编号 #37462769)

在查询中使用多值索引并结合`ORDER BY DESC`和`LIMIT`时,如果`LIMIT`指定的值大于实际结果中的行数,会对性能产生负面影响。(错误编号 #117085、错误编号 #37436310)

当将`MAX()`用作窗口函数时,尽管窗口框架内的第一行有数据,但该函数会为第一行返回`NULL`。当窗口框架的起始位置使用`N FOLLOWING`定义,并且框架按与`MAX()`参数相同的表达式(可能仅在语法上有所不同,如别名或表引用)降序排序时,就会出现这种情况。以下是演示该问题的一系列语句:

    ```sql
    CREATE TABLE t0 (c0 INT);
    INSERT INTO t0 VALUES (1), (2);
    SELECT 
    c0, MAX(c0) OVER (ORDER BY c0 DESC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING)
    FROM t0;
    ```
    复制

    MySQL通过确保在程序逻辑的适当位置设置框架中的第一行编号来解决这个问题。(错误编号 #117013、错误编号 #37466984)

    移除了`mysqldump`生成的`INSERT IGNORE`语句中的多余空格。

    感谢Pieter Oliver的贡献。(错误编号 #116845、错误编号 #37353658)

    所有内部使用的ACL变量的类型已更改为`Access_bitmask`。

    感谢Mike Wang的贡献。(错误编号 #116737、错误编号 #37318159)

    `include/assert_grep.inc`中的一个错误可能会导致包含该文件的任何文件产生错误结果。

    感谢Ke Yu的贡献。(错误编号 #116239、错误编号 #37105430、错误编号 #37675340)

    如果一个客户端会话有未提交的事务,导致另一个客户端会话中的`DROP TABLE`语句被阻塞,那么第三个客户端会话在尝试执行`USE DATABASE`语句时会挂起。(错误编号 #115706、错误编号 #36892499)

    在`sql/ssl_init_callback.cc`中,`ssl_session_cache_timeout`的最大值被定义为84600而不是86400,并且错误地将84600表述为一天的秒数。

    感谢Pika Mander的贡献。(错误编号 #115165、错误编号 #37354555)

    消除了`mysqldump`客户端中的一个内存泄漏问题。(错误编号 #111793、错误编号 #35621833)

    移除了未使用的InnoDB和NDB存储引擎的`handlerton get_tablespace()`方法。(错误编号 #109443、错误编号 #34916556) 

    文章至此。

    文章转载自戏说数据那点事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论