本节概述了自 MySQL 8.0 后,MySQL 8.4 中添加、弃用、更改和删除的内容。附带的一节列出了 MySQL 8.4 中添加、弃用或删除的 MySQL 服务器选项和变量;请参阅 第 1.5 节“自 8.0 后 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 系统变量默认值
克隆插件。放宽了 克隆插件 的版本要求,允许在同一系列的不同小版本之间进行克隆。换句话说,只有主版本号和次版本号必须匹配,而以前小版本号也必须匹配。
例如,克隆功能现在允许在 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
:NUMBERTAG
是一个最多 8 个字符的字符串,通过将gtid_next
系统变量的值设置为AUTOMATIC:
来启用,在本版本中添加(有关标签格式和其他信息,请参阅变量的描述)。此标记对于源自当前会话的所有事务都保持不变(除非使用TAG
SET gtid_next
更改),并在提交时或使用组复制时在认证时应用于此类事务。还可以将gtid_next
设置为
,以便将单个事务的 UUID 设置为任意值,并为其分配自定义标记。否则,UUID
:TAG
:NUMBER
UUID
和NUMBER
的分配与以前的 MySQL 版本没有区别。在任何一种情况下,用户都有责任确保标记对于给定的复制拓扑是唯一的。仍然支持 GTID 的原始
格式,其实现方式与以前版本的 MySQL 相同;不需要更改使用 GTID 的现有复制设置。UUID
:NUMBER
将
gtid_next
设置为AUTOMATIC:
或TAG
需要一个新的UUID
:TAG
:NUMBER
TRANSACTION_GTID_TAG
权限,该权限在本版本中添加;这对于发起服务器以及副本应用线程的PRIVILEGE_CHECKS_APPLIER
都是如此。这也意味着管理员现在可以将SET @gtid_next=AUTOMATIC:
或TAG
的使用限制为一组所需的 MySQL 用户或角色,以便只有那些与给定数据或操作域相关的用户才能提交具有分配标签的新事务。UUID
:TAG
:NUMBER
注意从先前版本的 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 中,与组复制相关的两个服务器系统变量的默认值已更改
在 MySQL 8.4.0 中,
group_replication_consistency
系统变量的默认值已更改为BEFORE_ON_PRIMARY_FAILOVER
。(以前是EVENTUAL
。)在 MySQL 8.4.0 中,
group_replication_exit_state_action
系统变量的默认值已更改为OFFLINE_MODE
。(以前是READ_ONLY
。)
有关更多信息,请参阅 “第 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 TABLE
和OPTIMIZE NO_WRITE_TO_BINLOG TABLE
语句。从以前的版本系列升级时,拥有
SYSTEM_USER
权限的用户会自动获得OPTIMIZE_LOCAL_TABLE
权限。MySQL Enterprise 数据屏蔽和去标识化。 数据屏蔽组件添加了对指定专用架构以存储相关的内部表和屏蔽函数的支持。以前,
mysql
系统架构是唯一的存储选项。新的component_masking.masking_database
只读变量允许在服务器启动时设置和持久化备用架构名称。刷新数据屏蔽字典。 MySQL Enterprise 数据屏蔽和去标识化组件现在包含将辅助服务器或副本上的数据刷新到内存中的功能。这可以通过以下两种方式中的任何一种来完成
用户可以随时使用此版本中添加的
masking_dictionaries_flush()
函数执行刷新。可以通过将新的
component_masking.dictionaries_flush_interval_seconds
系统变量设置为适当的值,将组件配置为定期刷新内存,从而利用调度程序组件。
有关更多信息,请参阅 “第 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_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
。
有关更多信息,请参阅“第 7.6.3 节,“MySQL 企业版线程池””,以及“第 29.12.16 节,“性能架构线程池表””。
**信息架构 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 纪元以来的微秒数)。
**集合操作的哈希表优化。** MySQL 8.2 通过新的哈希表优化提高了使用集合操作
EXCEPT
和INTERSECT
的语句的性能,该优化对此类语句自动启用,并通过设置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 企业版防火墙提供的存储过程现在以事务方式运行。当防火墙存储过程执行期间发生错误时,会报告错误,并且存储过程到那时为止所做的所有更改都将回滚。
防火墙存储过程现在避免执行
DELETE
加INSERT
语句以及INSERT IGNORE
加UPDATE
操作的不必要组合,从而减少了时间和资源消耗,使其更快、更高效。在 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) 标记。
AUTO
、BERNOULLI
、GTIDS
、LOG
、MANUAL
(R)、PARALLEL
(R)、PARSE_TREE
、QUALIFY
(R)、S3
和TABLESAMPLE
(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 中已删除的功能的应用程序,当从 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_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 = ();
有关更多信息,请参阅第 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.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_upgrade
和show_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_ssl
和have_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_cache
或 mysqladmin 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 EVENT
和ALTER EVENT
的DISABLE ON SLAVE
选项现已弃用,并由DISABLE ON REPLICA
取代。相应的术语SLAVESIDE_DISABLED
现在也已弃用,并且不再用于事件描述中,例如在信息模式EVENTS
表中;现在显示的是REPLICA_SIDE_DISABLED
。已删除的与复制源服务器相关的语句在此处列出
CHANGE MASTER TO
:请使用CHANGE REPLICATION SOURCE TO
。RESET MASTER
:请使用RESET BINARY LOGS AND GTIDS
。SHOW MASTER STATUS
:请使用SHOW BINARY LOG STATUS
。PURGE MASTER LOGS
:请使用PURGE BINARY LOGS
。SHOW MASTER LOGS
:请使用SHOW BINARY LOGS
。
已删除的与副本相关的 SQL 语句在此处列出
START SLAVE
:请使用START REPLICA
。STOP SLAVE
:请使用STOP REPLICA
。SHOW SLAVE STATUS
:请使用SHOW REPLICA STATUS
。SHOW SLAVE HOSTS
:请使用SHOW REPLICAS
。RESET SLAVE
:请使用RESET REPLICA
。
前面列出的所有语句都已从 MySQL 测试程序和文件中删除,以及从任何其他内部使用中删除。
此外,以前由
CHANGE REPLICATION SOURCE TO
和START REPLICA
支持的一些已弃用选项已被删除,并且服务器不再接受。接下来列出了从这些 SQL 语句中删除的选项。从
CHANGE REPLICATION SOURCE TO
中删除的选项在此处列出MASTER_AUTO_POSITION
:请使用SOURCE_AUTO_POSITION
。MASTER_HOST
:请使用SOURCE_HOST
。MASTER_BIND
:请使用SOURCE_BIND
。MASTER_UseR
:请使用SOURCE_UseR
。MASTER_PASSWORD
:请使用SOURCE_PASSWORD
。MASTER_PORT
:请使用SOURCE_PORT
。MASTER_CONNECT_RETRY
:请使用SOURCE_CONNECT_RETRY
。MASTER_RETRY_COUNT
:请使用SOURCE_RETRY_COUNT
。MASTER_DELAY
:请使用SOURCE_DELAY
。MASTER_SSL
:请使用SOURCE_SSL
。MASTER_SSL_CA
:请使用SOURCE_SSL_CA
。MASTER_SSL_CAPATH
:请使用SOURCE_SSL_CAPATH
。MASTER_SSL_CIPHER
:请使用SOURCE_SSL_CIPHER
。MASTER_SSL_CRL
:请使用SOURCE_SSL_CRL
。MASTER_SSL_CRLPATH
:请使用SOURCE_SSL_CRLPATH
。MASTER_SSL_KEY
:请使用SOURCE_SSL_KEY
。MASTER_SSL_VERIFY_SERVER_CERT
:请使用SOURCE_SSL_VERIFY_SERVER_CERT
。MASTER_TLS_VERSION
:请使用SOURCE_TLS_VERSION
。MASTER_TLS_CIPHERSUITES
:请使用SOURCE_TLS_CIPHERSUITES
。MASTER_SSL_CERT
:请使用SOURCE_SSL_CERT
。MASTER_PUBLIC_KEY_PATH
:请使用SOURCE_PUBLIC_KEY_PATH
。GET_MASTER_PUBLIC_KEY
:请使用GET_SOURCE_PUBLIC_KEY
。MASTER_HEARTBEAT_PERIOD
:请使用SOURCE_HEARTBEAT_PERIOD
。MASTER_COMPRESSION_ALGORITHMS
:请使用SOURCE_COMPRESSION_ALGORITHMS
。MASTER_ZSTD_COMPRESSION_LEVEL
:请使用SOURCE_ZSTD_COMPRESSION_LEVEL
。MASTER_LOG_FILE
:请使用SOURCE_LOG_FILE
。MASTER_LOG_POS
:请使用SOURCE_LOG_POS
。
从
START REPLICA
语句中删除的选项在此处列出MASTER_LOG_FILE
:请使用SOURCE_LOG_FILE
。MASTER_LOG_POS
:请使用SOURCE_LOG_POS
。
系统变量和 NULL。 不打算也不支持将 MySQL 服务器启动选项设置为 NULL (
--my-option=NULL
) 并由服务器将其解释为 SQLNULL
,并且应该是不可能的。MySQL 8.1(及更高版本)特别禁止以这种方式将启动选项设置为NULL
,并拒绝尝试这样做并报错。尝试使用SET
或 mysql 客户端中的类似方法将相应的服务器系统变量设置为NULL
也会被拒绝。以下列表中的服务器系统变量不受上述限制的约束
另请参阅 第 7.1.8 节,“服务器系统变量”。
以美元符号开头的标识符。 在 MySQL 8.0 中,已弃用使用美元符号 (
$
) 作为未引用的标识符的首字符,并在 MySQL 8.1 及更高版本中受到限制;使用以美元符号开头并包含一个或多个美元符号(除了第一个符号之外)的未引用标识符现在会生成语法错误。如果以
$
开头的未引用标识符不包含任何其他$
字符,则不受此限制的影响。请参阅 第 11.2 节,“架构对象名称”。
此外,作为这项工作的一部分,以下先前已弃用的服务器状态变量已被删除。它们在此处列出,以及它们的替代品
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 中删除了许多插件,此处列出了这些插件,以及与它们关联的任何系统变量和其他功能,这些变量和功能也因插件删除而被删除或受到其他影响
authentication_fido
和authentication_fido_client
插件:改用authentication_webauthn
插件。请参阅 第 8.4.1.11 节,“WebAuthn 可插拔身份验证”。authentication_fido_rp_id
服务器系统变量、mysql 客户端--fido-register-factor
选项以及-DWITH_FIDO
CMake 选项也被删除。keyring_file
插件:改用component_keyring_file
组件。请参阅 第 8.4.4.4 节,“使用 component_keyring_file 基于文件的密钥环组件”。keyring_file_data
系统变量也被删除。此外,CMake 选项-DINSTALL_MYSQLKEYRINGDIR
和-DWITH_KEYRING_TEST
也被删除。keyring_encrypted_file
插件:改用component_keyring_encrypted_file
组件。请参阅 第 8.4.4.5 节,“使用 component_keyring_encrypted_file 加密文件密钥环组件”。keyring_encrypted_file_data
和keyring_encrypted_file_password
系统变量也被删除。keyring_oci
插件:改用component_keyring_oci
组件。请参阅 第 8.4.4.9 节,“使用 Oracle 云基础设施 Vault 密钥环组件”。以下服务器系统变量也被删除:
keyring_oci_ca_certificate
、keyring_oci_compartment
、keyring_oci_encryption_endpoint
、keyring_oci_key_file
、keyring_oci_key_fingerprint
、keyring_oci_management_endpoint
、keyring_oci_master_key
、keyring_oci_secrets_endpoint
、keyring_oci_tenancy
、keyring_oci_user
、keyring_oci_vaults_endpoint
和keyring_oci_virtual_vault
。openssl_udf
插件:改用 MySQL 企业版加密 (component_enterprise_encryption
) 组件;请参阅 第 8.6 节,“MySQL 企业版加密”。
对弱密码的支持。 在配置加密连接时,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_TABLESPACES
和INNODB_DATAFILES
表提供了表空间元数据。DROP TABLESPACE 和 ALTER TABLESPACE:ENGINE 子句。
DROP TABLESPACE
和ALTER TABLESPACE
语句的ENGINE
子句已在 MySQL 8.0 中弃用。在 MySQL 8.4 中,它不再受支持,如果您尝试将它与DROP TABLESPACE
或ALTER 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 TABLE
和ALTER TABLE
语句中将AUTO_INCREMENT
修饰符与FLOAT
和DOUBLE
列一起使用;在 MySQL 8.4 中,对它的支持已完全删除,它会引发ER_WRONG_FIELD_SPEC
(列的列说明符不正确)。在从以前的版本升级到 MySQL 8.4 之前,您 必须 修复任何包含具有
AUTO_INCREMENT
的FLOAT
或DOUBLE
列的表,以便该表不再使用这两者中的任何一个。否则,升级将失败。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 PROCEDURE
、CREATE FUNCTION
、CREATE TRIGGER
、CREATE EVENT
或CREATE 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_decompress 和 zlib_decompress(在 MySQL 8.0.34 中弃用)已移除。请改用 mysqldump 或 MySQL Shell 的转储实用程序。
已过时的 CMake 选项。 以下使用 CMake 编译服务器的选项已过时并已移除:
USE_LD_LLD
:请改用WITH_LD=lld
。WITH_BOOST
、DOWNLOAD_BOOST
、DOWNLOAD_BOOST_TIMEOUT
:这些选项不再需要;MySQL 现在在从源代码编译时包含并使用捆绑版本的 Boost。
已移除的关键字。 自 MySQL 8.0 以来,MySQL 8.4 中已移除的关键字。保留关键字标有 (R)。
GET_MASTER_PUBLIC_KEY
、MASTER_AUTO_POSITION
、MASTER_BIND
(R)、MASTER_COMPRESSION_ALGORITHMS
、MASTER_CONNECT_RETRY
、MASTER_DELAY
、MASTER_HEARTBEAT_PERIOD
、MASTER_HOST
、MASTER_LOG_FILE
、MASTER_LOG_POS
、MASTER_PASSWORD
、MASTER_PORT
、MASTER_PUBLIC_KEY_PATH
、MASTER_RETRY_COUNT
、MASTER_SSL
、MASTER_SSL_CA
、MASTER_SSL_CAPATH
、MASTER_SSL_CERT
、MASTER_SSL_CIPHER
、MASTER_SSL_CRL
、MASTER_SSL_CRLPATH
、MASTER_SSL_KEY
、MASTER_SSL_VERIFY_SERVER_CERT
(R)、MASTER_TLS_CIPHERSUITES
、MASTER_TLS_VERSION
、MASTER_USER
和MASTER_ZSTD_COMPRESSION_LEVEL
。分区键中的索引前缀。 在 MySQL 8.0 中,允许在分区表的 `分区键` 中使用带有索引前缀的列,并在创建、更改或升级分区表时发出警告,而不会产生其他影响。此类列不再允许出现在分区表中,并且在 `分区键` 中使用任何此类列会导致出现这些列的
CREATE TABLE
或ALTER TABLE
语句被拒绝并报错。有关更多信息,请参阅 列索引前缀不支持键分区。