本节介绍的函数与基于 GTID 的复制一起使用。务必记住,所有这些函数都将 GTID 集的字符串表示形式作为参数。因此,在与它们一起使用时,必须始终将 GTID 集括起来。有关更多信息,请参阅 GTID 集。
两个 GTID 集的并集就是它们的字符串表示形式,用逗号连接在一起。换句话说,您可以定义一个非常简单的函数来获取两个 GTID 集的并集,类似于此处创建的函数
CREATE FUNCTION GTID_UNION(g1 TEXT, g2 TEXT)
RETURNS TEXT DETERMINISTIC
RETURN CONCAT(g1,',',g2);
有关 GTID 以及如何在实践中使用这些 GTID 函数的更多信息,请参阅 第 19.1.3 节“使用全局事务标识符进行复制”。
给定两组全局事务标识符
set1
和set2
,如果set1
中的所有 GTID 也在set2
中,则返回 true。如果set1
或set2
为NULL
,则返回NULL
。否则返回 false。与此函数一起使用的 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
中不在set2
中的那些 GTID。如果set1
或set2
为NULL
,则返回NULL
。与此函数一起使用的所有 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)
从 GTID 集中减去自身会产生一个空集,如下所示
mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57', -> '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G *************************** 1. row *************************** GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57', '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'): 1 row in set (0.00 sec)
WAIT_FOR_EXECUTED_GTID_SET(
gtid_set
[,timeout
])等待,直到服务器应用了全局事务标识符包含在
gtid_set
中的所有事务;也就是说,直到条件 GTID_SUBSET(gtid_subset
,@@GLOBAL.gtid_executed
) 成立。有关 GTID 集的定义,请参阅 第 19.1.3.1 节“GTID 格式和存储”。如果指定了超时,并且在应用 GTID 集中的所有事务之前经过了
timeout
秒,则该函数将停止等待。timeout
是可选的,默认超时时间为 0 秒,在这种情况下,该函数始终会等待,直到应用了 GTID 集中的所有事务。timeout
必须大于或等于 0;在严格 SQL 模式下运行时,负的timeout
值会立即被拒绝并返回错误(ER_WRONG_ARGUMENTS
);否则,该函数将返回NULL
,并引发警告。WAIT_FOR_EXECUTED_GTID_SET()
会监控服务器上应用的所有 GTID,包括来自所有复制通道和用户客户端的事务。它不考虑复制通道是已启动还是已停止。有关更多信息,请参阅 第 19.1.3 节“使用全局事务标识符进行复制”。
与此函数一起使用的 GTID 集表示为字符串,因此必须用引号括起来,如以下示例所示
mysql> SELECT WAIT_FOR_EXECUTED_GTID_SET('3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5'); -> 0
有关 GTID 集的语法说明,请参阅 第 19.1.3.1 节“GTID 格式和存储”。
对于
WAIT_FOR_EXECUTED_GTID_SET()
,返回值是查询的状态,其中 0 表示成功,1 表示超时。任何其他故障都会生成错误。当任何客户端正在使用
gtid_mode
函数等待 GTID 应用时,无法将其更改为 OFF。