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
有助于提升组复制的性能。
新增参数 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 复制相关的一些变量被移除,具体如下:
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『转发』吧,这对我非常重要,感谢!(๑˃̵ᴗ˂̵)