MySQL 升级:MySQL Server 变更详解 (8.0.32 ~ 8.0.33)

MySQL 升级:MySQL Server 变更详解 (8.0.32 ~ 8.0.33)

ShawnYan Lv.6

MySQL Server 的持续更新为数据库管理员和开发者带来了一系列的改进、新特性和安全性增强。

2023 年上半年,MySQL Server 共发布了两个版本:

  1. MySQL 8.0.32 (2023-01-17)
  2. MySQL 8.0.33 (2023-04-18)

本文将详细探讨 MySQL 8.0.32 和 8.0.33,这两个版本的关键变更,帮助用户了解这些更新对现有系统可能产生的影响,并为升级做好准备。

重要变更

  1. 在 8.0.32 中,系统变量 max_join_size 的行为得到了修正,现在它直接限制基础表中的最大行访问次数,而不是之前的估计成本。
    如果估算需要从基础表中读取更多行,将引发错误。这一变更使得该变量的行为与其文档描述更加一致,有助于防止大型查询的意外执行。

  2. 在 8.0.32 中,新增系统变量 explain_format,可选值为 TRADITIONAL (默认),JSON,TREE。

扩展

explain_format 用在显示查询执行计划,缺少 FORMAT 选项时,EXPLAIN 使用的默认输出格式。

举个栗子,系统变量 explain_format 已经预设为 json 格式,查看执行计划的输出格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> select @@explain_format;
+------------------+
| @@explain_format |
+------------------+
| JSON |
+------------------+
1 row in set (0.00 sec)

mysql> explain select 1\G
*************************** 1. row ***************************
EXPLAIN: {
"query_block": {
"select_id": 1,
"message": "No tables used"
}
}
1 row in set, 1 warning (0.00 sec)

Note (Code 1003): /* select#1 */ select 1 AS `1`
mysql>

InnoDB 引擎

在 MySQL 8.0.32 中,修复了如下问题:

  1. 修复了从 8.0.28 版本升级后可能出现的未检测到的问题、崩溃和损坏。
  2. 新增列使用 ALGORITHM=INSTANT 时,如果行的最大可能大小超过行大小限制,将失败。
  3. 修复了 SHOW ENGINE INNODB STATUS 中的乱码 UTF 字符问题。
  4. 实现了多个自适应哈希索引 adaptive hash index(AHI)代码优化和改进。

复制

在 MySQL 8.0.32 中,修复了如下问题:

  1. 修复了 SOURCE_HEARTBEAT_PERIOD 设置过小时(比如 1 ms)的二进制日志转储问题。
  2. 修复了设置 --server-id=0 后尝试更改服务器 ID 导致的一系列问题。
  3. 修复了压缩二进制日志事件复制时的中继日志位置更新问题。

扩展

SOURCE_HEARTBEAT_PERIODCHANGE REPLICATION SOURCE TO 语句的一个选项,
用于控制心跳间隔,如果连接仍然良好,则停止在没有数据的情况下发生连接超时。
间隔为 0 时,表示完全禁用心跳。

JSON 函数

在 MySQL 8.0.32 中,修复了如下问题:

  1. 修复了 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 函数在保存结果时丢失数据类型信息的问题。

性能改进

  1. MySQL 8.0.32,改进了内部临时表的资源分配处理。

扩展

MySQL 的内部临时表分为 In-Memory 和 On-Disk 两种,
其中,In-Memory 内部临时表可用 TempTable 和 MEMORY 两种存储引擎。

1
2
3
4
5
6
7
mysql> select @@internal_tmp_mem_storage_engine;
+-----------------------------------+
| @@internal_tmp_mem_storage_engine |
+-----------------------------------+
| TempTable |
+-----------------------------------+
1 row in set (0.00 sec)

On-Disk 内部临时表可用 InnoDB 和 MyISAM 两种存储引擎,从 MySQL 8.0.16 开始,只能用 InnoDB 引擎。
且系统参数 internal_tmp_disk_storage_engine 被移除。

  1. 新增了 Performance Schema Server Telemetry Traces 服务,提供了一种插件和组件检索与 SQL 语句生命周期相关通知的方式。

扩展

在 MySQL 8.0.33 版本中,搭配新的遥测功能,而新增了 TELEMETRY_LOG_ADMIN 权限,它允许用户配置和管理遥测日志。
遥测日志是 MySQL 服务器的一个功能,它可以记录有关服务器操作和性能的详细信息,这些信息对于监控、诊断和优化数据库性能非常有用。

拥有 TELEMETRY_LOG_ADMIN 权限的用户可以执行以下操作:

  1. 配置遥测日志:用户可以设置遥测日志的配置参数,例如启用或禁用遥测日志记录、设置日志级别、指定日志文件的位置等。
  2. 管理遥测日志数据:用户可以查看、旋转(切换)遥测日志文件,以及执行与遥测日志相关的其他管理任务。
  3. 访问遥测日志信息:用户可以查询遥测日志中记录的数据,以便进行分析和报告。

需要注意的是,TELEMETRY_LOG_ADMIN 权限是由 telemetry_log 插件定义的,该插件在 MySQL HeatWave 服务上部署时独家使用。
这意味着,这个权限主要与 MySQL HeatWave 相关的环境和部署有关,可能不适用于所有 MySQL 部署。

在实际使用中,管理员可以根据需要将 TELEMETRY_LOG_ADMIN 权限授予给需要管理遥测日志的用户,以便他们能够有效地监控和维护数据库系统。

依赖库

  1. MySQL 8.0.32,升级了捆绑的 zlib 库到 1.2.13 版本。
  2. 二进制包中包含的 curl 已升级至 7.86.0 版本。
  3. MySQL 8.0.33,对于捆绑 OpenSSL 库的平台,MySQL Server 链接的 OpenSSL 库已更新至 1.1.1t 版本。

审计 (MySQL Enterprise Audit)

  1. MySQL 8.0.33,新的 audit_log_database 系统变量允许在全局模式命名空间中的其他数据库指定为审计日志的存储位置,默认为 mysql 库。

比如,可以新建一个专门用于审计的 audit 库,将审计日志存放于该库中。

1
select * from audit.audit_log_user;

组件

  1. MySQL 8.0.32,MySQL Enterprise Edition 现在提供基于组件的数据掩码和去标识化功能,而不是基于插件库。

  2. MySQL 8.0.33,INSTALL COMPONENT 现在包括 SET 子句,可以在安装一个或多个组件时设置组件系统变量的值。

例如,

1
2
INSTALL COMPONENT 'file://component1', 'file://component2' 
SET GLOBAL component1.var1 = 12 + 3, PERSIST component2.var2 = 'strings';

总结

随着 MySQL Server 8.0.32 到 8.0.33 的发布,用户可以期待更稳定、安全和高效的数据库操作体验。

在升级到此版本之前,建议用户详细阅读发布说明,评估影响,并在生产环境中进行充分的测试。

对于弃用的功能,用户应当开始规划迁移到其他支持的功能或方法上,以确保平滑过渡到未来的 MySQL 版本。

– END –

logo.jpg

如果这篇文章为你带来了灵感或启发,就帮忙点『赞』or『在看』or『转发』吧,这对我非常重要,感谢!(๑˃̵ᴗ˂̵)

  • Title: MySQL 升级:MySQL Server 变更详解 (8.0.32 ~ 8.0.33)
  • Author: ShawnYan
  • Created at: 2023-03-17 21:00:00
  • Updated at: 2023-03-17 21:00:00
  • Link: https://shawnyan.cn/2023/mysql/mysql-upgrade-change-2023-1/
  • 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