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 复制相关的一些变量被移除,具体如下:

  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 --

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

本文由mdnice多平台发布


严少安
6 声望3 粉丝

DBA