本节中描述的 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 9.0 之后),并且
binlog_gtid_simple_recovery=TRUE
,则在以下两种情况下gtid_executed
和gtid_purged
可能会被错误地初始化最新的二进制日志是由 MySQL 5.7.5 或更早版本生成的,并且对于某些二进制日志
gtid_mode
为ON
,而对于最新的二进制日志则为OFF
。在 MySQL 5.7.7 或更早版本上发出
SET @@GLOBAL.gtid_purged
语句,并且在执行SET @@GLOBAL.gtid_purged
语句时处于活动状态的二进制日志尚未被清除。
如果在这两种情况下计算出不正确的 GTID 集,则即使服务器随后在
binlog_gtid_simple_recovery=FALSE
的情况下重启,它仍然是不正确的。如果上述两种情况之一适用于服务器或可能适用于服务器,请在启动或重启服务器之前将binlog_gtid_simple_recovery=FALSE
设置为FALSE
。当
binlog_gtid_simple_recovery=FALSE
设置时,计算gtid_executed
和gtid_purged
的方法,如 Thegtid_purged
System Variable 中所述,将更改为如下迭代二进制日志文件:不是使用
Previous_gtids_log_event
的值和来自最新二进制日志文件的 GTID 日志事件,而是从最新二进制日志文件开始迭代计算gtid_executed
,并使用Previous_gtids_log_event
的值和来自第一个二进制日志文件的任何 GTID 日志事件(在其中找到Previous_gtids_log_event
值)。如果服务器的最新二进制日志文件没有 GTID 日志事件,例如,如果gtid_mode=ON
已被使用但服务器后来被更改为gtid_mode=OFF
,则此过程可能需要很长时间。不是使用来自最旧二进制日志文件的
Previous_gtids_log_event
的值,而是从最旧的二进制日志文件开始迭代计算gtid_purged
,并使用来自第一个二进制日志文件的Previous_gtids_log_event
的值(在其中找到非空的Previous_gtids_log_event
值,或至少一个 GTID 日志事件,表示 GTID 的使用从该点开始)。如果服务器的旧二进制日志文件没有 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 相同的事务或相同语句中进行非事务性 DML。
CREATE TABLE ... SELECT
语句支持存储引擎,这些存储引擎支持原子 DDL。
有关更多信息,请参阅 第 19.1.3.7 节,“使用 GTID 进行复制的限制”。
在 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 集。当服务器启动时,
@@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 表压缩。
-
命令行格式 --gtid-mode=MODE
系统变量 gtid_mode
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 OFF
有效值 OFF
OFF_PERMISSIVE
ON_PERMISSIVE
ON
控制是否启用基于 GTID 的日志记录以及日志可以包含哪种类型的事务。您必须具有足够的权限来设置全局系统变量。参阅 第 7.1.9.1 节,“系统变量权限”。在您设置
gtid_mode=ON
之前,必须将enforce_gtid_consistency
设置为ON
。在修改此变量之前,请参阅 第 19.1.4 节,“在联机服务器上更改 GTID 模式”。记录的事务可以是匿名的,也可以使用 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(请参阅 第 19.1.3 节,“使用全局事务标识符进行复制”)。
设置此系统变量的会话值是一个受限操作。会话用户必须拥有
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 的列表,以及拥有它们的线程的 ID。此变量对于多线程副本来说非常有用,可以用来检查事务是否已经在另一个线程上应用。应用线程在处理事务的整个过程中都会获取事务 GTID 的所有权,因此@@global.gtid_owned
在处理期间会显示 GTID 和所有者。事务提交(或回滚)后,应用线程会释放 GTID 的所有权。在会话范围内使用时,
gtid_owned
包含当前由该会话使用并拥有的单个 GTID。此变量主要用于测试和调试客户端通过设置gtid_next
为事务显式分配 GTID 时 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 集替换
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 9.0 之后),在发出 SET @@GLOBAL.gtid_purged
语句后,您可能需要在服务器配置文件中设置 binlog_gtid_simple_recovery=FALSE
,然后重启服务器,否则 gtid_purged
可能计算错误。有关需要此设置的情况的详细信息,请参阅 binlog_gtid_simple_recovery
的说明。