本节中描述的函数与基于 GTID 的复制一起使用。请务必记住,所有这些函数都将 GTID 集的字符串表示形式作为参数。因此,GTID 集在与它们一起使用时必须始终被引用。有关详细信息,请参阅GTID 集。
两个 GTID 集的并集只是将它们表示为字符串,用插入的逗号连接在一起。换句话说,您可以定义一个非常简单的函数来获取两个 GTID 集的并集,类似于此处创建的函数:
CREATE FUNCTION GTID_UNION(g1 TEXT, g2 TEXT)
RETURNS TEXT DETERMINISTIC
RETURN CONCAT(g1,',',g2);
有关 GTID 以及如何在实践中使用这些 GTID 函数的更多信息,请参阅第 16.1.3 节,“使用全局事务标识符进行复制”。
表 12.24 GTID 函数
姓名 | 描述 |
---|---|
GTID_SUBSET() |
如果子集中的所有 GTID 也在集合中,则返回 true;否则为假。 |
GTID_SUBTRACT() |
返回集合中不在子集中的所有 GTID。 |
WAIT_FOR_EXECUTED_GTID_SET() |
等到给定的 GTID 已在副本上执行。 |
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() |
使用WAIT_FOR_EXECUTED_GTID_SET() 。
|
给定两组全局事务标识符
set1
和set2
,如果所有 GTIDset1
也在 中 ,则返回 trueset2
。否则返回假。与此函数一起使用的 GTID 集表示为字符串,如以下示例所示:
mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', -> '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G *************************** 1. row *************************** GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'): 1 1 row in set (0.00 sec) mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23-25', -> '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G *************************** 1. row *************************** GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23-25', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'): 1 1 row in set (0.00 sec) mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25', -> '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G *************************** 1. row *************************** GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'): 0 1 row in set (0.00 sec)
给定两组全局事务标识符
set1
和set2
,仅返回那些不在set1
中 的 GTIDset2
。与此函数一起使用的所有 GTID 集都表示为字符串并且必须被引用,如以下示例所示:
mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57', -> '3E11FA47-71CA-11E1-9E33-C80AA9429562:21')\G *************************** 1. row *************************** GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21'): 3e11fa47-71ca-11e1-9e33-c80aa9429562:22-57 1 row in set (0.00 sec) mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57', -> '3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25')\G *************************** 1. row *************************** GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57', '3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25'): 3e11fa47-71ca-11e1-9e33-c80aa9429562:26-57 1 row in set (0.00 sec) mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57', -> '3E11FA47-71CA-11E1-9E33-C80AA9429562:23-24')\G *************************** 1. row *************************** GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57', '3E11FA47-71CA-11E1-9E33-C80AA9429562:23-24'): 3e11fa47-71ca-11e1-9e33-c80aa9429562:21-22:25-57 1 row in set (0.01 sec)
WAIT_FOR_EXECUTED_GTID_SET(
gtid_set
[,timeout
])等到服务器应用了全局事务标识符包含在中的所有事务
gtid_set
;也就是说,直到条件 GTID_SUBSET(gtid_subset
,@@GLOBAL.gtid_executed
) 成立。有关 GTID 集的定义,请参阅 第 16.1.3.1 节,“GTID 格式和存储”。如果指定了超时,并且
timeout
在应用 GTID 集中的所有事务之前经过了秒数,则该函数将停止等待。timeout
是可选的,默认超时为 0 秒,在这种情况下,该函数始终等待,直到应用了 GTID 集中的所有事务。WAIT_FOR_EXECUTED_GTID_SET()
监控服务器上应用的所有 GTID,包括来自所有复制通道和用户客户端的事务。它不考虑复制通道是否已启动或停止。有关详细信息,请参阅第 16.1.3 节,“使用全局事务标识符进行复制”。
与此函数一起使用的 GTID 集表示为字符串,因此必须按以下示例所示引用:
mysql> SELECT WAIT_FOR_EXECUTED_GTID_SET('3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5'); -> 0
有关 GTID 集的语法描述,请参阅 第 16.1.3.1 节,“GTID 格式和存储”。
对于
WAIT_FOR_EXECUTED_GTID_SET()
,返回值是查询的状态,其中0代表成功,1代表超时。任何其他故障都会产生错误。gtid_mode
当任何客户端正在使用此功能等待应用 GTID 时,不能将其更改为 OFF。WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(
gtid_set
[,timeout
][,channel
])WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()
类似于WAIT_FOR_EXECUTED_GTID_SET()
它等待,直到应用了包含全局事务标识符的所有事务gtid_set
,或者直到timeout
秒数过去,以先发生者为准。但是,WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()
适用于特定的复制通道,并且仅在事务已应用到指定通道上后才会停止,应用程序必须为此运行。相比之下,WAIT_FOR_EXECUTED_GTID_SET()
在应用事务后停止,无论它们应用在哪里(在任何复制通道或任何用户客户端上),以及是否有任何复制通道正在运行。该
channel
功能适用于哪个复制通道的选项名称。如果没有命名通道并且不存在除默认复制通道以外的通道,则该函数适用于默认复制通道。如果存在多个复制通道,则必须指定一个通道,否则不知道该功能适用于哪个复制通道。有关复制通道的更多信息,请参阅 第 16.2.2 节,“复制通道”。笔记因为
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()
适用于特定的复制通道,如果预期事务到达不同的复制通道或来自用户客户端,例如在故障转移或手动恢复情况下,如果未设置超时,该函数可能会无限期挂起。使用WAIT_FOR_EXECUTED_GTID_SET()
instead 来确保在这些情况下正确处理事务。with 使用的 GTID 集
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()
表示为字符串,并且必须以与 for 相同的方式引用WAIT_FOR_EXECUTED_GTID_SET()
。对于WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()
,函数的返回值是任意正数。如果基于 GTID 的复制未处于活动状态(即,如果gtid_mode
变量的值为 OFF),则此值未定义并WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()
返回 NULL。如果副本未运行,则该函数也返回 NULL。gtid_mode
当任何客户端正在使用此功能等待应用 GTID 时,不能将其更改为 OFF。