MySQL 9.1.0创新版发布!MySQL 8.0.40,8.4.3小版本迭代

MySQL 9.1.0创新版发布!MySQL 8.0.40,8.4.3小版本迭代

ShawnYan Lv.6

10月15日,MySQL 8.0.40 GA,MySQL 8.4.3 LTS,MySQL 9.1.0 创新版本三版齐发。MySQL 8.0.40 / 8.4.3 都是长期支持版本,本次发版主要解决 Bug 若干,MySQL 9.1.0 创新版本会包含一些新特性,接下来我们看下详细内容。

关于 MySQL 发版模型变更的内容,请回看:MySQL 8.1.0 已来!

关于 MySQL 8.x 的新特性解析,请回看:「合集」MySQL 8.x 系列文章汇总

MySQL 8.0.40 GA

目前大部分生产环境的 MySQL 版本仍是 5.7 或 8.0(由于 5.7 已经结束支持,建议升级到 8.0),所以我们先来了解一下 8.0.40 的变更。

功能变化

对于捆绑 OpenSSL 库的平台,MySQL Server 的链接 OpenSSL 库已更新至 3.0.15 版本。(Bug #37021075)

当前 OpenSSL 3.0 系列最新版本即为 3.0.15,更新以修复安全漏洞为主。

为 mysql 客户端添加了 --system-command 选项,用于启用或禁用系统客户端命令。此选项默认启用。要禁用它,请使用 --system-command=OFF--skip-system-command,这会导致系统命令被拒绝并出现错误。(Bug #36377685,WL #16482)

编译说明

将 CMAKE_MINIMUM_REQUIRED 与正确的必需 CMake 版本 (3.14.6) 以及 MySQL 使用的第三方库的 CMake 策略保持一致。(Bug #36978193)

升级依赖库版本,以及解决其他编译问题 10 余项。

错误修复

错误修复 50 余项,这里不再罗列,详情参阅官方文档:

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-40.html

MySQL 8.4.3 LTS

MySQL 8.0.40 的大部分补丁会同步打到 8.4.3 上,这里我们着重关注一下差异点。

功能变化

性能; 复制:用于跟踪二进制日志事务依赖关系的数据结构已从 Tree 更改为 ankerl::unordered_dense::map,它使用的空间减少了约 60%,因此应有助于提高依赖关系跟踪性能。(Bug #37008442)

JavaScript 程序

在使用语句句柄接口的存储过程的 DML 语句中使用用户变量有时会导致在执行此类存储过程后执行任何语句时服务器意外退出。为了解决这个问题,我们现在在从语句句柄接口执行子语句后将用于存储用户变量及其值的内存重置为语句执行内存根。(Bug #36892945)

MySQL 9.1.0 Innovation

MySQL 9.1.0 为创新版本,引入若干新特性,这些新特性可能会在 9.x 长期版本发布之前再次变化,并不建议用于生产环境。

具体新变化如下。

审计日志

尽管 MySQL 服务器允许创建此类用户,但审计日志仍将名称不以字母数字字符开头的用户(例如“$foo”)视为无效。同样的问题也影响了 MySQL Enterprise Firewall。(Bug #36778917)

认证

使用 authentication_openid_connect 服务器端身份验证插件添加了对 MySQL Enterprise Edition 的 OpenID Connect 支持。有关更多详细信息,请参阅 OpenID Connect 可插入身份验证。(WL #16269)

组件

此版本中添加的选项跟踪器组件 (component_option_tracker) 实现了两个表,它们提供有关 MySQL 服务器以及组件和插件中存在的选项(即命名功能)的信息。

只读 performance_schema.mysql_option 表包含有关服务器上安装的所有选项的信息,包括名称、组件名称(或 MySQL 服务器)以及选项当前是否已启用。读/写 mysql_option.option_usage 表以 JSON 格式显示系统上每个选项的使用信息。如果服务器是组复制集群的一部分,则其服务器 ID 和集群 ID 也会显示在此表中。对于给定选项,mysql_option 表的 OPTION_NAME 列的值和 option_usage 表中具有相同名称的列的值相同;您可以将它们用作针对两个表的查询中的连接列。

此组件作为 MySQL Enterprise Edition 的一部分提供。有关选项跟踪器及其支持的表的更多信息,请参阅选项跟踪器组件和 mysql_option 表。(WL#16217,WL#15535)

MySQL 企业版

复制:此版本添加了 MySQL 复制应用程序指标组件,该组件为用户提供以前记录在错误日志中的复制统计信息。该组件向 MySQL 性能模式添加了两个包含此信息的表:replication_applier_metrics 为给定的复制通道提供复制应用程序指标,而 replication_applier_progress_by_worker:此表为特定工作器提供类似的指标。通过从整个复制管道收集统计数据并统一其呈现方式,这增强了复制的可观察性。作为这项工作的一部分,一些不是特别有用的指标已被更有用的指标取代。有关此组件的更多信息,请参阅复制应用程序指标组件。(WL #15620)参考:另请参阅:Bug #32587480。

原子 DDL

以前,CREATE DATABASE 和 DROP DATABASE 是原子的,但并非完全崩溃安全。这可能导致以下问题:如果在创建数据库目录之后但实际提交操作之前 CREATE DATABASE 失败,则数据字典没有数据库存在的记录,但数据库目录仍存在于文件系统中,因此需要手动清理。如果由于文件系统错误或意外关闭而导致 DROP DATABASE 过程中数据库目录的删除失败,则包含 DROP DATABASE 的事务并不总是回滚;在这种情况下需要手动干预来纠正问题。

只要受影响数据库中的所有表都使用支持原子数据定义语句的存储引擎(例如 InnoDB),这些语句现在就是完全原子的且崩溃安全的。有关更多信息,请参阅原子数据定义语句支持。(WL #16232)

编译

添加了 DISABLE_PERFSCHEMA 构建选项。启用后,这会将所有 DISABLE_PSI_* 选项设置为 ON。DISABLE_PERFSCHEMA 的默认值为 OFF。(Bug #36778698)

SQL_I_list 使用成员字段 next 来跟踪指向下一个对象的指针字段,该指针字段首先初始化为成员字段的地址;这仅适用于使用常规构造函数构造的列表对象。默认赋值运算符使用成员赋值,这对于空列表是不正确的。这是通过提供自定义移动构造函数和运算符 = 函数来修复的。此外,我们还将 save_and_clear() 的实现更改为使用 std::move() 而不是赋值。感谢 Xingyu Yang 和腾讯团队的贡献。(Bug #115712,Bug #36891161)

SQL 语法

此版本添加了对 IF NOT EXISTS 子句的支持,以便与 CREATE VIEW 语句一起使用。IF NOT EXISTS 具有以下效果:如果语句中指定的视图不存在,则将照常创建该视图,就像未使用 IF NOT EXISTS 子句一样。如果视图已存在,则该语句似乎成功执行,但不会更改视图定义,并会产生警告,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> CREATE VIEW v1 AS SELECT c1, c3 FROM t1;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE VIEW v1 AS SELECT c2 FROM t1;
ERROR 1050 (42S01): Table 'v1' already exists
mysql> CREATE VIEW IF NOT EXISTS v1 AS SELECT c2 FROM t1;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------+
| Level | Code | Message |
+-------+------+---------------------------+
| Note | 1050 | Table 'v1' already exists |
+-------+------+---------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE VIEW v1\G
*************************** 1. row ***************************
View: v1
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`vuser`@`localhost` SQL
SECURITY DEFINER VIEW `v1` AS select `t1`.`c1` AS `c1`,`t1`.`c3` AS `c3` from `t1`
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

IF NOT EXISTSOR REPLACE 不兼容,并且这两个子句不能在同一个 CREATE VIEW 语句中一起使用。尝试这样做会导致语句被拒绝并出现语法错误。有关更多信息,请参阅 CREATE VIEW 语句。(WL #14774)

SQL 函数

当同时使用 DISTINCT 时,SUM() 在某些情况下对同一值产生不同的结果。例如:

1
2
3
4
5
6
mysql> SELECT SUM(b'1100'), SUM(DISTINCT b'1100');
+--------------+-----------------------+
| sum(b'1100') | sum(DISTINCT b'1100') |
+--------------+-----------------------+
| 12 | 9 |
+--------------+-----------------------+

发生这种情况的原因是,在使用 DISTINCT 时,会使用临时表来保存值,因此最终只会将唯一值返回给用户。在设置 DISTINCT 的同时创建此类表时,我们没有考虑到已经确定的数据类型和长度,而是使用这些并重新计算它们。现在我们使用已经确定的数据类型和长度。(Bug #115476、Bug #36796197)

向量数据类型

STRING_TO_VECTOR() 函数现在允许 VECTOR 参数的字符串表示中出现尾随空格。解析器现在会修剪数字后、方括号前、方括号后或这些的任意组合中的空格字符。以下是一些以前不受支持但现在允许的值的示例:

1
2
3
4
"[1 ,2]"
"[1,2 ]"
" [1,2]"
"[1,2] "

JavaScript 程序

SqlResult 不支持迭代器。现在可以按照此处显示的方式迭代结果集:

1
2
3
4
5
let result = session.runSql("SELECT * FROM t")

for (let row of result) {
console.log(row.c1+row.c3);
}

多语言引擎组件 (MLE) 现在发出遥测指标。此外,在存储的 JavaScript 过程中执行的 SQL 查询现在可以在性能模式查询摘要中观察到,在存储的 JavaScript 过程中执行的 SQL 语句现在可以在 events_statements_history_long 中观察到。(Bug #36216014,WL #16354)

JavaScript 存储程序现在完全支持 VECTOR 类型。向量现在可以用作输入参数、输出参数、准备好的语句 bind() 参数和返回值。(WL #16405)

触发器性能改进

之前的版本中,如果一个表有一个或多个触发器,每次访问该表时,这些触发器会被完全解析并加载到内存中。这在涉及许多表、复杂触发器或两者兼有的场景中,常常导致资源使用过高和执行时间过长,即使在不涉及数据更改的情况下也是如此。这也导致了在只读副本上不必要的资源使用。为了解决这个问题,MySQL 9.1.0版本将触发器的解析和加载分为两个独立的阶段:第一阶段:只读取触发器的元数据,因为这些元数据可以存储一次并在不同实例的相同触发器之间共享。第二阶段:实际的解析和执行触发器,仅在修改表数据的操作中执行,这样就节省了资源,因为我们不再解析和缓存在执行例如SELECT语句时不使用的触发器。

这个增强功能通过在表缓存中分别跟踪带有触发器的表和不带触发器的表来实现。在任何给定时间,具有完全加载触发器并在表缓存中保持打开状态的表的最大数量由新引入的服务器系统变量table_open_cache_triggers的值决定。这个变量类似于现有的table_open_cache系统变量,但控制了这个版本中引入的特定于带有完全加载触发器的表的额外逐出机制。table_open_cache_triggers的默认值与其最大值(524288)相同。将table_open_cache_triggers设置为较低的值将激活特定于带有完全加载触发器的表的逐出逻辑。将table_open_cache_triggers保留在其默认值意味着不会根据表是否有任何完全加载的触发器从缓存中逐出表;这与MySQL以前版本的的行为相同。

这个版本中添加了一些服务器状态变量来跟踪带有触发器的表的缓存使用情况:Table_open_cache_triggers_hits:提供带有触发器的打开表的缓存命中次数。Table_open_cache_triggers_misses:显示带有触发器的打开表的缓存未命中次数。Table_open_cache_triggers_overflows:提供带有触发器的打开表的缓存溢出次数。

通过将触发器错误的静态缓冲区替换为按需分配的可变大小缓冲区,也改善了内存使用情况。作为这项工作的一部分,SHOW CREATE TRIGGER(读取但不修改数据)现在即使在服务器无法解析触发器体的情况下,也能显示所有触发器的完整定义。有关这些服务器变量的更多信息,请参阅前面提到的描述。有关表缓存的一般信息,请参阅MySQL如何打开和关闭表。这项改进是由Dmitry Lenev贡献的。(Bug #44625, Bug #86821, Bug #11753220, Bug #26366333, WL #16455)

遥测

现在可以在服务器启动时使用 performance-schema-meter 参数从命令行或配置文件启用或禁用遥测仪表。请参阅服务器仪表。(Bug #36698082)

MySQL 的 OpenTelemetry Logging 使您可以将遥测日志从 MySQL 服务器导出到 OpenTelemetry 后端进行分析。此功能通过以下方式实现:遥测日志组件:(仅限 MySQL Enterprise Edition 和 MySQL HeatWave)从服务器收集已检测的日志事件,将其格式化为 OpenTelemetry 的 OTLP 格式,然后将日志导出到外部进程。此进程可以是 OpenTelemetry 收集器或任何其他与 OpenTelemtry 兼容的后端。如果要导出到多个后端,则必须使用 OpenTelemetry 收集器。请参阅安装 OpenTelemetry 支持。

遥测日志接口:(MySQL 社区服务器、企业版和 MySQL HeatWave)一种 API,可让您定义和集成自己的 OpenTelemetry 日志组件。此接口可让您发现可用的日志工具、启用记录器、生成记录并提取相关的跟踪上下文。

该接口不提供日志记录。您必须使用 MySQL 企业版、MySQL HeatWave 或开发自己的组件来提供日志记录。有关接口和示例组件代码的信息,请参阅 MySQL Server Doxygen 文档的服务器遥测日志服务部分。(WL #15201、WL #15202)

功能变化

重要更改;InnoDB:在逻辑处理器少于 32 个的系统上,innodb_log_writer_threads 的默认值现在为 OFF。(WL #16396)

组复制:在以下情况下添加了新的 INFO 级别日志记录消息:当操作在所有节点上开始时;当等待操作完成时阻止发送消息时;当收到消息并且内部消息计数器减少时。(Bug #32929873)参考:另请参阅:Bug #32762677。

为了保持输出的一致性,在 explain_json_format_version=2 时 EXPLAIN FORMAT=JSON 显示的 lookup_condition 条件中的 = 符号前后添加了空格,以及在使用 EXPLAIN FORMAT=TREE 时显示的 operation 中的空格。(Bug #36825515)

EXPLAIN FORMAT=TREE 的输出现在包括有关使用的半连接策略(如果有)的信息。(Bug #36773414)

当 explain_json_format_version 设置为 2 时,在 EXPLAIN FORMAT=JSON 输出中添加了“multi_range_read”:true,只要 MRR 用于 MRR 和索引范围扫描访问路径。此外,对于使用 MRR 的索引范围扫描,EXPLAIN FORMAT=TREE 输出中的操作字段中现在会出现(Multi-Range Read)。(Bug #36614948)

此版本实现了以下两个状态变量,用于跟踪从内存到磁盘的内部临时表转换:TempTable_count_hit_max_ram 计算由于 TempTable 存储引擎达到 temptable_max_ram 限制而导致的内存到磁盘表转换次数。这只是一个全局状态变量。Count_hit_tmp_table_size 计算由于 TempTable 存储引擎达到 tmp_table_size 限制或由于 MEMORY 存储引擎达到 tmp_table_size 和 max_heap_table_size 中较小的值而导致的内存到磁盘转换次数。这既是全局变量,也是会话状态变量。(WL #16377)

TOTAL_ROW_VERSIONS 的最大值从 64 更改为 255。通过使用 INSTANT ALGORITHM 执行 ADD COLUMN 和 DROP COLUMN 操作,此值会增加。 (WL #16369)

以上就是全部内容。

Have a nice day ~

– / END / –

  • Title: MySQL 9.1.0创新版发布!MySQL 8.0.40,8.4.3小版本迭代
  • Author: ShawnYan
  • Created at: 2024-10-16 21:00:00
  • Updated at: 2024-10-16 21:00:00
  • Link: https://shawnyan.cn/2024/mysql/mysql-9-1-0-release/
  • License: This work is licensed under CC BY-NC-SA 4.0.
if (hexo-config('comment.enable') == true && hexo-config('comment.system') != "") { if (hexo-config('comment.system') == "waline") { @require "./waline.styl" } else if (hexo-config('comment.system') == "gitalk") { @require "./gitalk.styl" } else if (hexo-config('comment.system') == "twikoo") { @require "./twikoo.styl" } } .comments-container display inline-block margin-top $spacing-unit width 100% #comment-anchor width 100% height 10px .comment-area-title width 100% margin 10px 0 font-size 1.38rem color var(--default-text-color) font-family 'Consolas', '宋体', sans-serif font-weight bold i color var(--default-text-color) +redefine-tablet() margin 5px 0 font-size 1.2rem