MySQL 8.3 中的新增功能

内容纲要

一、MySQL 8.3 中添加的功能

MySQL 8.3 添加了以下功能:

1、MySQL 复制:标记 GTID

MySQL 复制和组复制中使用的全局事务标识符 (GID) 的格式已得到扩展,可以识别事务组,从而可以为属于特定事务组的 GTID 分配唯一的名称。例如,通过比较 GTID,可以轻松区分包含数据操作的事务和管理操作产生的事务。

2、新的 GTID 格式为 UUID:TAG:NUMBER

其中 TAG 是最多 8 个字符的字符串,通过将 gtid_next 系统变量的值设置为 < b3> ,在此版本中添加(有关标记格式和其他信息,请参阅变量的描述)。此标记对于源自当前会话的所有事务持续存在(除非使用 SET gtid_next 进行更改),并在此类事务的提交时应用,或者在使用组复制时在认证时应用。还可以将 gtid_next 设置为 UUID:TAG:NUMBER ,以将单个事务的 UUID 设置为任意值,并为其分配自定义标签。 UUID 和 NUMBER 的分配与以前的 MySQL 版本相比没有变化。无论哪种情况,用户都有责任确保标签对于给定的复制拓扑是唯一的。

GTID 的原始 UUID:NUMBER 格式继续保持不变,如在 MySQL 的早期版本中实现的那样;不需要使用 GTID 更改现有复制设置。

将 gtid_next 设置为 AUTOMATIC:TAG 或 UUID:TAG:NUMBER 需要此版本中添加的新 TRANSACTION_GTID_TAG 权限;这对于原始服务器以及副本应用程序线程的 PRIVILEGE_CHECKS_APPLIER 都是如此。这也意味着管理员现在可以将 SET @gtid_next=AUTOMATIC:TAG 或 UUID:TAG:NUMBER 的使用限制为一组所需的 MySQL 用户或角色,以便只有与给定数据或操作域相关的用户才能使用 SET @gtid_next=AUTOMATIC:TAG 或 UUID:TAG:NUMBER可以使用分配的标签提交新事务。

提示
从以前版本的 MySQL 升级到 MySQL 8.3 时,任何已拥有 BINLOG_ADMIN 权限的用户帐户或角色都会自动被授予 TRANSACTION_GTID_TAG 权限。

内置函数 GTID_SUBSET() 、 GTID_SUBTRACT() 和 WAIT_FOR_EXECUTED_GTID_SET() 与标记的 GTID 兼容。

有关详细信息,请参阅 gtid_next 系统变量和 TRANSACTION_GTID_TAG 权限的说明,以及第 17.1.4 节“更改在线服务器上的 GTID 模式”。

3、EXPLAIN FORMAT=JSON 格式版本控制

现在可以使用此版本中引入的explain_json_format_version 服务器系统变量在 EXPLAIN FORMAT=JSON 语句使用的 JSON 输出格式的 2 个版本之间进行选择。将此变量设置为 1 会导致服务器使用版本 1,这是一种线性格式,始终用于 MySQL 8.2 及更早版本中此类语句的输出。这是 MySQL 8.3 中的默认值和格式。将 explain_json_format_version 设置为 2 会导致使用版本 2 格式;这种 JSON 输出格式基于访问路径,旨在提供与未来版本的 MySQL 优化器更好的兼容性。

有关更多信息和示例,请参阅获取执行计划信息

4、Windows 上基于 SASL 的 LDAP 身份验证

在 Microsoft Windows 上,现在支持基于 SASL 的 LDAP 身份验证的服务器插件。这意味着 Windows 客户端现在可以使用 GSSAPI/Kerberos 通过 authentication_ldap_sasl_client 插件进行身份验证。

有关更多信息,请参阅基于 SASL 的 LDAP 身份验证

5、binlog_transaction_dependency_tracking 默认值的更改

binlog_transaction_dependency_tracking 服务器系统变量在 MySQL 8.2.0 中已被弃用。为了准备最终删除此变量,其默认值现在为 WRITESET 。没有计划替换该变量或其功能,预计稍后将其内置于服务器内部。

6、WITH_LD CMake 选项

定义是否使用llvm lld或mold链接器,否则使用标准链接器。 WITH_LD 还替换了 MySQL 8.3.0 中删除的 USE_LD_LLD CMake 选项。

7、MySQL 企业数据脱敏和去识别化

数据屏蔽组件添加了对指定专用模式来存储相关内部表和屏蔽函数的支持。以前, mysql 系统架构提供了唯一的存储选项。新的 component_masking.masking_database 只读变量允许在服务器启动时设置和保留备用架构名称。

8、线程池插件连接信息

在MySQL Performance Schema中添加了线程池连接信息,如下:

  • 添加了一个 tp_connections 表,其中包含有关每个线程池连接的信息。

  • 向 tp_thread_state 表中添加了以下列: TIME_OF_ATTACH 、 MARKED_STALLED 、 STATE 、 EVENT_COUNT 、 ACCUMULATED_EVENT_TIME 、 EXEC_COUNT 和 ACCUMULATED_EXEC_TIME

  • 向 tp_thread_group_state 表中添加了以下列: EFFECTIVE_MAX_TRANSACTIONS_LIMIT 、 NUM_QUERY_THREADS 、 TIME_OF_LAST_THREAD_CREATION 、 NUM_CONNECT_HANDLER_THREAD_IN_SLEEP 、 THREADS_BOUND_TO_TRANSACTION 、 QUERY_THREADS_COUNT 和 TIME_OF_EARLIEST_CON_EXPIRE 。

有关更多信息,请参阅第 5.6.3 节“MySQL Enterprise 线程池”和第 27.12.16 节“性能架构线程池表”。

9、信息架构 PROCESSLIST 表的使用情况

尽管 INFORMATION_SCHEMA.PROCESSLIST 表在 MySQL 8.0.35 和 8.2.0 中已被弃用,但人们仍然对跟踪其使用情况感兴趣。此版本添加了两个系统状态变量,提供有关访问 PROCESSLIST 表的信息,如下所示:

  • Deprecated_use_i_s_processlist_count 提供自服务器上次启动以来查询中对 PROCESSLIST 表的引用次数的计数。

  • Deprecated_use_i_s_processlist_last_timestamp 存储最后访问 PROCESSLIST 表的时间。这是一个时间戳值(自 Unix 纪元以来的微秒数)。

10、数据屏蔽字典的刷新

MySQL Enterprise Data Masking and De-Identification 组件现在能够将辅助副本或副本上的数据刷新到内存中。这可以通过此处描述的任一方式完成:

  • 用户可以使用此版本中添加的 masking_dictionaries_flush() 功能随时执行刷新。
  • 通过将新的 component_masking.dictionaries_flush_interval_seconds 系统变量设置为适当的值,可以将该组件配置为利用 Scheduler 组件定期刷新内存。

有关更多信息,请参阅第 6.5 节“MySQL Enterprise 数据屏蔽和去识别”以及这些项目的说明。

二、MySQL 8.3 中已弃用的功能

以下功能在 MySQL 8.3 中已弃用,并且可能会在未来的系列中删除。如果显示替代方案,则应更新应用程序以使用它们。

对于使用 MySQL 8.3 中已弃用且已在更高 MySQL 版本中删除的功能的应用程序,从 MySQL 8.3 源复制到运行更高版本的副本时,语句可能会失败,或者可能对源和副本产生不同的影响。为了避免此类问题,应修改使用 8.3 中已弃用功能的应用程序以避免这些问题,并尽可能使用替代方案。

2.1 组复制恢复元数据。

组复制恢复不再依赖于将视图更改事件写入二进制日志来标记组成员身份的更改;相反,当组的所有成员都是 MySQL 版本 8.3.0 或更高版本时,成员共享压缩的恢复元数据,并且当新成员加入组时不会记录此类事件(或分配 GTID)。

恢复元数据包括GCS视图ID、认证交易的 GTID_SET 、认证信息以及在线成员列表。

由于 View_change_log_event 在恢复中不再发挥作用,因此不再需要 group_replication_view_change_uuid 系统变量,因此现已弃用;预计它会在未来的 MySQL 版本中被删除。您应该知道,没有计划替换或替代此变量或其功能,并相应地开发您的应用程序。

三、MySQL 8.3 中删除的功能

以下项目已过时并已在 MySQL 8.3 中删除。如果显示替代方案,则应更新应用程序以使用它们。

对于使用 MySQL 8.3 中删除的功能的 MySQL 8.2 应用程序,从 MySQL 8.2 源复制到 MySQL 8.3 副本时,语句可能会失败,或者可能对源和副本产生不同的影响。为了避免此类问题,应修改使用 MySQL 8.3 中删除的功能的应用程序以避免这些问题,并尽可能使用替代方案。

3.1 删除了 C API 函数。

以下 MySQL C API 函数在以前的 MySQL 版本中已被弃用,现已被删除:

  • mysql_kill() :使用 mysql_real_query() 或 mysql_query() 来执行 KILL 语句。

  • mysql_list_fields() :使用 mysql_real_query() 或 mysql_query() 来执行 SELECT FROM table LIMIT 0 。 (这大致相当于在使用 --column-type-info 选项启动 mysql 客户端后执行该语句。)MYSQL_FIELD 结构的 char def 成员仅由该函数使用,也已被删除。

  • mysql_list_processes() :使用 mysql_real_query() 或 mysql_query() 来执行 SHOW PROCESSLIST 语句。

  • mysql_refresh() :使用 mysql_real_query() 或 mysql_query() 来执行 FLUSH 语句。由于删除了此功能,mysqladmin flash-threads 命令也被删除。

  • mysql_reload() :使用 mysql_real_query() 或 mysql_query() 来执行 FLUSH PRIVILEGES 语句。

  • mysql_shutdown() :使用 mysql_real_query() 或 mysql_query() 来执行 SHUTDOWN 语句。

mysql_shutdown() 在 MySQL 8.0 中已弃用;列出的其余函数在 MySQL 5.7.11 中已弃用。

由于这些更改,MySQL C API 库版本从 22.1 提升到 23.0。

3.2 FLUSH HOSTS 语句

FLUSH HOSTS 语句在 MySQL 8.0.23 中已弃用,已被删除。要清除主机缓存,请发出 TRUNCATE TABLE performance_schema.host_cache 或 mysqladminlush-hosts。

过时的复制选项和变量。许多与 MySQL 复制相关的选项和变量在以前的 MySQL 版本中已被弃用,并已从 MySQL 8.3 中删除。现在尝试使用其中任何一个都会导致服务器引发语法错误。这些选项和变量列于此处:

  • --slave-rows-search-algorithms :复制应用程序在应用更新或删除时用于查找表行的算法现在始终为 HASH_SCAN,INDEX_SCAN ,并且用户不再可配置。

  • log_bin_use_v1_events :这允许运行 MySQL 5.7 及更高版本的源服务器复制到不再支持或维护的早期版本的 MySQL。

  • --relay-log-info-file 、 --relay-log-info-repository 、 --master-info-file 、 --master-info-repository :应用者元数据存储库和连接元数据存储库的文件使用已被取代崩溃安全表,并且不再受支持。请参阅第 17.2.4.2 节“复制元数据存储库”。

  • transaction_write_set_extraction

  • group_replication_ip_whitelist :使用 group_replication_ip_allowlist 代替。

  • group_replication_primary_member :不再需要;请检查性能架构 replication_group_members 表的 MEMBER_ROLE 列。

3.3 --skip-host-cache 服务器选项

该选项已被删除;使用 --host-cache-size=0 启动服务器。请参阅第 5.1.12.3 节“DNS 查找和主机缓存”。

3.4 --innodb 和 --skip-innodb 服务器选项

这些选项已被删除。 InnoDB 存储引擎始终处于启用状态,并且无法禁用它。

3.5 --character-set-client-handshake 和 --old-style-user-limits 服务器选项

这些选项以前用于与非常旧的 MySQL 版本兼容,这些版本不再受支持或维护,因此不再有任何有用的用途。

3.6 过时的 CMake 选项。以下用于使用 CMake 编译服务器的选项已过时并已被删除:

  • USE_LD_LLD :使用 WITH_LD=lld 代替。

  • WITH_BOOST 、 DOWNLOAD_BOOST 、 DOWNLOAD_BOOST_TIMEOUT :不再需要这些选项; MySQL 现在在从源代码编译时包含并使用捆绑版本的 Boost。

3.7 基于 GTID 的复制和 IGNORE_SERVER_IDS

当使用全局事务标识符 (GTID) 进行复制时,已应用的事务将被自动忽略。这意味着 IGNORE_SERVER_IDS 与GTID模式不兼容。如果 gtid_mode 是 ON ,则带有非空 IGNORE_SERVER_IDS 列表的 CHANGE REPLICATION SOURCE TO 将被拒绝并出现错误。同样,如果使用要忽略的服务器 ID 列表创建任何现有复制通道, SET gtid_mode=ON 也会被拒绝。在开始基于 GTID 的复制之前,检查并清除所涉及服务器上任何被忽略的服务器 ID 列表;您可以通过检查 SHOW REPLICA STATUS 的输出来完成此操作。在这种情况下,您可以通过发出带有空服务器 ID 列表的 CHANGE REPLICATION SOURCE TO 来清除列表,如下所示:

CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = ();

有关详细信息,请参阅第 17.1.3.7 节“使用 GTID 进行复制的限制”。

3.8 二进制日志事务依赖性跟踪和日志记录格式

使用写入集信息进行冲突检测已被发现会导致依赖性跟踪问题;因此,我们现在将冲突检查的写入集的使用限制为基于行的日志记录生效时。

这意味着,从此版本开始,如果 binlog_transaction_dependency_tracking 设置为 WRITESET 或 WRITESET_SESSION ,则 binlog_format 必须为 ROW 。

四、信息来源

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注

close
arrow_upward