MySQL 9.3 创新版正式发行
04-17 08:03 来源:OSCHINA 阅读(26)

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 客户端现在以三位小数的精度显示查询执行时间,以表示毫秒