本节描述的MySQL Server系统变量用于监控和控制全局事务标识符(GTIDs)。有关更多信息,请参阅第19.1.3节,“使用全局事务标识符的复制”。
-
Command-Line Format --binlog-gtid-simple-recovery[={OFF|ON}]System Variable binlog_gtid_simple_recoveryScope 全局 Dynamic 否 SET_VARHint 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_consistencyScope 全局 Dynamic 是 SET_VARHint Applies否 Type 枚举 Default Value OFFValid Values OFFONWARN根据这个变量的值,服务器强制 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_executedScope 全局 Dynamic 否 SET_VARHint Applies否 Type 字符串 Unit GTID 集合 当使用全局作用域时,该变量包含服务器上执行的所有事务的表示形式和 GTID 集合,该集合是通过
SETgtid_purged语句设置的。这与SHOW BINARY LOG STATUS和SHOW REPLICA STATUS的Executed_Gtid_Set列的值相同。该变量的值是一个 GTID 集合,更多信息请参阅 GTID 集合。当服务器启动时,
@@GLOBAL.gtid_executed被初始化。更多信息请参阅binlog_gtid_simple_recovery,了解二进制日志如何被迭代以填充gtid_executed。然后,GTIDs 将被添加到集合中,因为事务被执行,或者如果任何SETgtid_purged语句被执行。在任何给定时间,二进制日志中的事务集合等于
GTID_SUBTRACT(@@GLOBAL.gtid_executed, @@GLOBAL.gtid_purged);也就是说,所有在二进制日志中尚未被清除的事务。发出
RESET BINARY LOGS AND GTIDS将导致该变量被重置为空字符串。GTIDs 不会从该集合中删除,除非是由于RESET BINARY LOGS AND GTIDS。 -
gtid_executed_compression_periodCommand-Line Format --gtid-executed-compression-period=#System Variable gtid_executed_compression_periodScope 全局 Dynamic 是 SET_VARHint Applies否 Type 整数 Default Value 0Minimum Value 0Maximum 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=MODESystem Variable gtid_modeScope 全局 Dynamic 是 SET_VARHint Applies否 Type 枚举 Default Value OFFValid Values OFFOFF_PERMISSIVEON_PERMISSIVEON控制基于 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_nextScope 会话 Dynamic 是 SET_VARHint Applies否 Type 枚举 Default Value 自动Valid Values 自动自动:标签匿名UUID:NUMBERUUID:标签: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:标签:NUMBERTRANSACTION_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:标签:NUMBERSET gtid_next语句,然后才能执行其他语句。DROP TABLE或DROP TEMPORARY TABLE在使用于非临时表和临时表的组合时,或者在使用事务存储引擎的临时表和非事务存储引擎的临时表时,会失败并显示明确的错误。有关更多信息,请参阅gtid_next 系统变量,以及第 19.1.4 节,“在线服务器上的 GTID 模式更改”。
-
-
System Variable gtid_ownedScope 全局、会话 Dynamic 否 SET_VARHint 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_purgedScope 全局 Dynamic 是 SET_VARHint 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的描述,以了解需要此设置的情况。