【MySQL 8.x】MySQL Server 8.3.0 重要变更解析

【MySQL 8.x】MySQL Server 8.3.0 重要变更解析

ShawnYan Lv.6

MySQL Server 8.3.0 Innovation 版本是 MySQL 8.x 系列最后一个创新版本,下个月即将迎来 MySQL 8.4.0 LTS 长期支持版本。

关于发版模型变更,在之前的文章 重磅!MySQL 8.1.0 已来! 中已有所介绍。

这里补充一点,对于 MySQL 8.x 系列,8.4.x 将作为 LTS 长期支持版本,而从 9.x 开始,9.7.x 将作为 LTS 长期支持版本。

这在源码的编译文件中也有所体现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Versions like 8.0.x, 8.4.x, and x.7.y (x > 8) should be LTS
IF ((MAJOR_VERSION EQUAL "8" AND MINOR_VERSION EQUAL "0" AND PATCH_VERSION GREATER "34") OR
(MAJOR_VERSION EQUAL "8" AND MINOR_VERSION EQUAL "4") OR
(MAJOR_VERSION GREATER "8" AND MINOR_VERSION EQUAL "7"))
IF (NOT MYSQL_VERSION_STABILITY STREQUAL "\"LTS\"")
MESSAGE(FATAL_ERROR "Version ${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION} should "
"be an LTS release.")
ENDIF()
ELSE()
IF (NOT MYSQL_VERSION_STABILITY STREQUAL "\"INNOVATION\"")
MESSAGE(FATAL_ERROR "Version ${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION} should "
"be an innovation release.")
ENDIF()
ENDIF()

言归正传,接下来一起来看下 MySQL 8.3.0 都有哪些变化。

1. 平台支持

随着时间的推移,MySQL 支持的平台发生了变化,例如:

  • 8.3 不再支持 Oracle Linux 6 / Red Hat Enterprise Linux 6 / CentOS 6
  • 8.3 不再支持 Microsoft Windows 10

2. 新特性

在认证方面,Windows 平台上现在支持基于 SASL 的 LDAP 认证,这为使用 Windows 客户端程序的用户提供了更多选择。

MySQL 企业版数据掩码和去标识化组件新增了将数据刷新到内存的能力,这有助于提高数据处理的效率。

同时,MySQL 企业版还新增了使用 OpenTelemetry 格式收集服务器指标数据的遥测功能,这对于监控和优化服务器性能非常有用。

3. 复制

复制 with GTID 方面,扩展了全局事务标识符(GTID)的格式,以支持通过标签标识事务组,增强了对复制和组复制中事务的识别和管理。

新 GTID 格式为 UUID:<TAG>:NUMBER,该功能通过系统参数 gtid_next=AUTOMATIC:<TAG> 进行控制。

1
2
3
4
5
6
7
8
9
10
11
12
mysql> set gtid_next='AUTOMATIC:tag_shawnyan';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'gtid%';
+----------------------------------+-------------------------------------------------------+
| Variable_name | Value |
+----------------------------------+-------------------------------------------------------+
| gtid_executed | bdb6b1eb-eb90-11ee-ae1d-0242ac110002:tag_shawnyan:1-2 |
| gtid_executed_compression_period | 0 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC:tag_shawnyan |
...

MySQL 8.3 还解决了与复制和组复制相关的多个问题。

例如,现在 group_replication_set_as_primary() 函数在选举新的主节点之前会等待 DDL 和 DCL 语句完成,这有助于确保数据的一致性和完整性。

同时,还修复了一些可能导致内存泄漏、错误监控线程和锁问题的问题。

4. 系统参数

MySQL 8.3.0 有 1 个系统参数的默认值发生变更,新增 1 个参数,移除 6 个参数。

1. binlog_transaction_dependency_tracking

该系统变量在 MySQL 8.2.0 中已弃用。为了准备最终删除这个变量,它的默认值由 COMMIT_ORDER 变更为 WRITESET

binlog_transaction_dependency_tracking 设置为 WRITESET 有助于提升组复制的性能。

2. explain_json_format_version

新增参数 explain_json_format_version,用于指定 EXPLAIN FORMAT = JSON 语句使用的 JSON 输出格式。

默认值为 1,表示传统输出格式,与之前样式保持一致。

可以设定为 2,表示基于路径访问的新格式,用于提供与未来版本的 MySQL 优化器更好的兼容性。

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
mysql> explain table t1\G
*************************** 1. row ***************************
EXPLAIN: {
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "0.35"
},
"table": {
"table_name": "t1",
"access_type": "ALL",
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "0.25",
"eval_cost": "0.10",
"prefix_cost": "0.35",
"data_read_per_join": "224"
},
"used_columns": [
"id",
"n1",
"n2"
]
}
}
}
1 row in set, 1 warning (0.00 sec)

Note (Code 1003): /* select#1 */ select `s1`.`t1`.`id` AS `id`,`s1`.`t1`.`n1` AS `n1`,`s1`.`t1`.`n2` AS `n2` from `s1`.`t1`
mysql> set explain_json_format_version = 2;
Query OK, 0 rows affected (0.00 sec)

mysql> explain table t1\G
*************************** 1. row ***************************
EXPLAIN: {
"query": "/* select#1 */ select `s1`.`t1`.`id` AS `id`,`s1`.`t1`.`n1` AS `n1`,`s1`.`t1`.`n2` AS `n2` from `s1`.`t1`",
"operation": "Table scan on t1",
"table_name": "t1",
"access_type": "table",
"schema_name": "s1",
"used_columns": [
"id",
"n1",
"n2"
],
"estimated_rows": 1.0,
"estimated_total_cost": 0.35
}
1 row in set (0.02 sec)

再例,查看分区表的执行计划:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
mysql> set explain_json_format_version = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> explain select CUSTOMER_ID, TRADE_D from tp where TRADE_D = '2024-01-01'\G
*************************** 1. row ***************************
EXPLAIN: {
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "0.45"
},
"table": {
"table_name": "tp",
"partitions": [
"p202401"
],
"access_type": "ref",
"possible_keys": [
"PRIMARY",
"idx_tp"
],
"key": "idx_tp",
"used_key_parts": [
"TRADE_D"
],
"key_length": "5",
"ref": [
"const"
],
"rows_examined_per_scan": 2,
"rows_produced_per_join": 2,
"filtered": "100.00",
"using_index": true,
"cost_info": {
"read_cost": "0.25",
"eval_cost": "0.20",
"prefix_cost": "0.45",
"data_read_per_join": "128"
},
"used_columns": [
"CUSTOMER_ID",
"TRADE_D"
]
}
}
}
1 row in set, 1 warning (0.00 sec)

Note (Code 1003): /* select#1 */ select `s1`.`tp`.`CUSTOMER_ID` AS `CUSTOMER_ID`,`s1`.`tp`.`TRADE_D` AS `TRADE_D` from `s1`.`tp` where (`s1`.`tp`.`TRADE_D` = TIMESTAMP'2024-01-01 00:00:00')
mysql>

mysql> set explain_json_format_version = 2;
Query OK, 0 rows affected (0.00 sec)

mysql> explain select CUSTOMER_ID, TRADE_D from tp where TRADE_D = '2024-01-01'\G
*************************** 1. row ***************************
EXPLAIN: {
"query": "/* select#1 */ select `s1`.`tp`.`CUSTOMER_ID` AS `CUSTOMER_ID`,`s1`.`tp`.`TRADE_D` AS `TRADE_D` from `s1`.`tp` where (`s1`.`tp`.`TRADE_D` = TIMESTAMP'2024-01-01 00:00:00')",
"covering": true,
"operation": "Covering index lookup on tp using idx_tp (TRADE_D=TIMESTAMP'2024-01-01 00:00:00')",
"index_name": "idx_tp",
"table_name": "tp",
"access_type": "index",
"schema_name": "s1",
"used_columns": [
"CUSTOMER_ID",
"TRADE_D"
],
"estimated_rows": 2.0,
"lookup_condition": "TRADE_D=TIMESTAMP'2024-01-01 00:00:00'",
"index_access_type": "index_lookup",
"estimated_total_cost": 0.45164473684210527
}
1 row in set (0.00 sec)

可以看到新格式的执行计划更加简洁,不过没有显示查询具体命中哪个分区。

3. 移除的系统变量

MySQL 8.3.0 中,与 MySQL 复制相关的一些变量被移除,具体如下:

  1. log_bin_use_v1_row_events

该参数从 MySQL 8.0.18 被废弃,曾用于 MySQL 5.5 及更早的版本,表示 v1 binlog 日志行事件。

  1. master_info_repository

该参数从 MySQL 8.0.23 被废弃,默认情况下,将复制连接的元信息写入 mysql.slave_master_info 表。

之前写入文件的选项也已经从 MySQL 8.0.18 被废弃。

  1. relay_log_info_repository

同上。

  1. relay_log_info_file

该参数从 MySQL 8.0.18 被废弃,在 8.3.0 中被移除。

  1. slave_rows_search_algorithms

用于副本批处理的搜索算法,控制是否使用索引扫描和 HASH 扫描。从 MySQL 8.0.18 被废弃。

默认设定为使用索引扫描,然后进行哈希扫描,这适用于全场景,且是最佳性能方式。

  1. transaction_write_set_extraction

该系统变量指定用于对事务期间提取的写入进行哈希处理的算法。从 MySQL 8.0.26 被废弃。

当开启组复制时,transaction_write_set_extraction 需要设定为 XXHASH64,用于事务冲突检测和认证。

该参数的另外一个值为 MURMUR32,是 32 位算法,不适用于大负荷场景,不建议使用。

总结

总的来说,MySQL 8.3.0 版本的发布为用户提供了更稳定、更高效、更安全的数据库解决方案。

期待,MySQL 8.4.0 LTS 的到来。

– END –

logo.jpg

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

  • Title: 【MySQL 8.x】MySQL Server 8.3.0 重要变更解析
  • Author: ShawnYan
  • Created at: 2024-03-23 21:00:00
  • Updated at: 2024-03-23 21:00:00
  • Link: https://shawnyan.cn/2024/mysql/mysql-8-3-0-important-change/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments