与全局事务标识符(GTID)一起使用的函数
本节中描述的功能与基于GTID的复制一起使用。重要的是要记住,所有这些函数都将GTID集的字符串表示形式作为参数。因此,GTID集与它们一起使用时必须始终用引号引起来。有关更多信息,请参见GTID集。
两个GTID集的并集只是将它们的表示形式表示为字符串,并用逗号隔开。换句话说,您可以定义一个非常简单的函数来获取两个GTID集的并集,类似于此处创建的函数:
CREATE FUNCTION GTID_UNION(g1 TEXT, g2 TEXT)RETURNS TEXTDETERMINISTIC RETURN CONCAT(g1,',',g2);
有关GTID以及如何在实践中使用这些GTID函数的更多信息,请参见“使用全局事务标识符进行复制”。
表 GTID函数
名称 | 描述 |
---|---|
GTID_SUBSET() | 如果子集中的所有GTID也都已设置,则返回true;否则,返回true。否则为假。 |
GTID_SUBTRACT() | 返回集合中所有不在子集中的GTID。 |
WAIT_FOR_EXECUTED_GTID_SET() | 等待直到给定的GTID在从站上执行。 |
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() (不推荐使用8.0.18) | 使用WAIT_FOR_EXECUTED_GTID_SET() 。 |
GTID_SUBSET(set1,set2)
给定两组全局事务标识符
set1
和set2
,如果中的所有GTIDset1
也在中,则返回trueset2
。否则返回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)GTID_SUBTRACT(set1,set2)
给定两组全局事务标识符
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集的定义,请参见“ GTID格式和存储”。如果指定了超时,并且
timeout
在应用GTID集中的所有事务之前经过了几秒钟,则该函数停止等待。timeout
是可选的,默认超时为0秒,在这种情况下,该函数始终等待,直到已应用GTID集中的所有事务。WAIT_FOR_EXECUTED_GTID_SET()
监视服务器上应用的所有GTID,包括来自所有复制通道和用户客户端的事务。它不考虑复制通道是否已启动或停止。有关更多信息,请参见“使用全局事务标识符进行复制”。
此函数使用的GTID集以字符串表示,因此必须用引号引起,如以下示例所示:
mysql>
SELECT WAIT_FOR_EXECUTED_GTID_SET('3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5'); -> 0有关GTID集的语法说明,请参见“ 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()
代替,无论指定的事务通过哪个复制通道或用户客户端到达服务器,它都可以使用。