本节中描述的 MySQL 服务器系统变量用于监控和控制全局事务标识符 (GTID)。有关更多信息,请参见 第 19.1.3 节,“使用全局事务标识符进行复制”。
-
命令行格式 --binlog-gtid-simple-recovery[={OFF|ON}]
系统变量 binlog_gtid_simple_recovery
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 ON
此变量控制 MySQL 启动或重新启动时在搜索 GTID 期间如何遍历二进制日志文件。
当
binlog_gtid_simple_recovery=TRUE
(默认值)时,gtid_executed
和gtid_purged
的值是在启动时根据最新和最旧二进制日志文件中的Previous_gtids_log_event
值计算的。有关计算的描述,请参见 gtid_purged 系统变量。此设置在服务器重新启动期间仅访问两个二进制日志文件。如果服务器上的所有二进制日志都是使用 MySQL 5.7.8 或更高版本生成的,则始终可以安全地使用binlog_gtid_simple_recovery=TRUE
。如果服务器上存在任何来自 MySQL 5.7.7 或更早版本的二进制日志(例如,在将旧服务器升级到 MySQL 8.4 后),则使用
binlog_gtid_simple_recovery=TRUE
,gtid_executed
和gtid_purged
可能在以下两种情况下初始化不正确最新的二进制日志是由 MySQL 5.7.5 或更早版本生成的,并且某些二进制日志的
gtid_mode
为ON
,而最新的二进制日志的gtid_mode
为OFF
。在 MySQL 5.7.7 或更早版本上执行了
SET @@GLOBAL.gtid_purged
语句,并且在执行SET @@GLOBAL.gtid_purged
语句时处于活动状态的二进制日志尚未被清除。
如果在这两种情况下都计算出了不正确的 GTID 集,即使服务器后来重新启动时使用的是
binlog_gtid_simple_recovery=FALSE
,它仍然不正确。如果服务器上存在或可能存在这两种情况,请在启动或重新启动服务器之前设置binlog_gtid_simple_recovery=FALSE
。当设置了
binlog_gtid_simple_recovery=FALSE
时,计算gtid_executed
和gtid_purged
的方法,如 Thegtid_purged
System Variable 中所述,会更改为按以下方式迭代二进制日志文件。计算
gtid_executed
不是使用Previous_gtids_log_event
的值和最新二进制日志文件中的 GTID 日志事件,而是从最新的二进制日志文件开始迭代,并使用Previous_gtids_log_event
的值和找到Previous_gtids_log_event
值的第一个二进制日志文件中的任何 GTID 日志事件。如果服务器最新的二进制日志文件没有 GTID 日志事件(例如,如果使用了gtid_mode=ON
,但后来服务器更改为gtid_mode=OFF
),则此过程可能需要很长时间。计算
gtid_purged
不是使用最旧二进制日志文件中的Previous_gtids_log_event
的值,而是从最旧的二进制日志文件开始迭代,并使用找到非空Previous_gtids_log_event
值或至少一个 GTID 日志事件(表示 GTID 的使用从该点开始)的第一个二进制日志文件中的Previous_gtids_log_event
的值。如果服务器较旧的二进制日志文件没有 GTID 日志事件(例如,如果gtid_mode=ON
只是最近在服务器上设置的),则此过程可能需要很长时间。
-
命令行格式 --enforce-gtid-consistency[=value]
系统变量 enforce_gtid_consistency
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 OFF
有效值 OFF
ON
WARN
根据此变量的值,服务器通过仅允许执行可以使用 GTID 安全地记录的语句来强制执行 GTID 一致性。您 必须 将此变量设置为
ON
,然后才能启用基于 GTID 的复制。可以配置
enforce_gtid_consistency
的值为OFF
:允许所有事务违反 GTID 一致性。ON
:不允许任何事务违反 GTID 一致性。WARN
:允许所有事务违反 GTID 一致性,但在这种情况下会生成警告。
--enforce-gtid-consistency
仅在对语句进行二进制日志记录时才会生效。如果在服务器上禁用了二进制日志记录,或者语句没有写入二进制日志(因为它们被过滤器删除),则不会针对没有记录的语句检查或强制执行 GTID 一致性。当
enforce_gtid_consistency
设置为ON
时,只有可以使用 GTID 安全语句记录的语句才能被记录,因此此处列出的操作不能与此选项一起使用。CREATE TEMPORARY TABLE
或DROP TEMPORARY TABLE
语句在事务中。更新事务表和非事务表的交易或语句。如果所有 非事务 表都是临时的,则允许在同一事务或同一语句中进行非事务性 DML 操作,这是一个例外。
CREATE TABLE ... SELECT
语句支持对支持原子 DDL 的存储引擎。
有关更多信息,请参见 Section 19.1.3.7, “Restrictions on Replication with GTIDs”.
在 MySQL 5.7 之前以及该版本系列的早期版本中,布尔型
enforce_gtid_consistency
默认设置为OFF
。为了与这些早期版本保持兼容,枚举默认设置为OFF
,并且设置--enforce-gtid-consistency
而不带值被解释为将值设置为ON
。该变量还有多个值的文本别名:0=OFF=FALSE
、1=ON=TRUE
、2=WARN
。这与其他枚举类型不同,但保持与先前版本中使用的布尔类型的兼容性。这些更改会影响变量的返回值。使用SELECT @@ENFORCE_GTID_CONSISTENCY
、SHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY'
和SELECT * FROM INFORMATION_SCHEMA.VARIABLES WHERE 'VARIABLE_NAME' = 'ENFORCE_GTID_CONSISTENCY'
,都会返回文本形式,而不是数字形式。这是一个不兼容的更改,因为@@ENFORCE_GTID_CONSISTENCY
返回布尔值的数字形式,但返回SHOW
和信息模式的文本形式。 -
系统变量 gtid_executed
范围 全局 动态 否 SET_VAR
提示适用否 类型 字符串 单位 GTID 集 与全局作用域一起使用时,此变量包含在服务器上执行的所有事务的集合以及已通过
SET
gtid_purged
语句设置的 GTID 的表示形式。这与SHOW BINARY LOG STATUS
和SHOW REPLICA STATUS
输出中的Executed_Gtid_Set
列的值相同。此变量的值是一个 GTID 集,有关更多信息,请参见 GTID Sets。服务器启动时,会初始化
@@GLOBAL.gtid_executed
。有关如何迭代二进制日志以填充gtid_executed
的更多信息,请参见binlog_gtid_simple_recovery
。然后,在执行事务时或执行任何SET
gtid_purged
语句时,GTID 会被添加到该集中。在任何给定时间,可以在二进制日志中找到的事务集等于
GTID_SUBTRACT(@@GLOBAL.gtid_executed, @@GLOBAL.gtid_purged)
;也就是说,等于二进制日志中尚未被清除的所有事务。发出
RESET BINARY LOGS AND GTIDS
会导致此变量重置为空字符串。除因RESET BINARY LOGS AND GTIDS
而清除集合之外,GTID 不会以其他方式从该集合中删除。 gtid_executed_compression_period
命令行格式 --gtid-executed-compression-period=#
系统变量 gtid_executed_compression_period
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 4294967295
每处理完这么多事务,压缩一次
mysql.gtid_executed
表。当在服务器上启用二进制日志记录时,不会使用此压缩方法,而是会在每次二进制日志轮换时压缩mysql.gtid_executed
表。当在服务器上禁用二进制日志记录时,压缩线程会休眠,直到执行了指定数量的事务,然后唤醒以执行mysql.gtid_executed
表的压缩。将此系统变量的值设置为 0 表示该线程永远不会唤醒,因此不会使用此显式压缩方法。相反,压缩会根据需要隐式执行。InnoDB
事务通过与非InnoDB
事务不同的单独进程写入mysql.gtid_executed
表。如果服务器同时包含InnoDB
事务和非InnoDB
事务,则此系统变量控制的压缩会干扰此进程的工作,并可能导致其速度显著下降。因此,从该版本开始,建议您将gtid_executed_compression_period
设置为 0。所有事务(无论存储引擎如何)都通过相同的进程写入
mysql.gtid_executed
表,并且gtid_executed_compression_period
的默认值为 0。有关更多信息,请参见 mysql.gtid_executed Table Compression。
-
命令行格式 --gtid-mode=MODE
系统变量 gtid_mode
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 OFF
有效值 OFF
OFF_PERMISSIVE
ON_PERMISSIVE
ON
控制是否启用基于 GTID 的日志记录以及日志可以包含哪种类型的事务。您必须具有足够的权限才能设置全局系统变量。请参见 Section 7.1.9.1, “System Variable Privileges”。在您设置
gtid_mode=ON
之前,必须将enforce_gtid_consistency
设置为ON
。在修改此变量之前,请参见 Section 19.1.4, “Changing GTID Mode on Online Servers”.记录的事务可以是匿名的,也可以使用 GTID。匿名事务依靠二进制日志文件和位置来识别特定事务。GTID 事务具有唯一的标识符,用于引用事务。不同的模式如下
OFF
:新事务和复制的事务都必须是匿名的。OFF_PERMISSIVE
:新事务是匿名的。复制的事务可以是匿名的,也可以是 GTID 事务。ON_PERMISSIVE
:新事务是 GTID 事务。复制的事务可以是匿名的,也可以是 GTID 事务。ON
:新事务和复制的事务都必须是 GTID 事务。
从一个值更改为另一个值只能一步一步地进行。例如,如果
gtid_mode
当前设置为OFF_PERMISSIVE
,则可以更改为OFF
或ON_PERMISSIVE
,但不能更改为ON
。gtid_purged
和gtid_executed
的值是持久性的,无论gtid_mode
的值如何。因此,即使在更改gtid_mode
的值之后,这些变量也包含正确的值。 -
系统变量 gtid_next
范围 会话 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 AUTOMATIC
有效值 AUTOMATIC
AUTOMATIC:<TAG>
ANONYMOUS
<UUID>:<NUMBER>
<UUID>:<TAG>:<NUMBER>
此变量用于指定是否以及如何获取下一个 GTID(请参见 Section 19.1.3, “Replication with Global Transaction Identifiers”)。
设置此系统变量的会话值是一个受限操作。会话用户必须具有
REPLICATION_APPLIER
权限(参见 第 19.3.3 节,“复制权限检查”),或设置受限会话变量的足够权限(参见 第 7.1.9.1 节,“系统变量权限”)。gtid_next
可以取以下任一值:AUTOMATIC
:使用下一个自动生成的全局事务 ID。AUTOMATIC:
:使用下一个自动生成的全局事务 ID,并在 UUID:TAG
TAG
:NUMBER 格式中添加用户指定的标签。标签必须与正则表达式
[a-z_][a-z0-9_]{0,7}
匹配;换句话说,它必须符合以下规则:标签必须包含 1 到 8 个字符(含)。
第一个字符可以是任何字母
a
到z
,或下划线 (_
)。每个后续字符可以是任何字母
a
到z
,数字0
到9
,或下划线 (_
)。
在复制源上将
gtid_next
设置为AUTOMATIC:
或TAG
需要UUID
:TAG
:NUMBER
TRANSACTION_GTID_TAG
权限,以及至少以下权限之一:SYSTEM_VARIABLES_ADMIN
、SESSION_VARIABLES_ADMIN
或REPLICATION_APPLIER
。对于REPLICATION_CHECKS_APPLIER
,除了REPLICATION_APPLIER
权限外,还需要此权限才能将gtid_next
设置为这两个值之一;启动复制应用线程时会检查这些权限。ANONYMOUS
:事务没有全局标识符,仅通过文件和位置标识。以
UUID
:NUMBER
或UUID
:TAG
:NUMBER
格式之一的全局事务 ID。
哪些选项有效取决于
gtid_mode
的设置;有关更多信息,请参见 第 19.1.4.1 节,“复制模式概念”。如果gtid_mode
为OFF
,设置此变量无效。将此变量设置为
或UUID
:NUMBER
后,并在事务提交或回滚后,必须在执行任何其他语句之前再次显式发出UUID
:TAG
:NUMBER
SET gtid_next
语句。DROP TABLE
或DROP TEMPORARY TABLE
在对非临时表和临时表,或对使用事务型存储引擎的临时表和使用非事务型存储引擎的临时表的组合使用时,会以显式错误失败。有关更多信息,请参见 全局变量
gtid_next
,以及 第 19.1.4 节,“在在线服务器上更改 GTID 模式”。 -
系统变量 gtid_owned
范围 全局,会话 动态 否 SET_VAR
提示适用否 类型 字符串 单位 GTID 集 此只读变量主要用于内部使用。其内容取决于其范围。
在全局范围内使用时,
gtid_owned
包含服务器上当前正在使用的所有 GTID 列表,以及拥有这些 GTID 的线程的 ID。此变量主要用于多线程副本检查某个事务是否已在另一个线程上应用。应用线程在其处理事务的整个过程中都拥有事务的 GTID,因此@@global.gtid_owned
显示了 GTID 和所有者,持续时间为处理期间。当事务提交(或回滚)时,应用线程会释放 GTID 的所有权。在会话范围内使用时,
gtid_owned
包含当前正在使用且由该会话拥有的单个 GTID。此变量主要用于测试和调试 GTID 的使用,前提是客户端通过设置gtid_next
显式地为事务分配了 GTID。在这种情况下,@@session.gtid_owned
在客户端处理事务的整个过程中显示 GTID,直到事务提交(或回滚)。当客户端完成处理事务后,该变量将被清除。如果对于会话使用了gtid_next=AUTOMATIC
,gtid_owned
仅在事务提交语句执行期间短暂地填充,因此无法从相关会话中观察到它,尽管如果在正确的时间点读取了@@global.gtid_owned
,它将列出。如果您需要跟踪会话中客户端处理的 GTID,则可以启用由session_track_gtids
系统变量控制的会话状态跟踪器。
-
系统变量 gtid_purged
范围 全局 动态 是 SET_VAR
提示适用否 类型 字符串 单位 GTID 集 gtid_purged
系统变量的全局值 (@@GLOBAL.gtid_purged
) 是一个 GTID 集,包含服务器上已提交但服务器上任何二进制日志文件中都不存在的所有事务的 GTID。gtid_purged
是gtid_executed
的一个子集。以下类别的 GTID 在gtid_purged
中:在副本上禁用二进制日志记录的情况下提交的复制事务的 GTID。
已写入二进制日志文件(现已清除)的事务的 GTID。
通过语句
SET @@GLOBAL.gtid_purged
显式添加到集合中的 GTID。
服务器启动时,
gtid_purged
的全局值初始化为一组 GTID。有关如何计算此 GTID 集的信息,请参见 全局变量gtid_purged
。如果服务器上存在来自 MySQL 5.7.7 或更早版本的二进制日志,您可能需要在服务器的配置文件中设置binlog_gtid_simple_recovery=FALSE
以生成正确的计算结果。有关此设置所需的具体情况,请参见binlog_gtid_simple_recovery
的描述。您必须具有
TRANSACTION_GTID_TAG
才能设置gtid_purged
。发出
RESET BINARY LOGS AND GTIDS
会导致gtid_purged
的值重置为空字符串。您可以设置
gtid_purged
的值,以便在服务器上记录特定 GTID 集中的事务已应用,尽管它们不存在于服务器上的任何二进制日志中。此操作的一个示例用例是,当您在服务器上还原一个或多个数据库的备份时,但您没有服务器上包含事务的相关二进制日志。重要事项GTID 仅在服务器实例上可用,直到有符号 64 位整数的非负值数量(263 - 1)。如果您将
gtid_purged
的值设置为接近此限制的数字,后续提交会导致服务器用完 GTID 并采取binlog_error_action
指定的操作。当服务器实例接近限制时,会发出警告消息。有两种方法可以设置
gtid_purged
的值。您可以用您指定的 GTID 集替换gtid_purged
的值,或者您可以将您指定的 GTID 集附加到gtid_purged
已拥有的 GTID 集。如果服务器没有现有的 GTID,例如您正在使用现有数据库的备份进行配置的空服务器,则两种方法的结果相同。如果您正在还原与服务器上已存在的事务重叠的备份,例如使用 mysqldump(它包括服务器上所有事务的 GTID,即使转储是部分的)从源生成的局部转储替换损坏的表,则使用第一种方法替换gtid_purged
的值。如果您正在还原与服务器上已存在的事务不相交的备份,例如使用来自两个不同服务器的转储配置多源副本,则使用第二种方法添加到gtid_purged
的值。要使用您指定的 GTID 集替换
gtid_purged
的值,请使用以下语句:SET @@GLOBAL.gtid_purged = 'gtid_set'
gtid_set
必须是gtid_purged
当前值的超集,并且不能与gtid_subtract(gtid_executed,gtid_purged)
相交。换句话说,新 GTID 集 **必须** 包含已在gtid_purged
中的任何 GTID,并且 **不能** 包含gtid_executed
中尚未清除的任何 GTID。gtid_set
也不得包含任何在@@global.gtid_owned
中的 GTID,即当前在服务器上处理的事务的 GTID。结果是,
gtid_purged
的全局值设置为等于gtid_set
,而gtid_executed
的值变为gtid_set
和gtid_executed
的先前值的并集。要将您指定的 GTID 集附加到
gtid_purged
,请在 GTID 集之前使用加号 (+) 的以下语句:SET @@GLOBAL.gtid_purged = '+gtid_set'
gtid_set
**不能** 与gtid_executed
的当前值相交。换句话说,新 GTID 集不得包含gtid_executed
中的任何 GTID,包括已在gtid_purged
中的事务。gtid_set
也不得包含任何在@@global.gtid_owned
中的 GTID,即当前在服务器上处理的事务的 GTID。结果是,
gtid_set
将添加到gtid_executed
和gtid_purged
中。
如果服务器上存在任何来自 MySQL 5.7.7 或更早版本的二进制日志(例如,在将旧服务器升级到 MySQL 8.4 之后),在发出 SET @@GLOBAL.gtid_purged
语句后,您可能需要在服务器配置文件中设置 binlog_gtid_simple_recovery=FALSE
,然后才能重启服务器,否则 gtid_purged
可能计算错误。有关此设置所需的具体情况,请参阅 binlog_gtid_simple_recovery
的描述。