MySQL 8.4 参考手册  /  一般信息  /  自 MySQL 8.0 后 MySQL 8.4 的新增功能

1.4 自 MySQL 8.0 后 MySQL 8.4 的新增功能

本节概述了自 MySQL 8.0 后,MySQL 8.4 中添加、弃用、更改和删除的内容。附带的一节列出了 MySQL 8.4 中添加、弃用或删除的 MySQL 服务器选项和变量;请参阅 第 1.5 节“自 8.0 后 MySQL 8.4 中添加、弃用或删除的服务器和状态变量及选项”

MySQL 8.4 中添加或更改的功能

MySQL 8.4 中添加了以下功能

  • MySQL 原生密码身份验证更改。从 MySQL 8.4.0 开始,默认情况下不再启用已弃用的 mysql_native_password 身份验证插件。要启用它,请使用 --mysql-native-password=ON(在 MySQL 8.4.0 中添加)启动服务器,或者在 MySQL 配置文件的 [mysqld] 部分中包含 mysql_native_password=ON(在 MySQL 8.4.0 中添加)。

    有关启用、使用和禁用 mysql_native_password 的更多信息,请参阅 第 8.4.1.1 节“原生可插拔身份验证”

  • InnoDB 系统变量默认值更改。在 MySQL 8.4.0 中,与 InnoDB 存储引擎相关的许多服务器系统变量的默认值已更改,如下表所示

    表 1.1 MySQL 8.4 中与 MySQL 8.0 不同的 InnoDB 系统变量默认值

    InnoDB 系统变量名称 新的默认值(MySQL 8.4) 以前的默认值(MySQL 8.0)
    innodb_buffer_pool_in_core_file 如果支持 MADV_DONTDUMP,则为 OFF,否则为 ON ON
    innodb_buffer_pool_instances

    如果 innodb_buffer_pool_size <= 1 GiB,则 innodb_buffer_pool_instances=1

    如果 innodb_buffer_pool_size > 1 GiB,则这是以下两个计算提示在 1-64 范围内的最小值

    8(如果 innodb_buffer_pool_size < 1 GiB,则为 1)
    innodb_change_buffering none all
    innodb_dedicated_server 如果 ON[a],则 innodb_flush_method 的值不再像 MySQL 8.0 中那样更改,但 innodb_redo_log_capacity 的计算从基于内存更改为基于 CPU。有关更多信息,请参阅 第 17.8.12 节“为专用 MySQL 服务器启用自动配置” OFF
    innodb_adaptive_hash_index OFF ON
    innodb_doublewrite_files 2 innodb_buffer_pool_instances * 2
    innodb_doublewrite_pages 128 innodb_write_io_threads,表示默认值为 4
    Linux 上的 innodb_flush_method 如果支持,则为 O_DIRECT,否则为 fsync fsync
    innodb_io_capacity 10000 200
    innodb_io_capacity_max 2 * innodb_io_capacity 2 * innodb_io_capacity,最小默认值为 2000
    innodb_log_buffer_size 67108864 (64 MiB) 16777216 (16 MiB)
    innodb_numa_interleave ON OFF
    innodb_page_cleaners innodb_buffer_pool_instances 4
    innodb_parallel_read_threads 可用逻辑处理器 / 8,最小默认值为 4 4
    innodb_purge_threads 如果可用逻辑处理器 <= 16,则为 1,否则为 4 4
    innodb_read_io_threads 可用逻辑处理器 / 2,最小默认值为 4 4
    innodb_use_fdatasync ON OFF
    temptable_max_ram 总内存的 3%,默认值在 1-4 GiB 范围内 1073741824 (1 GiB)
    temptable_max_mmap 0,表示 OFF 1073741824 (1 GiB)
    temptable_use_mmap[b] OFF ON

    [a] 此变量的实际默认值为 OFF;这与 MySQL 8.0 相同。

    [b] 在 MySQL 8.0.26 中已弃用。


  • 克隆插件。放宽了 克隆插件 的版本要求,允许在同一系列的不同小版本之间进行克隆。换句话说,只有主版本号和次版本号必须匹配,而以前小版本号也必须匹配。

    例如,克隆功能现在允许在 8.4.0 和 8.4.14 之间进行克隆,反之亦然。

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

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

  • MySQL 复制:SOURCE_RETRY_COUNT 更改。CHANGE REPLICATION SOURCE TO 语句的 SOURCE_RETRY_COUNT 选项的默认值已更改为 10。这意味着,使用此选项和 SOURCE_CONNECT_RETRY (60) 的默认值,副本会在重新连接尝试之间等待 60 秒,并以该速率继续尝试重新连接 10 分钟,然后才会超时并进行故障转移。

    此更改也适用于已弃用的 --master-retry-count 服务器选项的默认值。(您应该改用 SOURCE_RETRY_COUNT。)

    有关更多信息,请参阅 第 19.4.9.1 节“源的异步连接故障转移”

  • MySQL 复制:标记的 GTID。MySQL 复制和组复制中使用的全局事务标识符 (GID) 的格式已扩展为能够识别事务组,从而可以为属于特定事务组的 GTID 分配唯一名称。例如,包含数据操作的事务可以简单地通过比较其 GTID 来与管理操作产生的交易区分开来。

    新的 GTID 格式为 UUID:TAG:NUMBER,其中 TAG 是一个最多 8 个字符的字符串,通过将 gtid_next 系统变量的值设置为 AUTOMATIC:TAG 来启用,在本版本中添加(有关标签格式和其他信息,请参阅变量的描述)。此标记对于源自当前会话的所有事务都保持不变(除非使用 SET gtid_next 更改),并在提交时或使用组复制时在认证时应用于此类事务。还可以将 gtid_next 设置为 UUID:TAG:NUMBER,以便将单个事务的 UUID 设置为任意值,并为其分配自定义标记。否则,UUIDNUMBER 的分配与以前的 MySQL 版本没有区别。在任何一种情况下,用户都有责任确保标记对于给定的复制拓扑是唯一的。

    仍然支持 GTID 的原始 UUID:NUMBER 格式,其实现方式与以前版本的 MySQL 相同;不需要更改使用 GTID 的现有复制设置。

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

    注意

    从先前版本的 MySQL 升级到 MySQL 8.4 时,任何已具有 BINLOG_ADMIN 权限的用户帐户或角色都会自动获得 TRANSACTION_GTID_TAG 权限。

    内置函数 GTID_SUBSET()GTID_SUBTRACT()WAIT_FOR_EXECUTED_GTID_SET() 与带标签的 GTID 兼容。

    有关更多信息,请参阅 gtid_next 系统变量和 TRANSACTION_GTID_TAG 权限的说明,以及 “第 19.1.4 节“更改联机服务器上的 GTID 模式””

  • 复制:SQL_AFTER_GTIDS 和 MTA。 START REPLICA 语句选项 SQL_AFTER_GTIDS 现在与多线程应用程序兼容。(以前,当启用 MTA 并且用户尝试使用此选项时,该语句会引发警告 ER_MTA_FEATURE_IS_NOT_SUPPORTED,并且副本会切换到单线程模式。)这意味着需要赶上丢失事务的副本现在可以这样做,而不会失去多线程带来的性能优势。

    有关更多信息,请参阅 “第 15.4.2.4 节“START REPLICA 语句”” 以及 replica_parallel_workers 系统变量的文档。另请参阅 “第 19.2.3.2 节“监控复制应用工作线程””“第 25.7.11 节“使用多线程应用程序的 NDB 集群复制””

  • 复制术语向后兼容性。 此版本为 mysqldump 添加了 --output-as-version 选项。此选项允许您从 MySQL 8.2 或更新版本的服务器创建与旧版本 MySQL 兼容的转储;它的值(此处列出的值之一)决定了转储中使用的复制术语的兼容性

    • SERVER:获取服务器的版本并使用与该 MySQL 版本兼容的最新版本的复制语句和变量名称。

    • BEFORE_8_2_0:输出与运行版本 8.0.23 到 8.1.0(含)的 MySQL 服务器兼容。

    • BEFORE_8_0_23:输出与运行 8.0.23 之前版本的 MySQL 服务器兼容。

    有关更多信息,请参阅此选项的说明。

    此外,terminology_use_previous 系统变量已允许的值中添加了一个新值。BEFORE_8_2_0 导致服务器在 SHOW CREATE EVENT 的输出中打印 DISABLE ON SLAVE(现在已弃用),而不是 DISABLE ON REPLICA。现在,现有值 BEFORE_8_0_26 除了之前已经具有的效果外,还具有此效果。

  • 版本特定注释中使用的 MySQL 版本号支持由一位或两位数字组成的主版本;这意味着整个版本可以是五位或六位数字长。有关此更改如何影响 MySQL 中版本化注释处理的更多信息,请参阅 “第 11.7 节“注释””

  • group_replication_set_as_primary() 和 DDL 语句。 group_replication_set_as_primary() 函数在等待所有事务完成之前等待正在进行的 DDL 语句(例如 ALTER TABLE),然后再选举新的主服务器。

    有关更多信息,请参阅此函数的说明。

  • group_replication_set_as_primary() 的 DDL 和 DCL 语句跟踪。 在选举新的主服务器之前,group_replication_set_as_primary() 现在等待以下语句完成

    这些是添加到 MySQL 8.1 中的语句或在这方面已经支持的语句。有关更多信息(包括 MySQL 8.3 中所有此类受支持语句的列表),请参阅 group_replication_set_as_primary() 函数的说明。

  • 组复制变量默认值。 在 MySQL 8.4 中,与组复制相关的两个服务器系统变量的默认值已更改

    有关更多信息,请参阅 “第 20.5.3.2 节“配置事务一致性保证””“第 20.7.7 节“对故障检测和网络分区的响应””,以及列出的变量的说明。

  • 添加了许多特定于组复制插件的状态变量,这些变量改进了网络不稳定性的诊断和故障排除,为每个组成员提供了有关网络使用情况、控制消息和数据消息的统计信息。

    有关更多信息,请参阅 “第 20.9.2 节“组复制状态变量””

    作为这项工作的一部分,在性能架构 replication_group_communication_information 表中添加了一个新的 MEMBER_FAILURE_SUSPICIONS_COUNT 列。此列的内容格式化为一个 JSON 数组,其键是组成员 ID,其值是该组成员被视为可疑的次数。有关更多信息,请参阅此表的说明。

  • FLUSH_PRIVILEGES 权限。 MySQL 8.4.0 中添加了一个新权限,专门用于允许使用 FLUSH PRIVILEGES 语句。与 RELOAD 权限不同,FLUSH_PRIVILEGES 权限仅适用于 FLUSH PRIVILEGES 语句。

    在 MySQL 8.4 中,继续支持 RELOAD 权限以提供向后兼容性。

    升级时,会执行检查以查看是否有任何用户拥有 FLUSH_PRIVILEGES 权限;如果没有,则拥有 RELOAD 权限的任何用户也会自动获得新权限。

    如果从 MySQL 8.4(或更高版本)降级到不支持 FLUSH_PRIVILEGES 权限的 MySQL 版本,则以前被授予此权限的用户将无法执行 FLUSH PRIVILEGES 语句,除非该用户具有 RELOAD 权限。

  • OPTIMIZE_LOCAL_TABLE 权限。 MySQL 8.4.0 添加了一个新的 OPTIMIZE_LOCAL_TABLE 权限。用户必须具有此权限才能执行 OPTIMIZE LOCAL TABLEOPTIMIZE NO_WRITE_TO_BINLOG TABLE 语句。

    从以前的版本系列升级时,拥有 SYSTEM_USER 权限的用户会自动获得 OPTIMIZE_LOCAL_TABLE 权限。

  • MySQL Enterprise 数据屏蔽和去标识化。 数据屏蔽组件添加了对指定专用架构以存储相关的内部表和屏蔽函数的支持。以前,mysql 系统架构是唯一的存储选项。新的 component_masking.masking_database 只读变量允许在服务器启动时设置和持久化备用架构名称。

  • 刷新数据屏蔽字典。 MySQL Enterprise 数据屏蔽和去标识化组件现在包含将辅助服务器或副本上的数据刷新到内存中的功能。这可以通过以下两种方式中的任何一种来完成

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

  • **自动直方图更新。** MySQL 8.4.0 增加了对直方图自动更新的支持。如果为给定直方图启用了此功能,则每当在其所属表上运行 ANALYZE TABLE 时,该直方图都会更新。此外,InnoDB 对持久统计信息的自动重新计算(请参阅“第 17.8.10.1 节,“配置持久优化器统计信息参数””)也会更新直方图。直方图更新继续使用与最初指定时相同的桶数(如果有)。

    您可以在指定直方图时通过在 ANALYZE TABLE 语句中包含 AUTO UPDATE 选项来启用此功能。要禁用它,请改用 MANUAL UPDATE。如果未指定任何一个选项,则默认为 MANUAL UPDATE(无自动更新)。

    有关更多信息,请参阅直方图统计信息分析

  • 添加了 tls-certificates-enforced-validation 系统变量,它允许 DBA 在服务器启动时或使用 ALTER INSTANCE RELOAD TLS 语句在运行时重新加载证书时强制执行证书验证。启用强制执行后,发现无效证书会在启动时停止服务器调用,防止在运行时加载无效证书,并发出警告。有关更多信息,请参阅配置证书验证强制执行

  • 添加了服务器系统变量来控制使用 LDAP 可插拔身份验证连接到 MySQL 服务器的 MySQL 帐户在 LDAP 服务器关闭或无响应时必须等待的时间。以下基于简单和 SASL 的 LDAP 身份验证变量的默认超时变为 30 秒

    连接和响应超时只能通过 Linux 平台上的系统变量进行配置。有关更多信息,请参阅为 LDAP 可插拔身份验证设置超时

  • 增强了关闭过程的日志记录,添加了 MySQL 服务器、插件和组件的启动和关闭消息。现在还会记录此类消息以关闭连接。这些新增功能应该有助于解决问题和调试问题,尤其是在服务器关闭时间过长的情况下。

    有关更多信息,请参阅“第 7.4.2 节,“错误日志””

  • **服务器启动和关闭消息的添加。** 将以下类型的消息添加到服务器启动和关闭过程中,如下列表所示

    • 使用 --initialize--initialize-insecure 启动服务器时,服务器初始化的开始和结束消息;除了正常服务器启动和关闭期间显示的消息外,还包括这些消息。

    • InnoDB 初始化的开始和结束消息。

    • 服务器初始化期间执行初始化文件的开始和结束消息。

    • 服务器初始化期间执行编译语句的开始和结束消息。

    • 服务器启动期间崩溃恢复的开始和结束消息(如果发生崩溃恢复)。

    • 服务器启动期间动态插件初始化的开始和结束消息。

    • 组件初始化步骤的开始和结束消息(在服务器启动期间可见)。

    • 在服务器关闭期间,复制线程关闭以及连接线程正常和强制关闭的消息。

    • 服务器关闭期间插件和组件关闭的开始和结束消息。

    • 初始化或服务器关闭和结束期间关闭消息的退出代码(返回值)信息

    此外,如果服务器是使用 WITH_SYSTEMD 构建的,则服务器现在会在错误日志中包含每条 systemd 消息。

  • 添加了 SHOW PARSE_TREE 语句,它显示 SELECT 语句的 JSON 格式解析树。此语句仅用于测试和开发,不用于生产。它仅在调试版本中可用,或者如果 MySQL 是使用 CMake -DWITH_SHOW_PARSE_TREE 选项从源代码构建的,则不包含在发布版本中或不支持。

  • **线程池插件连接信息。** 将线程池连接信息添加到 MySQL 性能架构中,如下所示

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

    • 将以下列添加到 tp_thread_state 表中:TIME_OF_ATTACHMARKED_STALLEDSTATEEVENT_COUNTACCUMULATED_EVENT_TIMEEXEC_COUNTACCUMULATED_EXEC_TIME

    • 将以下列添加到 tp_thread_group_state 表中:EFFECTIVE_MAX_TRANSACTIONS_LIMITNUM_QUERY_THREADSTIME_OF_LAST_THREAD_CREATIONNUM_CONNECT_HANDLER_THREAD_IN_SLEEPTHREADS_BOUND_TO_TRANSACTIONQUERY_THREADS_COUNTTIME_OF_EARLIEST_CON_EXPIRE

    有关更多信息,请参阅“第 7.6.3 节,“MySQL 企业版线程池””,以及“第 29.12.16 节,“性能架构线程池表””

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

  • **集合操作的哈希表优化。** MySQL 8.2 通过新的哈希表优化提高了使用集合操作 EXCEPTINTERSECT 的语句的性能,该优化对此类语句自动启用,并通过设置 hash_set_operations 优化器开关进行控制;要禁用此优化并导致优化器使用先前版本 MySQL 中的旧临时表优化,请将此标志设置为 off

    可以通过设置 set_operations_buffer_size 服务器系统变量的值来控制为此优化分配的内存量;增加缓冲区大小可以进一步提高使用这些操作的某些语句的执行时间。

    有关更多信息,请参阅“第 10.9.2 节,“可切换优化””

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

  • **MySQL 企业版防火墙增强功能。** 自 MySQL 8.0 以来,对 MySQL 企业版防火墙进行了一些增强。这些列在下面

    • MySQL 企业版防火墙提供的存储过程现在以事务方式运行。当防火墙存储过程执行期间发生错误时,会报告错误,并且存储过程到那时为止所做的所有更改都将回滚。

    • 防火墙存储过程现在避免执行 DELETEINSERT 语句以及 INSERT IGNOREUPDATE 操作的不必要组合,从而减少了时间和资源消耗,使其更快、更高效。

    • 在 MySQL 8.0.26 中弃用的基于用户的存储过程和 UDF 现在会引发弃用警告。具体来说,调用 sp_set_firewall_mode()sp_reload_firewall_rules() 都会生成此类警告。有关更多信息,请参阅防火墙帐户配置文件存储过程,以及将帐户配置文件迁移到组配置文件

    • MySQL 企业版防火墙现在允许其内存缓存定期使用存储在防火墙表中的数据重新加载。mysql_firewall_reload_interval_seconds 系统变量设置在运行时使用的定期重新加载计划,或者默认情况下禁用重新加载。以前的实现仅在服务器启动或重新安装服务器端插件时重新加载缓存。

    • 添加了 mysql_firewall_database 服务器系统变量,以允许在自定义架构中存储内部表、函数和存储过程。

    • 添加了 uninstall_firewall.sql 脚本以简化删除已安装的防火墙的操作。

    有关防火墙存储过程的更多信息,请参阅MySQL 企业版防火墙存储过程

  • **可插拔身份验证。** 添加了对使用 WebAuthn 上下文中的智能卡、安全密钥和生物识别阅读器等设备对 MySQL 服务器进行身份验证的支持。新的 WebAuthn 身份验证方法基于 FIDO 和 FIDO2 标准。它使用一对插件,服务器端的 authentication_webauthn 和客户端的 authentication_webauthn_client。服务器端 WebAuthn 身份验证插件仅包含在 MySQL 企业版发行版中。

  • **密钥环迁移。** 支持从密钥环组件迁移到密钥环插件。要执行此类迁移,请使用 MySQL 8.4.0 中引入的 --keyring-migration-from-component 服务器选项,将 --keyring-migration-source 设置为源组件的名称,将 --keyring-migration-destination 设置为目标插件的名称。

    有关更多信息,请参阅使用迁移服务器进行密钥迁移

  • **MySQL 企业版审计。** 添加了 audit_log_filter_uninstall.sql 脚本以简化删除 MySQL 企业版审计的操作。

  • 新增关键字。 自 MySQL 8.0 后,MySQL 8.4 中新增的关键字。保留关键字用 (R) 标记。

    AUTOBERNOULLIGTIDSLOGMANUAL (R)、PARALLEL (R)、PARSE_TREEQUALIFY (R)、S3TABLESAMPLE (R)。

  • 抢占式组复制认证垃圾回收。 MySQL 8.4.0 中添加的系统变量 group_replication_preemptive_garbage_collection 启用以单主模式运行的组复制的抢占式垃圾回收,仅保留尚未提交的事务的写入集。这可以节省时间和内存消耗。另一个系统变量 group_replication_preemptive_garbage_collection_rows_threshold(也在 MySQL 8.4.0 中引入)设置了在启用抢占式垃圾回收时触发抢占式垃圾回收所需的认证行数的下限;默认值为 100000。

    在多主模式下,从事务认证到在所有成员上提交之前,都需要认证信息中的每个写入集,这使得检测事务之间的冲突成为必要。在单主模式下,我们只需要关心事务依赖关系,这不是问题;这意味着只需要保留写入集,直到认证完成。

    有关获取此进程消耗的内存信息的帮助,请参阅第 20.7.9 节“使用性能模式内存检测监控组复制内存使用情况”

  • 清理中继日志恢复。 在 MySQL 8.4.0 及更高版本中,可以使用任何已删除的不完整事务恢复中继日志。现在,当使用 --relay-log-recovery=OFF(默认值)启动服务器时,中继日志会被清理,这意味着将删除以下所有项目

    • 在中继日志末尾仍未完成的事务

    • 仅包含不完整事务或其部分内容的中继日志文件

    • 中继日志索引文件中对已删除的中继日志文件的引用

    有关更多信息,请参阅 relay_log_recovery 服务器系统变量的说明。

  • MySQL 升级历史记录文件。 作为 MySQL 8.4.0 及更高版本安装过程的一部分,将在服务器的数据目录中创建一个名为 mysql_upgrade_history 的 JSON 格式文件,如果该文件已存在,则会更新该文件。此文件包含有关已安装的 MySQL 服务器版本、安装时间以及版本是 LTS 系列的一部分还是创新系列的一部分的信息。

    典型的 mysql_upgrade_history 文件可能如下所示(格式已调整以提高可读性)

    {
      "file_format":"1",
    
      "upgrade_history":
      [
        {
          "date":"2024-03-15 22:02:35",
          "version":"8.4.0",
          "maturity":"LTS",
          "initialize":true
        },
    
        {
          "date":"2024-05-17 17:46:12",
          "version":"8.4.1",
          "maturity":"LTS",
          "initialize":false
        }
      ]
    
    }

    此外,安装过程现在会检查是否存在 mysql_upgrade_info 文件(在 MySQL 8.0 中已弃用,不再使用)。如果找到,则删除该文件。

MySQL 8.4 中弃用的功能

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

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

  • group_replication_allow_local_lower_version_join 系统变量。 group_replication_allow_local_lower_version_join 系统变量已弃用,设置它会导致记录警告(ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT)。

    您应该预料到此变量将在未来版本的 MySQL 中删除。由于设置 group_replication_allow_local_lower_version_join 所启用的功能不再有用,因此不打算对其进行替换。

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

    恢复元数据包括 GCS 视图 ID、已认证事务的 GTID_SET 和认证信息,以及在线成员列表。

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

  • WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() 函数。 WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() SQL 函数在 MySQL 8.0 中已弃用,并且从 MySQL 8.2 开始不再受支持。现在尝试调用此函数会导致语法错误。

    建议您使用 WAIT_FOR_EXECUTED_GTID_SET() 来代替 WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(),它允许您等待特定的 GTID。无论复制通道或用户客户端(指定的事务通过该通道到达服务器)如何,这都有效。

  • 基于 GTID 的复制和 IGNORE_SERVER_IDS。 当全局事务标识符 (GTID) 用于复制时,已应用的事务将被自动忽略。这意味着 IGNORE_SERVER_IDS 与 GTID 模式不兼容。如果 gtid_modeON,则具有非空 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 = ();

    有关更多信息,请参阅第 19.1.3.7 节“使用 GTID 进行复制的限制”

  • 二进制日志事务依赖项跟踪和日志记录格式。 已发现使用写入集信息进行冲突检测会导致依赖项跟踪出现问题;因此,我们现在将写入集用于冲突检查的情况限制为基于行的日志记录生效时。

    这意味着,在这种情况下,binlog_format 必须为 ROW,并且不再支持 MIXED

  • expire_logs_days 系统变量。 MySQL 8.0 中已弃用的 expire_logs_days 服务器系统变量已被删除。现在,尝试在运行时获取或设置此变量,或使用等效选项 (--expire-logs-days) 启动 mysqld,会导致错误。

    使用 binlog_expire_logs_seconds 代替 expire_logs_days,它允许您指定除整数天数之外的过期时间。

  • 数据库授权中的通配符。 在 MySQL 8.2.0 中,不推荐在数据库授权中使用字符 %_ 作为通配符。您应该预料到通配符功能将在未来的 MySQL 版本中删除,并且这些字符将始终被视为文字,就像在 partial_revokes 服务器系统变量的值为 ON 时一样。

    此外,在检查权限时,服务器将 % 视为 localhost 的同义词的做法现在在 MySQL 8.2.0 中也已弃用,因此可能会在未来的 MySQL 版本中删除。

  • --character-set-client-handshake 选项。 --character-set-client-handshake 服务器选项最初用于从非常旧版本的 MySQL 升级,现在已弃用,并且每当使用它时都会发出警告。您应该预料到此选项将在未来版本的 MySQL 中删除;依赖此选项的应用程序应尽快开始迁移。

  • 非标准外键。 在 MySQL 中,不推荐使用非唯一键或部分键作为外键。从 MySQL 8.4.0 开始,您必须通过将 restrict_fk_on_non_standard_key 设置为 OFF 或使用 --skip-restrict-fk-on-non-standard-key 启动服务器来显式启用此类键。

    restrict_fk_on_non_standard_key 默认值为 ON,这意味着尝试在 CREATE TABLE 或其他 SQL 语句中使用非标准键作为外键将被拒绝,并显示 ER_WARN_DEPRECATED_NON_STANDARD_KEY。将其设置为 ON 允许运行此类语句,但它们会引发相同的错误作为警告。

    即使存在包含引用非唯一键或部分键的外键的表,也支持从 MySQL 8.0 升级。在这种情况下,服务器会写入一个警告消息列表,其中包含引用非标准键的所有外键的名称。

MySQL 8.4 中删除的功能

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

对于使用 MySQL 8.4 中已删除的功能的 MySQL 8.3 应用程序,当从 MySQL 8.3 源复制到 MySQL 8.4 副本时,语句可能会失败,或者对源和副本的影响可能不同。为避免此类问题,应修改使用 MySQL 8.4 中已删除功能的应用程序以避免使用它们,并在可能的情况下使用替代方案。

  • 已删除的服务器选项和变量。 MySQL 8.4 中删除了以前版本的 MySQL 中支持的许多服务器选项和变量。尝试在 MySQL 8.4 中设置其中任何一个都会引发错误。这些选项和变量列举如下

    • binlog_transaction_dependency_tracking:在 MySQL 8.0.35 和 MySQL 8.2.0 中已弃用。没有计划替换此变量或其功能,该变量或其功能已成为服务器内部的。在 MySQL 8.4(及更高版本)中,当使用多线程副本时,源 mysqld 始终使用写入集为二进制日志生成依赖项信息;这与在以前版本的 MySQL 中将 binlog_transaction_dependency_tracking 设置为 WRITESET 具有相同的效果。

    • group_replication_recovery_complete_at:在 MySQL 8.0.34 中已弃用。在 MySQL 8.4 及更高版本中,分布式恢复过程中应用的策略始终是仅在新成员接收、认证并应用了加入组之前发生的所有事务后才将其标记为联机;这等效于在先前版本的 MySQL 中将 group_replication_recovery_complete_at 设置为 TRANSACTIONS_APPLIED

    • avoid_temporal_upgradeshow_old_temporals:这两个变量在 MySQL 5.6 中已弃用;它们在最近版本的 MySQL 中均不起作用。这两个变量都已被删除;目前没有替换它们的计划。

    • --no-dd-upgrade:在 MySQL 8.0.16 中已弃用,现已删除。请改用 --upgrade=NONE

    • --old--new:在 MySQL 8.0.35 和 MySQL 8.2.0 中已弃用,现已删除。

    • --language:在 MySQL 5.5 中已弃用,现已删除。

    • --ssl--admin-ssl 服务器选项以及 have_sslhave_openssl 服务器系统变量在 MySQL 8.0.26 中已弃用。它们在本版本中均已删除。请改用 --tls-version--admin-tls-version

    • 在 MySQL 8.0.27 中已弃用的 default_authentication_plugin 系统变量已从 MySQL 8.4.0 中删除。请改用 authentication_policy

      作为删除 default_authentication_plugin 的一部分,authentication_policy 的语法已更改。有关更多信息,请参阅 authentication_policy 的说明。

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

    • --innodb 和 --skip-innodb 服务器选项。 这些选项已删除。InnoDB 存储引擎始终启用,并且无法禁用。

    • --character-set-client-handshake 和 --old-style-user-limits 服务器选项。 这些选项以前用于与不再受支持或维护的非常旧版本的 MySQL 兼容,因此不再有任何用途。

    • FLUSH HOSTS 语句。 在 MySQL 8.0.23 中已弃用的 FLUSH HOSTS 语句已删除。要清除主机缓存,请发出 TRUNCATE TABLE performance_schema.host_cachemysqladmin flush-hosts

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

    • --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:将文件用于应用器元数据存储库和连接元数据存储库已被崩溃安全表取代,并且不再受支持。请参阅 第 19.2.4.2 节“复制元数据存储库”

    • transaction_write_set_extraction

    • group_replication_ip_whitelist:请改用 group_replication_ip_allowlist

    • group_replication_primary_member:不再需要;请改用检查性能模式 replication_group_members 表的 MEMBER_ROLE 列。

  • 复制 SQL 语法。 在早期版本的 MySQL 中已弃用的 MySQL 复制中使用的一些 SQL 语句在 MySQL 8.4 中不再受支持。尝试使用其中任何一个语句现在都会产生语法错误。这些语句可以分为两组:与源服务器相关的语句和与副本相关的语句,如下所示

    作为这项工作的一部分,CREATE EVENTALTER EVENTDISABLE ON SLAVE 选项现已弃用,并由 DISABLE ON REPLICA 取代。相应的术语 SLAVESIDE_DISABLED 现在也已弃用,并且不再用于事件描述中,例如在信息模式 EVENTS 表中;现在显示的是 REPLICA_SIDE_DISABLED

    前面列出的所有语句都已从 MySQL 测试程序和文件中删除,以及从任何其他内部使用中删除。

    此外,以前由 CHANGE REPLICATION SOURCE TOSTART REPLICA 支持的一些已弃用选项已被删除,并且服务器不再接受。接下来列出了从这些 SQL 语句中删除的选项。

    此外,作为这项工作的一部分,以下先前已弃用的服务器状态变量已被删除。它们在此处列出,以及它们的替代品

    • Com_slave_start:使用 Com_replica_start

    • Com_slave_stop:使用 Com_replica_stop

    • Com_show_slave_status:使用 Com_show_replica_status

    • Com_show_slave_hosts:使用 Com_show_replicas

    • Com_show_master_status:使用 Com_show_binary_log_status

    • Com_change_master:使用 Com_change_replication_source

    刚才列为已删除的变量不再出现在语句的输出中,例如 SHOW STATUS。另请参阅 Com_xxx 变量

  • 插件。  MySQL 8.4.0 中删除了许多插件,此处列出了这些插件,以及与它们关联的任何系统变量和其他功能,这些变量和功能也因插件删除而被删除或受到其他影响

  • 对弱密码的支持。  在配置加密连接时,MySQL 8.4.0 及更高版本不再允许指定任何不满足以下要求的密码

    • 符合正确的 TLS 版本(TLS v1.2 或 TLSv1.3,视情况而定)

    • 提供完美的前向保密性

    • 在密码、证书或两者中使用 SHA2

    • 在 GCM 或任何其他 AEAD 算法或模式中使用 AES

    这对设置以下系统变量有影响

    有关 MySQL 8.4 中这些变量的允许值以及更多信息,请参阅这些变量的描述。

    注意

    libmysqlclient 继续支持不满足这些条件的其他密码,以便保留连接到旧版本 MySQL 的能力。

  • INFORMATION_SCHEMA.TABLESPACES。  INFORMATION_SCHEMA.TABLESPACES 表(实际上未使用)已在 MySQL 8.0.22 中弃用,现在已被删除。

    注意

    对于 NDB 表,信息架构 FILES 表提供了表空间相关信息。

    对于 InnoDB 表,信息架构 INNODB_TABLESPACESINNODB_DATAFILES 表提供了表空间元数据。

  • DROP TABLESPACE 和 ALTER TABLESPACE:ENGINE 子句。  DROP TABLESPACEALTER TABLESPACE 语句的 ENGINE 子句已在 MySQL 8.0 中弃用。在 MySQL 8.4 中,它不再受支持,如果您尝试将它与 DROP TABLESPACEALTER TABLESPACE ... DROP DATAFILE 一起使用,则会导致错误。ENGINE 也不再受 ALTER TABLESPACE 的所有其他变体的支持,但此处列出的两个例外除外

    • ALTER TABLESPACE ... ADD DATAFILE ENGINE={NDB|NDBCLUSTER}

    • ALTER UNDO TABLESPACE ... SET {ACTIVE|INACTIVE} ENGINE=INNODB

    有关更多信息,请参阅这些语句的文档。

  • LOW_PRIORITY 和 LOCK TABLES ... WRITE。  LOCK TABLES ... WRITE 语句的 LOW_PRIORITY 子句自 MySQL 5.5 以来一直无效,并在 MySQL 5.6 中弃用。它在 MySQL 8.4 中不再受支持;将其包含在 LOCK TABLES 中现在会导致语法错误。

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

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

  • 捕获 EXPLAIN FORMAT=JSON 输出。  EXPLAIN FORMAT=JSON 使用 INTO 选项进行了扩展,该选项提供了将 JSON 格式的 EXPLAIN 输出存储在用户变量中的功能,可以使用 MySQL JSON 函数对其进行处理,如下所示

    mysql> EXPLAIN FORMAT=JSON INTO @myex SELECT name FROM a WHERE id = 2;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT JSON_EXTRACT(@myex, "$.query_block.table.key");
    +------------------------------------------------+
    | JSON_EXTRACT(@myex, "$.query_block.table.key") |
    +------------------------------------------------+
    | "PRIMARY"                                      |
    +------------------------------------------------+
    1 row in set (0.01 sec)

    仅当 EXPLAIN 语句还包含 FORMAT=JSON 时,才能使用此选项;否则,将导致语法错误。此要求不受 explain_format 值的影响。

    EXPLAIN FOR CONNECTION 外,INTO 可用于任何可解释的语句。它不能与 EXPLAIN ANALYZE 一起使用。

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

  • EXPLAIN FOR SCHEMA。 EXPLAIN 语句添加了 FOR SCHEMA 选项。语法如下所示,其中 stmt 是可解释的语句

    EXPLAIN [options] FOR SCHEMA schema_name stmt

    这会导致 stmt 在命名架构中运行。

    FOR DATABASE 也被支持作为同义词。

    此选项与 FOR CONNECTION 不兼容。

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

  • 保留客户端注释。  在 MySQL 8.0 中,从 mysql 客户端中删除注释是默认行为;默认值已更改为保留此类注释。

    要像在 MySQL 8.0 及更早版本中那样启用注释删除,请使用 --skip-comments 启动 mysql 客户端。

  • AUTO_INCREMENT 和浮点列。  在 MySQL 8.0 中,已弃用在 CREATE TABLEALTER TABLE 语句中将 AUTO_INCREMENT 修饰符与 FLOATDOUBLE 列一起使用;在 MySQL 8.4 中,对它的支持已完全删除,它会引发 ER_WRONG_FIELD_SPEC列的列说明符不正确)。

    在从以前的版本升级到 MySQL 8.4 之前,您 必须 修复任何包含具有 AUTO_INCREMENTFLOATDOUBLE 列的表,以便该表不再使用这两者中的任何一个。否则,升级将失败。

  • mysql_ssl_rsa_setup 实用程序。  已删除在 MySQL 8.0.34 中弃用的 mysql_ssl_rsa_setup 实用程序。对于使用 OpenSSL 编译的 MySQL 发行版,MySQL 服务器可以在启动时自动生成缺少的 SSL 和 RSA 文件。请参阅 第 8.3.3.1 节,“使用 MySQL 创建 SSL 和 RSA 证书和密钥”,了解更多信息。

  • MySQL 权限。  为定义者对象创建添加了 SET_ANY_DEFINER 权限,为孤立对象保护添加了 ALLOW_NONEXISTENT_DEFINER 权限。这两个权限与已弃用的 SET_USER_ID 权限共存。

  • SET_USER_ID 权限。  MySQL 8.2.0 中已弃用的 SET_USER_ID 权限已被移除。在 GRANT 语句中使用它现在会导致语法错误。

    您可以使用 SET_ANY_DEFINER 权限来创建定义者对象,并使用 ALLOW_NONEXISTENT_DEFINER 权限来保护孤立对象,而不是使用 SET_USER_ID

    要使用 CREATE PROCEDURECREATE FUNCTIONCREATE TRIGGERCREATE EVENTCREATE VIEW 生成孤立的 SQL 对象,需要同时拥有这两个权限。

  • --abort-slave-event-count 和 --disconnect-slave-event-count 服务器选项。  MySQL 服务器启动选项 --abort-slave-event-count--disconnect-slave-event-count(以前用于测试)已在 MySQL 8.0 中弃用,并在此版本中移除。尝试使用这两个选项中的任何一个启动 mysqld 现在会导致错误。

  • mysql_upgrade 实用程序。  MySQL 8.0.16 中已弃用的 mysql_upgrade 实用程序已被移除。

  • mysqlpump 实用程序。  mysqlpump 实用程序及其辅助实用程序 lz4_decompresszlib_decompress(在 MySQL 8.0.34 中弃用)已移除。请改用 mysqldumpMySQL Shell 的转储实用程序

  • 已过时的 CMake 选项。  以下使用 CMake 编译服务器的选项已过时并已移除:

    • USE_LD_LLD:请改用 WITH_LD=lld

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

  • 已移除的关键字。  自 MySQL 8.0 以来,MySQL 8.4 中已移除的关键字。保留关键字标有 (R)。

    GET_MASTER_PUBLIC_KEYMASTER_AUTO_POSITIONMASTER_BIND (R)、MASTER_COMPRESSION_ALGORITHMSMASTER_CONNECT_RETRYMASTER_DELAYMASTER_HEARTBEAT_PERIODMASTER_HOSTMASTER_LOG_FILEMASTER_LOG_POSMASTER_PASSWORDMASTER_PORTMASTER_PUBLIC_KEY_PATHMASTER_RETRY_COUNTMASTER_SSLMASTER_SSL_CAMASTER_SSL_CAPATHMASTER_SSL_CERTMASTER_SSL_CIPHERMASTER_SSL_CRLMASTER_SSL_CRLPATHMASTER_SSL_KEYMASTER_SSL_VERIFY_SERVER_CERT (R)、MASTER_TLS_CIPHERSUITESMASTER_TLS_VERSIONMASTER_USERMASTER_ZSTD_COMPRESSION_LEVEL

  • 分区键中的索引前缀。  在 MySQL 8.0 中,允许在分区表的 `分区键` 中使用带有索引前缀的列,并在创建、更改或升级分区表时发出警告,而不会产生其他影响。此类列不再允许出现在分区表中,并且在 `分区键` 中使用任何此类列会导致出现这些列的 CREATE TABLEALTER TABLE 语句被拒绝并报错。

    有关更多信息,请参阅 列索引前缀不支持键分区