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 长期支持版本。
这在源码的编译文件中也有所体现。
# 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>
进行控制。
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 优化器更好的兼容性。
示例如下:
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)
再例,查看分区表的执行计划:
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 复制相关的一些变量被移除,具体如下:
-
log_bin_use_v1_row_events
该参数从 MySQL 8.0.18 被废弃,曾用于 MySQL 5.5 及更早的版本,表示 v1 binlog 日志行事件。
-
master_info_repository
该参数从 MySQL 8.0.23 被废弃,默认情况下,将复制连接的元信息写入 mysql.slave_master_info
表。
之前写入文件的选项也已经从 MySQL 8.0.18 被废弃。
-
relay_log_info_repository
同上。
-
relay_log_info_file
该参数从 MySQL 8.0.18 被废弃,在 8.3.0 中被移除。
-
slave_rows_search_algorithms
用于副本批处理的搜索算法,控制是否使用索引扫描和 HASH 扫描。从 MySQL 8.0.18 被废弃。
默认设定为使用索引扫描,然后进行哈希扫描,这适用于全场景,且是最佳性能方式。
-
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 --
如果这篇文章为你带来了灵感或启发,就帮忙点『赞』or『在看』or『转发』吧,这对我非常重要,感谢!(๑˃̵ᴗ˂̵)
本文由 mdnice 多平台发布