14.18.2 GTID 函数
本节中描述的函数用于基于GTID的复制。需要注意的是,这些函数都接受字符串表示形式的GTID集作为参数。因此,在使用它们时,总是需要将GTID集用引号括起来。关于GTID集的更多信息,请参见GTID Sets。
两个GTID集的并集 simply 是它们的字符串表示形式,通过逗号分隔。换言之,您可以定义一个简单的函数来获取两个GTID集的并集,类似于以下所创建的:
CREATE FUNCTION GTID_UNION(g1 TEXT, g2 TEXT)
RETURNS TEXT DETERMINISTIC
RETURN CONCAT(g1,',',g2);
关于GTIDs和这些GTID函数在实际应用中的更多信息,请参见第19.1.3节,“基于全局事务标识符的复制”。
-
给定两个全局事务标识符集
set1
和set2
set1
中也存在于set2
中。返回NULL
如果set1
或set2
为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。返回NULL
如果set1
或set2
为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
)成立。见第19.1.3.1节,“GTID格式和存储”了解GTID集的定义。如果指定超时时间,并且在
timeout
秒内所有GTID集事务都未被应用,函数停止等待。timeout
是可选的,默认超时时间为0秒,在这种情况下,函数总是等待直到所有GTID集事务都被应用。timeout
必须大于或等于0;在严格SQL模式下,负值timeout
将立即被拒绝并返回错误(ER_WRONG_ARGUMENTS
);否则函数返回NULL
,并引发警告。WAIT_FOR_EXECUTED_GTID_SET()
监控服务器上所有应用的事务,包括来自所有复制通道和用户客户端的事务。它不考虑复制通道是否启动或停止。了解更多信息,请见第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。