MySQL 9.3创新版于2025年4月15日正式发行,与此同时,长期支持版8.4也推出补丁程序MySQL 8.4.5。一些更新内容如下:
账户管理
在某些情况下,管理员可以授予用户执行(EXECUTE)权限,但随后却无法从同一用户处撤销该权限。(错误编号#37570206)
审计日志
对于<NAME>Execute</NAME>,<COMMAND_CLASS>未填充内容。错误编号(#36686351)
编译
-
组复制:由于一些Linux发行版(包括Fedora)不再将其包含在OpenSSL v3的主软件包中,OpenSSL引擎接口已被弃用。为避免出现编译问题,组通信系统(GCS)对OpenSSL引擎接口的使用现在仅限于1.1版本之前的OpenSSL版本。(错误编号#37475769)
-
Linux:在Oracle Linux 10上编译服务器时,请使用/usr/bin/gcc(GCC 14.2.1)。(错误编号#37616148)
-
Linux:使用protoc版本3.14或更早版本进行编译时,请使用--experimental_allow_proto3_optional。(错误编号#37579947)
-
Microsoft Windows:启用MSVC_CPPCHECK时,无法使用Visual Studio 17.13.1编译服务器。(错误编号#36925076)
-
绑定的Curl库已经升级到8.12.1版本。(错误编号#37633587)
-
在FreeBSD上编译MySQL时,已禁用-ftls-model=initial-exec选项。(错误编号#37613105)
-
在FreeBSD上无法编译Abseil。(错误编号#37611924)
-
运行comp_err时,不读取share/charsets/Index.xml文件。(错误编号#37569683)
-
mysql_version.cmake文件被多次引用。(错误编号#37559512)
-
已删除未使用的文件strings/utr11-dump.cc。(错误编号#37549844)
-
绑定的opentelemetry-cpp版本已经升级到1.19.0版本。(错误编号#37506554)
-
修复了clang-tidy生成的大量警告。(错误编号#37471922)
-
include/my_systime.h包含了不需要的std::chrono,现已将其删除。(错误编号#37458343)
-
为了独立于lz4库(绑定的或源代码)使用xxhash函数,已经将xxhash.c编译到MySQL的二进制文件中,这需要使用大量的CMake指令。现在,已经变更为xxhash构建一个接口库,并在使用这些函数的地方与之链接。(错误编号#37417386)
-
使用来自GitHub的xxHash-0.8.2版本,而不是与lz4绑定的版本。(错误编号#37387318)
-
已将绑定的opentelemetry-cpp版本升级到1.18.0版本。(错误编号#36708755)
-
为Protocol::ColumnDefinition41末尾的未使用字节添加了文档说明。
感谢Daniyaal Khan的贡献。(错误编号#117346,错误编号#37541403)
组件
-
重要变更:从本次版本发布开始,MySQL企业数据屏蔽和去标识化功能更改名称为MySQL企业数据屏蔽。从9.2版本开始,MySQL的文档已进行更新以反映这一变化。有关更多信息,请参阅“MySQL企业数据屏蔽”。(WL #16721)
-
组复制:流控制统计信息组件的正常文件和调试文件的软件包规范文件中的一些条目位置错误。流控制统计信息组件是MySQL企业版的一部分。有关更多信息,请参阅“组复制流控制统计信息组件”。(错误编号#37486491)
-
组复制:添加了组复制主选举组件,该组件在故障转移情况下可以指定最新的选择方法来选择新的主节点。组复制插件是此组件的先决条件,必须在每个组成员上安装。此外,为了使该组件正常工作,必须在每个组成员上将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)
- 对MySQL企业版的MySQL选项跟踪器组件进行了以下增强:
现在,每个支持选项跟踪器的功能都提供了一个名为option_tracker_usage:feature_name的全局状态变量,该变量提供了某个功能被使用的次数计数。无论是否安装了选项跟踪器组件,都会提供此变量。
用户可以使用SHOW GLOBAL STATUS LIKE 'option_tracker_usage%' 来查看这些状态变量,或者从Performance Schema的global_status表中进行。
在用于使用情况数据的JSON格式中,布尔值used键已被计数器usedCounter取代。升级到本次版本后,选项跟踪器不会在此数据中添加或更新任何used成员。
有关更多信息,请参阅“选项跟踪器状态变量”以及“选项跟踪器支持的组件”。(WL #16721)
配置
-
Microsoft Windows:MySQL配置器CLI忽略了--install-sample-database选项。(错误编号#37701034)
-
Microsoft Windows:除了configure选项外,MySQL配置器CLI不执行--action选项指定的任何操作。(错误编号#37473745)
-
Microsoft Windows:在从MySQL 9.1.0升级到9.2.0期间,MySQL配置器未能找到my.ini配置文件,需要手动选择其文件路径。(错误编号#37468826)
-
Microsoft Windows:除非在命令中使用--old-instance-protocol选项,否则MySQL配置器CLI无法升级具有非默认实例端口的现有服务器。(错误编号#37459238)
弃用和移除
-
NDB集群:ndb_restore的--restore-privilege-tables选项在NDB 8.0.16中已被弃用,现在已被移除。(错误编号#36298807)
-
复制:replica_parallel_workers服务器系统变量不能再设置为0,现在允许的最小值为1。(WL #13957)
-
已移除在MySQL 8.0.14中已被弃用的系统变量innodb_undo_tablespaces。(WL #16746)
-
已移除在MySQL 8.0.30中已被弃用的系统变量innodb_log_file_size和innodb_log_files_in_group。(WL #16743)
-
在MySQL 9.2.0中已被弃用的Version Tokens插件在本次版本中已被移除。(WL #16614)
Doxygen说明
- 解决了服务器源代码文档中的以下问题:
索引页面链接到了MySQL 8.0手册。此修复通过使用无版本链接来避免此处的版本问题。
在protocol_classic.cc中,参数类型和标志描述不清晰,现已进行改进。
感谢Daniël van Eeden的贡献。(错误编号#117391,错误编号#117503,错误编号#37559971,错误编号#37607749)
- 解决了服务器源代码文档中关于COM_STMT_PREPARE响应数据包的以下问题:
有效负载规范显示了检查警告计数的错误条件。
从第一个示例中删除了多余的竖线字符(|)。
感谢Kanno Satoshi的贡献。(错误编号#117373,错误编号#37552681)
- 解决了服务器源代码文档中的以下问题:
纠正了MySQL客户端/服务器通信协议文档中关于AuthSwitchRequest的拼写错误。
protocol_classic.cc:区分OK数据包和EOF数据包的表格使用了错误的运算符;现已纠正。
记录了之前未记录的关于在COM_FIELD_LIST中发送默认值的行为。
感谢Daniyaal Khan的贡献。(错误编号#117325,错误编号#117374,错误编号#117596,错误编号#37534532,错误编号#37552684,错误编号#37645678)
SQL函数和运算符说明
- 重要变更:当一个SQL函数从一个版本到下一个版本得到改进时,以往不会抛出SQL错误的情况下,它现在可能会抛出错误。原因在于如果这种情况发生在表的约束、默认表达式、分区表达式或虚拟列中,该表可能无法打开。这既阻止了分析问题(例如使用SHOW CREATE TABLE),也阻止了解决问题(例如使用ALTER TABLE ... DROP ...语句)。
现在,在服务器升级时,MySQL会扫描数据字典中使用了上述功能的表。然后尝试打开这些表,如果无法打开,MySQL会提醒用户。本次版本引入的--check-table-functions服务器选项有助于解决此问题,通过该选项可以指定服务器在遇到此类函数错误时的行为。将此选项设置为WARN,以便为服务器无法打开的每个表记录一个警告。如果将其设置为ABORT也会将这些警告记录为WARN,但会中止服务器升级。
ABORT是默认设置。这使得用户能够在升级到新版本之前,通过旧版本的服务器修复问题。WARN会标记问题,但允许用户在解决问题时以交互模式继续操作。(错误编号#36890891)
INFORMATION_SCHEMA
修复了PROCESSLIST表中的性能问题。(错误编号#36778475)
InnoDB
- 在某些情况下,由于页面仍处于固定或脏状态,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。
- InnoDB现在支持容器感知的资源分配,使其能够遵守容器施加的限制:现在,InnoDB配置的默认值是根据容器分配的逻辑CPU和物理内存计算的,而不是依赖于系统范围的资源。
有关更多信息,请参阅xrefHere。(WL #16484)
JavaScript程序
- 重要变更: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)
-
已将MLE组件升级为使用GraalVM Truffle版本24.2.0。(错误编号#37668857)
-
导入带有全局等待的库会导致内部错误。(错误编号#37425528)
-
错误处理方面的一个问题导致在sql/sql_class.cc中出现断言。(错误编号#36777428)
-
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)
- MySQL JavaScript程序现在通过支持Intl全局对象,提供了数字、日期和其他值的本地化和国际化功能:MySQL区域设置通过用破折号替换下划线映射到JavaScript区域设置;例如,设置lc_time_names = "ja_JP"意味着JavaScript返回“ja-JP”作为区域设置。
也可以通过调用对象的toLocaleString()方法或使用Intl格式化对象,在存储程序中覆盖会话或默认区域设置。
在给定会话中首次调用JavaScript存储程序时生效的区域设置,将保持为该存储程序的默认区域设置(除非它显式覆盖该区域设置),直到会话重置,即使在将lc_time_names设置为新值之后也是如此。
有关更多信息和示例,请参阅“JavaScript本地化和国际化”。(WL #16709)
- 本次版本包括了一些与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
-
在默认的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)
-
使用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
功能新增或变更
-
重要变更:从本次版本开始,不允许在单个MySQL创新系列版本之间进行降级,即使是在同一系列内。例如,如果发布了9.3.1版本,在升级到该版本后,将无法从MySQL 9.3.1降级回9.3.0版本。(错误编号#37387488)
-
重要变更:对于捆绑了OpenSSL库的平台,MySQL服务器链接的OpenSSL库已更新到3.0.16版本。有关更多信息,请参阅《OpenSSL 3.0系列版本说明》和《OpenSSL安全公告(2025年2月11日)》。(错误编号#36033684)
-
性能方面:mysql客户端对查询结果中二进制值(以十六进制字符串形式打印)的输出处理过程已得到优化,略微加快了包含二进制值的大型结果集的输出速度。(错误编号#37334107)
-
增加了对企业Linux 10(EL10)的支持。(错误编号#37592019)
-
handlerton drop_database_t
API的签名已更改:现在它接受数据库名称作为参数,而不是数据库路径。这一更改使API更高效。(错误编号#37191149) -
现在,当使用本次版本中引入的
--users
命令行选项运行时,mysqldump
实用程序可以提供用户账户信息的逻辑转储,将相应的CREATE USER
和GRANT
SQL语句写入转储文件中。用户还可以通过包含--add-drop-user
选项,使mysqldump
生成的CREATE USER
语句前面加上DROP USER
语句。也可以使用--include-user
或--exclude-user
选项中的任何一个,在转储中包含或排除特定的用户账户。 - mysql客户端现在以三位小数的精度显示查询执行时间,以表示毫秒