1.4 MySQL 8.4 的新特性 since MySQL 8.0
本节总结了MySQL 8.4中相对于MySQL 8.0而添加、废弃、更改和移除的内容。一个配套部分列出了在MySQL 8.4中添加、废弃或移除的服务器选项和变量;请参阅第1.5节,“MySQL 8.4中自8.0起添加、废弃或移除的服务器选项和变量”。
以下是MySQL 8.4中添加的功能:
-
MySQL原生密码认证更改。 从MySQL 8.4.0开始,已被弃用的
mysql_native_password
认证插件不再默认启用。要启用它,请使用--mysql-native-password=ON
(在MySQL 8.4.0中添加)或将mysql_native_password=ON
包含在您的MySQL配置文件的[mysqld]
部分中(在MySQL 8.4.0中添加)。有关启用、使用和禁用
mysql_native_password
的更多信息,请参阅第 8.4.1.1 节,“Native Pluggable Authentication”。 -
InnoDB 系统变量默认值更改。 MySQL 8.4.0 中,对于
InnoDB
存储引擎的多个服务器系统变量默认值进行了更改,见以下表格:表 1.1 MySQL 8.4 中与 MySQL 8.0 不同的 InnoDB 系统变量默认值
-
克隆插件。 克隆插件的版本要求已经放宽,允许在同一系列中的不同点发布之间进行克隆。换句话说,只需确保主版本号和次版本号匹配,而不再需要点发布号也必须匹配。
例如,现在可以克隆 8.4.0 到 8.4.14,以及反向操作。
-
基于 SASL 的 LDAP 认证在 Windows 上。 在 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 复制:标记的 GTIDs。 MySQL 复制和群组复制中的全局事务标识符(GIDs)的格式已被扩展,以便能够识别事务组,使得可以为属于特定事务组的 GTIDs 分配一个唯一名称。例如,包含数据操作的事务可以通过比较其 GTIDs 来轻松区分于仅由管理操作组成的事务。
新版GTID格式是
UUID:
,其中标签
:数字标签
是一个由1到8个字符组成的字符串,可以通过将gtid_next
系统变量设置为自动:
来启用,该功能在本次发布中添加(请参阅该变量的描述以获取标签格式和其他信息)。这个标签对于当前会话中的所有事务都是持久的(除非使用标签
SET gtid_next
更改),并且在提交时应用于这些事务,或者在使用群组复制时,在认证时间。还可以将gtid_next
设置为
来为单个事务设置一个自定义的UUID和标签。对于UUID
:标签
:数字
UUID
和NUMBER
的分配,其他方面与之前的MySQL版本保持一致。在任何情况下,都由用户负责确保标签在给定的复制拓扑中是唯一的。原有的
格式的GTID格式继续保持不变,按照之前版本的MySQL实现;对使用GTIDs的现有复制设置进行更改是不必要的。UUID
:NUMBER
设置
gtid_next
到AUTOMATIC:
或者标签
需要在这个版本中添加一个新的UUID
:标签
:数字
TRANSACTION_Gtid_Tag
特权,这个是对源服务器以及复制线程的PRIVILEGE_CHECKS_APPLIER
都需要;这意味着管理员现在可以限制使用SET @gtid_next=AUTOMATIC:
或者标签
到特定的MySQL用户或角色上,只有那些与某个数据或操作域相关的用户才能使用带有分配标签的事务。UUID
:标签
:数字
Note从之前版本升级到MySQL 8.4时,任何已经拥有
BINLOG_ADMIN
特权的用户账户或角色都会自动获得TRANSACTION_Gtid_Tag
特权。内置函数
GTID_SUBSET()
、GTID_SUBTRACT()
和WAIT_FOR_EXECUTED_GTID_SET()
与带标签的 GTIDs 兼容。更多信息请参阅
gtid_next
系统变量和TRANSACTION_GTID_TAG
权限的说明,以及 第 19.1.4 节 “更改在线服务器上的 GTID 模式”。 -
复制:SQL_AFTER_GTIDS 和 MTA。
START REPLICA
语句选项SQL_AFTER_GTIDS
现在与多线程应用器兼容。(以前,当启用 MTA 并且用户尝试使用此选项时,该语句会引发警告ER_MTS_FEATURE_IS_NOT_SUPPORTED
,并且副本会切换到单线程模式。)这意味着需要赶上缺失事务的副本现在可以这样做,而不会失去多线程带来的性能优势。对于更多信息,请参阅第15.4.2.4节,“START REPLICA 语句”,以及有关
replica_parallel_workers
系统变量的文档。请参阅第19.2.3.2节,“监控复制应用程序工作者线程”,以及第25.7.11节,“NDB 集群复制使用多线程应用程序”。 -
复制术语向后兼容性。 本次发布添加了
--output-as-version
选项用于mysqldump。该选项允许您从MySQL 8.2或更高版本的服务器创建一个兼容旧版本MySQL的备份;其值,以下列出的其中之一,确定了在备份中使用的复制术语的兼容性:-
SERVER
:获取服务器版本并使用与该MySQL版本兼容的最新复制语句和变量名称。 -
BEFORE_8_2_0
:输出与运行MySQL 8.0.23至8.1.0(含)的服务器兼容。 -
BEFORE_8_0_23
:输出与之前的MySQL版本兼容,包括8.0.22及以下版本。
请参阅该选项的描述以获取更多信息。
此外,对于系统变量
terminology_use_previous
,添加了一个新的值。BEFORE_8_2_0
会导致服务器在SHOW CREATE EVENT
的输出中打印DISABLE ON SLAVE
(现在已过时),而不是DISABLE ON REPLICA
。现有的值BEFORE_8_0_26
现在也会产生这个效果,除了它之前已经有的其他效果。 -
-
MySQL版本号在版本特定的注释中使用时,可以包含一个或两个数字的主版本号;这意味着整个版本号可以是五位数或六位数。关于如何更改影响MySQL处理版本化注释的详细信息,请参阅第11.7节,“Comments”。
-
group_replication_set_as_primary() 和 DDL 语句。
group_replication_set_as_primary()
函数在等待所有事务完成之前,会等待正在进行的DDL语句,如ALTER TABLE
,以便在选举新主服务器前完成。有关此函数的更多信息,请参阅其描述。
-
DDL和DCL语句跟踪对于group_replication_set_as_primary()。
group_ replication_set_as_primary()
现在等待以下语句完成后才会选举新的主节点:这些语句在MySQL 8.4中新增,除了在MySQL 8.1中添加的语句以及此前已支持的语句。有关更多信息,包括MySQL 8.3中所有支持的语句列表,请参阅
group_replication_set_as_primary()
函数的描述。 -
Group Replication变量默认值。 MySQL 8.4中更改了与Group Replication相关的两个服务器系统变量的默认值:
-
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节,“对故障检测和网络分区的响应”,以及上述变量描述。
-
-
binlog_transaction_dependency_tracking 默认值更改。
binlog_transaction_dependency_tracking
服务器系统变量在 MySQL 8.2.0 中被弃用。在为最终移除该变量做准备,其默认值现在是WRITESET
。没有计划替换这个变量或其功能,预计将来会将其内置到服务器中。 -
添加了多个与Group Replication插件特定的状态变量,用于改善网络不稳定性诊断和故障排除,提供有关每个组成员网络使用、控制消息和数据消息的统计信息。
请参阅第20.9.2节,“Group Replication Status Variables”,获取更多信息。
在进行此工作的过程中,对性能模式
replication_group_communication_
表添加了一个新的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
权限的版本时,如果一个用户曾经被赋予了这个权限,他将无法执行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企业数据遮罩和去标识化。 数据遮罩组件添加了支持指定一个专用的模式来存储相关的内部表格和遮罩函数。之前,
mysql
系统模式提供了唯一的存储选项。新的component_ masking. masking_database
只读变量允许在服务器启动时设置并持久化一个备用模式名称。 -
数据遮罩字典的刷新。 MySQL企业数据遮罩和去标识化组件现在包括了将数据从副本或复制源刷入内存的能力。这可以通过以下两种方式之一进行:
-
用户可以在任何时候使用
masking_dictionaries_flush()
函数(本次发布中添加)来执行刷新操作。 -
组件可以配置为定期刷入内存,利用调度器组件,将新的
component_ masking. dictionaries_flush_interval_seconds
系统变量设置为一个合适的值。
更多信息,请参阅第8.5节,“MySQL企业数据遮罩和去标识化”,以及这些项目的描述。
-
-
自动更新直方图。 MySQL 8.4.0 引入了对直方图自动更新的支持。当启用此特性时,直方图将在运行
ANALYZE TABLE
语句对其所属表进行分析时自动更新。此外,由InnoDB
持久统计的自动重新计算(参见Section 17.8.10.1 “Configuring Persistent Optimizer Statistics Parameters”)也会更新直方图。即使没有指定数量的桶,直方图的更新仍然使用原始指定的桶数相同。您可以在指定直方图时通过在
ANALYZE TABLE
语句中包含AUTO UPDATE
选项来启用此特性。要禁用它,请使用MANUAL UPDATE
而不是AUTO UPDATE
。如果既没有指定AUTO UPDATE
也没有指定MANUAL UPDATE
,则默认为MANUAL UPDATE
(不自动更新)。有关更多信息,请参阅直方图统计分析。
-
添加了
tls-证书-enforced-验证
系统变量,这允许DBA在服务器启动时或使用ALTER 实例 RELOAD TLS
语句重新加载证书时强制证书验证。启用强制后,发现无效的证书将在启动时阻止服务器运行,并在运行时防止加载无效的证书,还会发出警告。有关详细信息,请参阅配置证书验证强制。 -
添加了服务器系统变量来控制使用LDAP插件身份验证连接到MySQL服务器的MySQL账户在LDAP服务器下线或响应迟缓时等待的时间。以下简单和SASL-基于LDAP身份验证变量的默认超时时间为30秒:
连接和响应超时可以通过Linux平台上的系统变量进行配置。对于更多信息,请参阅LDAP插件认证的超时设置。
-
服务器关闭过程的日志记录被增强,添加了MySQL服务器、插件和组件的启动和关闭消息。现在还包括了关闭连接的消息。这些新增加的信息应该有助于排查问题,尤其是在服务器关闭时间过长时进行调试。
对于更多信息,请参阅第7.4.2节“错误日志”。
-
服务器启动和关闭消息的新增内容。 在服务器启动和关闭过程中添加了以下类型的消息,如下所列:
-
使用
--initialize
或--initialize-insecure
启动服务器时的服务器初始化开始和结束消息;这些与正常服务器启动和关闭过程中的消息相区别。 -
InnoDB初始化的开始和结束消息。
-
服务器初始化期间执行init文件的开始和结束消息。
-
服务器初始化期间编译时语句执行的开始和结束消息。
-
服务器启动过程中的崩溃恢复(如果发生)开始和结束消息。
-
服务器启动期间动态插件初始化的开始和结束消息。
-
服务器启动时组件初始化步骤的开始和结束消息(在服务器启动期间可见)。
-
副本线程和连接线程的关闭消息,以及优雅关闭和强制关闭的连接线程消息,均在服务器关闭期间出现。
-
服务器关闭时插件和组件的开始和结束消息。
-
初始化或服务器关闭过程中的退出代码(返回值)信息与关闭消息一起出现。
如果服务器使用了
WITH_SYSTEMD
选项进行构建,那么现在服务器将在错误日志中包含所有systemd消息。 -
-
添加了
SHOW PARSE_TREE
语句,该语句显示了JSON格式的解析树,用于一个SELECT
语句。这一语句仅供测试和开发使用,不适合生产环境。它只在调试版本中可用,或者如果MySQL使用源代码构建,并且使用了CMake-DWITH_SHOW_PARSE_TREE
选项,那么它将被包含和支持,但在发布版本中不包括或不受支持。 -
线程池插件连接信息。 添加了MySQL性能_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
更多信息,请参阅第 7.6.3 节,“MySQL Enterprise Thread Pool”和第 29.12.16 节,“Performance Schema Thread Pool Tables”
-
-
信息架构 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_epoch 以来的微秒数)。
-
-
集合操作的哈希表优化。 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 Enterprise Firewall已进行了多项增强。这些增强如下所列:
-
由MySQL Enterprise Firewall提供的存储过程现在以事务性方式运行。当执行防火墙存储过程时发生错误时,将报告错误,并回滚到该点之前所有由存储过程做出的更改。
-
火墙存储过程现在避免执行不必要的组合操作,包括
DELETE
和INSERT
语句的组合,以及INSERT IGNORE
和UPDATE
操作的组合,这样可以减少时间消耗和资源使用,使其运行更快,更高效。 -
基于用户的存储过程和UDF(用户定义函数),在MySQL 8.0.26中被弃用,现在会发出一个警告。特别地,调用sp_set_firewall_mode()或sp_reload_firewall_rules()会产生这样的警告。有关更多信息,请参阅火墙帐户配置存储过程以及迁移帐户配置到组配置。
-
MySQL Enterprise Firewall现在允许其内存缓存在定期的时间间隔后从火墙表中重新加载数据。系统变量
mysql_ firewalls_reload_interval_seconds
设置了运行时使用的周期性重载计划,或者默认禁用重载。在之前的实现中,只有在服务器启动或重新安装服务器端插件时才会重新加载缓存。 -
添加了
mysql_火墙数据库
服务器系统变量,以便于在自定义模式中存储内部表、函数和存储过程。 -
添加了
卸载_火墙.sql
脚本,简化了安装的火墙卸载过程。
关于火墙存储程序的更多信息,请参阅MySQL Enterprise Firewall Stored Procedures。
-
-
可插拔认证. 支持使用智能卡、安全钥匙和生物识别读取器等设备对MySQL服务器进行认证。在WebAuthn上下文中,新添加的WebAuthn认证方法基于FIDO和FIDO2标准。它使用一对插件,
认证_webauthn
在服务器端和认证_webauthn_client
在客户端上。仅在MySQL Enterprise Edition发行版中包含的WebAuthn认证插件。 -
密钥环迁移. 支持从密钥环组件迁移到密钥环插件。要执行此类迁移,请使用在MySQL 8.4.0中引入的
--keyring-migration-from-component
服务器选项,将--keyring-migration-source
设置为源组件的名称,并将--keyring-migration-destination
设置为目标插件的名称。请参阅使用迁移服务器进行密钥迁移,获取更多信息。
-
MySQL企业审计. 添加了
audit_log_filter_uninstall.sql
脚本,以简化卸载MySQL企业审计的过程。
以下功能在MySQL 8.4中已被弃用,并可能在未来版本中移除。在有替代方案的地方,应更新应用程序以使用它们。
对于依赖于MySQL 8.4中已被弃用的功能并在后续版本中被移除的应用程序,当从一个运行MySQL 8.4的源服务器复制到一个运行更高版本的副本时,语句可能会失败,或者在源和副本上有不同的效果。为了避免这些问题,使用了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_UNTIL_SQL_THREAD_AFTER_GTIDS()
,建议使用WAIT_FOR_EXECUTED_GTID_SET
,它允许您等待特定的GTIDs。这无论是通过哪个复制通道或用户客户端到达服务器上的指定事务都适用。 -
基于GTID的复制和忽略服务器ID。 当使用全局事务标识符(GTIDs)进行复制时,已经应用的事务将自动被忽略。这意味着
IGNORE_SERVER_IDS
与GTID模式不兼容。如果gtid_mode
设置为ON
,则使用非空CHANGE REPLICATION SOURCE TO
语句时会因为错误而被拒绝。同样,如果任何现有的复制通道在创建时指定了要忽略的服务器ID列表,执行SET gtid_mode=ON
也会被拒绝。在启动基于GTID的复制之前,在涉及到的服务器上检查并清除任何忽略的服务器ID列表;您可以通过SHOW REPLICA STATUS
的输出来进行检查。在这种情况下,您可以通过使用一个空列表的CHANGE REPLICATION SOURCE TO
语句来清除列表,如下所示:CHANGE REPLICATION SOURCE TO IGNORE_SERVER_IDS = ();
请参阅第19.1.3.7节,“基于GTIDs的复制限制”,获取更多信息。
-
二进制日志事务依赖性跟踪和记录格式。 对冲突检测使用writeset信息已被发现会导致依赖性跟踪问题;因此,我们现在仅在行级别记录有效时限制对writesets的冲突检查的使用。
这意味着,从本次发布开始,如果
binlog_transaction_dependency_tracking
设置为WRITESET
或WRITESET_SESSION
,则binlog_format
必须为ROW
;MIXED
在这种情况下不再被支持。 -
expire_logs_days系统变量。 MySQL 8.0中已废弃的
expire_logs_days
服务器系统变量已经被移除。尝试在运行时获取或设置此变量,或者使用等效选项(--expire-logs-days
)启动mysqld现在会导致错误。取代
expire_logs_days
,请使用binlog_expire_logs_seconds
,它允许您指定以秒为单位的过期时间,而不仅限于整数天。 -
数据库授权中的通配符字符。 MySQL 8.2.0中已经废弃了在数据库授权中使用
%
和_
作为通配符的功能。您应该预期将来会移除这些通配符的功能,并且在partial_revokes
服务器系统变量为ON
时,这些字符将始终被视为字面值,就像现在一样。因此,请避免在未来的MySQL版本中使用这些通配符字符。相反,应使用更具体的授权规则来控制对数据库的访问权限。此外,服务器将
%
视为localhost
的同义词进行权限检查的处理方式,从MySQL 8.2.0开始已经被弃用,因此在未来MySQL版本中可能会被移除。 -
--character-set-client-handshake选项.
--character-set-client-handshake
服务器选项,原本为与非常旧版本MySQL进行升级时设计的,现在已经被弃用,并且在使用时会发出警告。您应该预期这个选项将来会被移除;依赖于此选项的应用程序应尽快开始迁移到新的选项。
以下项目已经被废弃,并在MySQL 8.4中被移除。如有替代方案,应更新应用程序以使用它们。
对于依赖于MySQL 8.4中已移除特性的MySQL 8.3应用程序,当这些应用程序从MySQL 8.3的源服务器复制到MySQL 8.4的副本时,可能会遇到语句失败的问题,或者在源和副本上产生不同的效果。为了避免这样的问题,使用MySQL 8.4中已移除特性的应用程序应被更新以避免它们并尽可能使用替代方案。
-
已移除的服务器选项和变量. MySQL 8.4中已经移除了多个在之前版本中支持的服务器选项和变量。尝试在MySQL 8.4中设置任何一个都会引发错误。这些选项和变量如下所列:
-
binlog_transaction_dependency_tracking
:在MySQL 8.0.35和MySQL 8.2.0中被弃用。没有计划替换这个变量或其功能,它已经被内部化到服务器中。在MySQL 8.4(及以后的版本)中,当使用多线程复制时,源mysqld总是使用always writesets来生成依赖信息以写入二进制日志;这与在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中被弃用,现在已被移除。 -
在MySQL 8.0.26版本中,
--ssl
和--admin-ssl
服务器选项,以及have_ssl
和have_openssl
服务器系统变量被废弃。它们在本次发布中被移除。请使用--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-集客户端握手和--old-style用户限制服务器选项。 这些选项以前用于与非常旧版本MySQL兼容,但这些版本已不再支持或维护,因此不再有任何实际用途。
-
FLUSH HOSTS语句。 已在MySQL 8.0.23中废弃的
FLUSH HOSTS
语句已经被移除。要清空主机缓存,请使用TRUNCATE TABLE
performance_ schema.host_cache
或mysqladmin flush-hosts。
-
-
过时的复制选项和变量。 在MySQL 8.4中,多个与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
:不再需要;请检查性能_schema中的复制组成员表的MEMBER_ROLE列。
-
-
复制SQL语法。 MySQL复制中的一些SQL语句在早期版本的MySQL中已经被弃用,现在在MySQL 8.4中不再支持尝试使用这些语句将产生语法错误。这些建议可以分为两组,分别是源服务器和副本服务器相关的语句,如下所示:
作为本工作的一部分,
DISABLE ON SLAVE
选项对于CREATE EVENT
和ALTER EVENT
现在已经被废弃,并由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
。 -
主机SSL证书
: 使用源SSL证书
。 -
主机公共密钥路径
: 使用源公共密钥路径
。 -
获取主机公共密钥
: 使用获取源公共密钥
。 -
主机心跳周期
: 使用源心跳周期
。 -
主机压缩算法
: 使用源压缩算法
。 -
主机Zstd压缩级别
: 使用源Zstd压缩级别
。 -
主机日志文件
: 使用源日志文件
。 -
主机日志位置
: 使用源日志位置
。
-
-
从
START REPLICA
语句中移除的选项列表如下:-
主机日志文件
: 使用源日志文件
。 -
MASTER_LOG_POS
: 使用SOURCE_LOG_POS
.
-
-
系统变量和NULL. 一个MySQL服务器启动选项不应该被设置为NULL (
--my-option=NULL
) 并由服务器解释为SQLNULL
,这也不应该是可能的。MySQL 8.1 (及以后的版本) 明确禁止将启动选项设置为NULL
以这种方式,并且拒绝尝试这样做并返回错误。使用SET
或类似的方法在mysql 客户端中尝试将对应的服务器系统变量设置为NULL
也会被拒绝。以下列表中的服务器系统变量除外了上述限制:
-
以美元符号开头的标识符。 在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
选项,以及 CMake 构建参数-DWITH_FIDO
。 -
keyring_file
插件:请使用component_keyring_file
组件。详见第 8.4.4.4 节,“使用文件基的 keyring_file 组件”。此外,已移除
keyring_file_data
系统变量。另外,CMake 构建参数-DINSTALL_MYSQLKEYRINGDIR
和-DWITH_KEYRING_TEST
也被移除了。 -
keyring_encrypted_file
插件:请使用component_keyring_encrypted_file
组件。详见第 8.4.4.5 节,“使用加密文件基的 keyring_encrypted_file 组件”。已移除
keyring_encrypted_file_data
和keyring_encrypted_file_password
系统变量。 -
keyring_oci
插件:请使用component_keyring_oci
组件。详见第 8.4.4.9 节,“使用 Oracle 云基础设施密钥环组件”。以下服务器系统变量也被移除:
keyring_oci_ca_证书
,keyring_oci_分区
,keyring_oci_加密终端
,keyring_oci_密钥文件
,keyring_oci_密钥指纹
,keyring_oci_管理终端
,keyring_oci_主密钥
,keyring_oci_秘密终端
,keyring_oci_租户
,keyring_oci_用户
,keyring_oci_保管库终端
,以及keyring_oci_虚拟保管库
。 -
openssl_udf
插件:使用 MySQL Enterprise 加密 (component_enterprise_encryption
) 组件;请参阅第 8.6 节,“MySQL Enterprise 加密”。
-
-
对弱加密算法的支持。 当配置加密连接时,MySQL 8.4.0 及更高版本不再允许指定任何不符合以下要求的加密器:
-
遵循适当的 TLS 版本(TLS v1.2 或 TLSv1.3,根据需要)
-
提供完美前向保密性
-
在加密器、证书或两者中使用 SHA2
-
使用 AES-GCM 或任何其他 AEAD 算法或模式
这对以下系统变量有影响:
查看这些变量的描述以获取MySQL 8.4中允许的值,并获得更多信息。
Notelibmysqlclient
继续支持不符合这些条件的额外加密方法,以便能够连接到旧版本的MySQL。 -
-
INFORMATION_SCHEMA.TABLESPACES.
INFORMATION_SCHEMA.TABLESPACES
表格,实际上并未使用,已在MySQL 8.0.22中被弃用,现在已经被移除。Note对于
NDB
表格,信息架构中的FILES
表格提供了有关表空间的信息。对于
InnoDB
表格,信息架构中的INNODB_TABLESPACES
和INNODB_DATAFILES
表格提供了有关表空间元数据的信息。 -
DROP TABLESPACE 和 ALTER TABLESPACE: ENGINE 子句。
ENGINE
子句用于DROP TABLESPACE
和ALTER TABLESPACE
语句在 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
中现在会导致语法错误。 -
解释JSON格式版本化. 现在可以选择使用由
EXPLAIN FORMAT=JSON
语句输出的2种不同版本的JSON格式,通过在本次发布中引入的explain_json_format_version
服务器系统变量。将这个变量设置为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)
这个选项只能在包含
FORMAT=JSON
的EXPLAIN
语句中使用;否则会出现语法错误。这一点不受explain_format
系统变量的影响。INTO
可以与任何可解释的语句一起使用,除了EXPLAIN FOR CONNECTION
。它不能与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 及更早版本中,MySQL 服务器默认保留这些注释。
要启用像 MySQL 8.0 和更早版本那样进行的注释去除,请使用
--skip-comments
启动 mysql 客户端。 -
AUTO_INCREMENT和浮点数列。 在
FLOAT
和DOUBLE
列中使用AUTO_INCREMENT
修饰符的CREATE TABLE
和ALTER TABLE
语句在MySQL 8.0中已被弃用;在MySQL 8.4中,它将完全移除,并引发ER_WRONG_FIELD_SPEC
(字段指定错误)错误。在升级到MySQL 8.4之前,从前一系列版本升级,您必须修复任何包含FLOAT或DOUBLE列的表,该列使用了
AUTO_INCREMENT
,以便该表不再使用这些类型。否则,升级将失败。 -
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_USER_ID
,您可以使用SET_ANY_DEFINER
权限进行定义对象的创建,以及ALLOW_NONEXISTENT_DEFINER
权限用于保护孤儿对象。两种权限都需要来创建使用
CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TRIGGER
、CREATE EVENT
或CREATE VIEW
创建的孤儿 SQL 对象。 -
--abort-slave-event-count 和 --disconnect-slave-event-count 服务器选项。 MySQL 8.0 中已废弃并在本次发布中移除的服务器启动选项
--abort-slave-event-count
和--disconnect-slave-event-count
,原用于测试,现在尝试使用这些选项启动mysqld 将导致错误。 -
mysql_upgrade 工具。 在 MySQL 8.0.16 中已废弃的 mysql_upgrade 工具已经被移除。
-
MySQL 数据库备份工具。 mysqlpump 工具及其辅助工具 lz4_解压缩 和 zlib_解压缩 自 MySQL 8.0.34 起已被弃用,取而代之的是使用 mysqldump 或 MySQL Shell 的备份工具。
-
过时的 CMake 选项。 用于编译服务器的以下 CMake 选项已被弃用并移除:
-
USE_LD_LLD
:请使用WITH_ LD=lld
代替。 -
WITH_BOOST
,DOWNLOAD_BOOST
,DOWNLOAD_BOOST_TIMEOUT
:这些选项现在不再必要,因为 MySQL 现在在从源代码编译时会包含并使用一个捆绑的 Boost 版本。
-