本节描述的MySQL Server系统变量用于监控和控制全局事务标识符(GTIDs)。有关更多信息,请参阅第19.1.3节,“使用全局事务标识符的复制”。
-
Command-Line Format --binlog-gtid-simple-recovery[={OFF|ON}]
System Variable binlog_gtid_simple_recovery
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
该变量控制MySQL启动或重新启动时在搜索GTIDs时如何迭代二进制日志文件。
当
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.3时),则
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语句,而在执行该语句时活动的二进制日志尚未被清除。
如果在这两种情况下计算出错误的GTID集,即使服务器后来以
binlog_gtid_simple_recovery=FALSE
重新启动,GTID集仍将保持不正确。如果这两种情况适用或可能适用服务器,请在启动或重新启动服务器之前将binlog_gtid_simple_recovery
设置为FALSE。当
binlog_gtid_simple_recovery=FALSE
时,gtid_executed
和gtid_purged
的计算方法将更改为迭代二进制日志文件,如gtid_purged系统变量所述。-
不使用
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
只是在服务器上最近设置的,这个过程可能需要很长时间。
-
-
Command-Line Format --enforce-gtid-consistency[=value]
System Variable enforce_gtid_consistency
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举 Default Value OFF
Valid Values OFF
ON
WARN
根据这个变量的值,服务器强制 GTID 一致性,仅允许执行可以安全地使用 GTID 记录的语句。你 必须 在启用基于 GTID 的复制之前将这个变量设置为
ON
。可以将
enforce_gtid_consistency
配置为以下值:-
OFF
:所有事务都允许违反 GTID 一致性。 -
ON
:不允许任何事务违反 GTID 一致性。 -
WARN
:所有事务都允许违反 GTID 一致性,但是在这种情况下生成警告。
--enforce-gtid-consistency
只在语句被记录到二进制日志时生效。如果二进制日志记录被禁用或语句被过滤器删除,那么 GTID 一致性不会被检查或强制。只有可以使用 GTID 安全语句记录的语句可以被记录,当
enforce_gtid_consistency
设置为ON
时,因此以下操作不能与这个选项一起使用:-
CREATE TEMPORARY TABLE
或DROP TEMPORARY TABLE
语句在事务中。 -
事务或语句更新了事务和非事务表。有一个例外,即非事务 DML 在同一事务或同一语句中与事务 DML 一起使用,如果所有 非事务 表都是临时的。
-
CREATE TABLE ... SELECT
语句支持 atomic 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
和信息模式。 -
-
System Variable gtid_executed
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 字符串 Unit GTID 集合 当使用全局作用域时,该变量包含服务器上执行的所有事务的表示形式和 GTID 集合,该集合是通过
SET
gtid_purged
语句设置的。这与SHOW BINARY LOG STATUS
和SHOW REPLICA STATUS
的Executed_Gtid_Set
列的值相同。该变量的值是一个 GTID 集合,更多信息请参阅 GTID 集合。当服务器启动时,
@@GLOBAL.gtid_executed
被初始化。更多信息请参阅binlog_gtid_simple_recovery
,了解二进制日志如何被迭代以填充gtid_executed
。然后,GTIDs 将被添加到集合中,因为事务被执行,或者如果任何SET
gtid_purged
语句被执行。在任何给定时间,二进制日志中的事务集合等于
GTID_SUBTRACT(@@GLOBAL.gtid_executed, @@GLOBAL.gtid_purged)
;也就是说,所有在二进制日志中尚未被清除的事务。发出
RESET BINARY LOGS AND GTIDS
将导致该变量被重置为空字符串。GTIDs 不会从该集合中删除,除非是由于RESET BINARY LOGS AND GTIDS
。 -
gtid_executed_compression_period
Command-Line Format --gtid-executed-compression-period=#
System Variable gtid_executed_compression_period
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 4294967295
每处理多少事务后压缩
mysql.gtid_executed
表。当服务器上启用二进制日志记录时,不使用这种压缩方法,而是每次二进制日志轮换时压缩mysql.gtid_executed
表。当服务器上禁用二进制日志记录时,压缩线程休眠,直到执行了指定数量的事务,然后醒来执行mysql.gtid_executed
表的压缩。将该系统变量的值设置为 0 意味着线程永远不会醒来,因此不使用这种显式压缩方法。相反,压缩将隐式地如有必要进行。InnoDB
事务由单独的进程写入mysql.gtid_executed
表,而非InnoDB
事务。如果服务器混合了InnoDB
事务和非InnoDB
事务,那么由该系统变量控制的压缩将干扰该进程的工作,并可能严重减慢其速度。因此,从该版本开始,建议将gtid_executed_compression_period
设置为 0。所有事务(无论存储引擎)都由同一个进程写入
mysql.gtid_executed
表,而gtid_executed_compression_period
的默认值为 0。请参阅 mysql.gtid_executed 表压缩 以获取更多信息。
-
Command-Line Format --gtid-mode=MODE
System Variable gtid_mode
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举 Default Value OFF
Valid Values OFF
OFF_PERMISSIVE
ON_PERMISSIVE
ON
控制基于 GTID 的日志记录是否启用,以及日志中可以包含什么类型的事务。您必须拥有足够的权限来设置全局系统变量。请参阅 第 7.1.9.1 节,“系统变量权限”。
enforce_gtid_consistency
必须设置为ON
,然后才能设置gtid_mode=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_mode
的值如何,gtid_purged
和gtid_executed
的值将保持不变。因此,即使更改了gtid_mode
的值,这些变量也将包含正确的值。 -
-
System Variable gtid_next
Scope 会话 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举 Default Value 自动
Valid Values 自动
自动:
标签
匿名
UUID
:NUMBER
UUID
:标签
:NUMBER
该变量用于指定是否和如何获取下一个 GTID(参见 第 19.1.3 节,“使用全局事务标识符的复制”)。
设置该系统变量的会话值是一个受限的操作。会话用户必须具有
REPLICATION_APPLIER
权限(参见 第 19.3.3 节,“复制权限检查”),或具有足以设置受限会话变量的权限(参见 第 7.1.9.1 节,“系统变量权限”)。gtid_next
可以取以下任何值:-
自动
:使用下一个自动生成的全局事务 ID。 -
自动:
:使用下一个自动生成的全局事务 ID,并添加一个用户指定的标签,以 UUID:标签
标签
:NUMBER 格式。标签必须匹配正则表达式
[a-z_][a-z0-9_]{0,7}
;换言之,它必须符合以下规则:-
标签必须由 1-8 个字符(包括)组成。
-
第一个字符可以是任何字母
a
到z
,或下划线 (_
)。 -
每个剩余字符可以是任何字母
a
到z
,数字0
到9
,或下划线 (_
)。
将
gtid_next
设置为自动:
或标签
需要UUID
:标签
:NUMBER
TRANSACTION_GTID_TAG
权限加上至少一个SYSTEM_VARIABLES_ADMIN
,SESSION_VARIABLES_ADMIN
或REPLICATION_APPLIER
权限。 -
-
匿名
:事务没有全局标识符,只是通过文件和位置标识。 -
一个全局事务 ID,以
UUID
:NUMBER
或UUID
:标签
:NUMBER
格式。
哪些选项是有效的取决于
gtid_mode
的设置;参见 第 19.1.4.1 节,“复制模式概念” 以获取更多信息。设置该变量对gtid_mode
为OFF
时无效。在将该变量设置为
或UUID
:NUMBER
,并且事务已经提交或回滚后,必须再次发出明确的UUID
:标签
:NUMBER
SET gtid_next
语句,然后才能执行其他语句。DROP TABLE
或DROP TEMPORARY TABLE
在使用于非临时表和临时表的组合时,或者在使用事务存储引擎的临时表和非事务存储引擎的临时表时,会失败并显示明确的错误。有关更多信息,请参阅gtid_next 系统变量,以及第 19.1.4 节,“在线服务器上的 GTID 模式更改”。
-
-
System Variable gtid_owned
Scope 全局、会话 Dynamic 否 SET_VAR
Hint Applies否 Type 字符串 Unit GTID 集合 该只读变量主要用于内部使用。其内容取决于其作用域。
-
当使用全局作用域时,
gtid_owned
持有当前服务器上使用的所有 GTID 的列表,包括线程所有者的 ID。这主要用于多线程副本检查事务是否已经在另一个线程上应用。@@global.gtid_owned
显示 GTID 和所有者,直到事务被提交(或回滚)。 -
当使用会话作用域时,
gtid_owned
持有当前会话使用的单个 GTID。这主要用于测试和调试 GTID 使用时,客户端明确分配了事务的 GTID 通过设置gtid_next
。在这种情况下,@@session.gtid_owned
显示 GTID,直到事务被提交(或回滚)。当客户端完成事务处理时,变量将被清除。如果使用gtid_next=AUTOMATIC
,gtid_owned
只在事务提交语句执行期间短暂填充,因此无法从关心的会话中观察到,尽管它在@@global.gtid_owned
中列出。如果您需要跟踪客户端在会话中处理的 GTID,可以启用由session_track_gtids
系统变量控制的会话状态跟踪器。
-
-
System Variable gtid_purged
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 字符串 Unit 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
的描述,以了解需要这种设置的情况。发出
RESET BINARY LOGS AND GTIDS
导致gtid_purged
的值被重置为空字符串。您可以设置
gtid_purged
的值,以便在服务器上记录某个 GTID 集中的事务已经被应用,尽管它们不在服务器上的任何二进制日志中。例如,当您从备份中恢复一个或多个数据库到服务器上,但您没有包含这些事务的相关二进制日志时。ImportantGTIDs 只有在服务器实例上可用,直到 signed 64 位整数的非负值的数量(263 - 1)。如果您将
gtid_purged
的值设置为接近该限制的数字,后续的提交可能会导致服务器耗尽 GTIDs 并执行binlog_error_action
指定的操作。当服务器实例接近该限制时,会发出警告消息。有两种方法可以设置
gtid_purged
的值。您可以将gtid_purged
的值替换为指定的 GTID 集,或者将指定的 GTID 集追加到gtid_purged
的值中。如果服务器没有现有的 GTIDs,例如空服务器,您正在使用备份来 provision 数据库,那么这两种方法都将产生相同的结果。如果您正在恢复一个部分备份,例如使用 mysqldump 生成的备份(包括服务器上的所有事务的 GTIDs,即使备份是部分的),那么使用第一种方法替换gtid_purged
的值。如果您正在恢复一个不相交的备份,例如使用来自两个不同服务器的备份来 provision 多源副本,那么使用第二种方法追加到gtid_purged
的值中。-
要将
gtid_purged
的值替换为指定的 GTID 集,使用以下语句:SET @@GLOBAL.gtid_purged = 'gtid_set'
gtid_set
必须是当前gtid_purged
值的超集,且不能与gtid_subtract(gtid_executed,gtid_purged)
相交。换言之,新的 GTID 集 必须 包含已经在gtid_purged
中的 GTIDs,且 不能 包含已经在gtid_executed
中的 GTIDs,但还没有被清除。gtid_set
也不能包含当前服务器上正在处理的事务的 GTIDs,即@@global.gtid_owned
中的 GTIDs。结果是全局
gtid_purged
的值被设置为gtid_set
,而gtid_executed
的值变为gtid_set
和之前gtid_executed
的值的并集。 -
要将指定的 GTID 集追加到
gtid_purged
中,使用以下语句,带有加号 (+) 前缀的 GTID 集:<|start_header_id|>assistant<|end_header_id|> Please note that I've translated the text into Chinese, but I didn't touch the HTML tags and code snippets. If you need any further assistance, feel free to ask!SET @@GLOBAL.gtid_purged = '+gtid_set'
gtid_set
不能与当前的gtid_executed
值相交。在其他 words,新的 GTID 集不能包括gtid_executed
中的任何 GTID,包括已经在gtid_purged
中的交易,也不能包括gtid_purged
中的交易。gtid_set
也不能包括@@global.gtid_owned中的任何 GTID,即当前服务器上正在处理的交易的 GTID。
-
如果服务器上存在来自 MySQL 5.7.7 或更旧版本的二进制日志文件(例如,在升级旧服务器到 MySQL 8.3 后),在发出SET @@GLOBAL.gtid_purged
语句后,您可能需要在服务器的配置文件中设置binlog_gtid_simple_recovery=FALSE
,然后重新启动服务器,否则gtid_purged
可能会被计算错误。请参阅binlog_gtid_simple_recovery
的描述,以了解需要此设置的情况。