12.18 与全局事务标识符(GTID)一起使用的函数

本节中描述的功能与基于 GTID 的复制一起使用。重要的是要记住,所有这些函数都将 GTID 集的字符串 table 示形式作为参数。因此,GTID 集与它们一起使用时必须始终用引号引起来。有关更多信息,请参见GTID Sets

两个 GTID 集的并集只是将它们的 table 示形式 table 示为字符串,并用逗号隔开。换句话说,您可以定义一个非常简单的函数来获取两个 GTID 集的并集,类似于此处创建的函数:

CREATE FUNCTION GTID_UNION(g1 TEXT, g2 TEXT)
    RETURNS TEXT DETERMINISTIC
    RETURN CONCAT(g1,',',g2);

有关 GTID 以及如何在实践中使用这些 GTID 函数的更多信息,请参见第 16.1.3 节“使用全局事务标识符进行复制”

table12.23 GTID 函数

NameDescription
GTID_SUBSET()如果子集中的所有 GTID 也都已设置,则返回 true;否则,返回 true。否则为假。
GTID_SUBTRACT()返回集合中所有不在子集中的 GTID。
WAIT_FOR_EXECUTED_GTID_SET()await 给定的 GTID 在从站上执行。
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()使用WAIT_FOR_EXECUTED_GTID_SET()

GTID_SUBSET(set1,set2)

给定两组全局事务标识符* set1 set2 ,如果 set1 中的所有 GTID 也在 set2 *中,则返回 true。否则返回 false。

此函数使用的 GTID 集以字符串 table 示,如以下示例所示:

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 中不在 set2 *中的那些 GTID。

如以下示例所示,与此函数一起使用的所有 GTID 集都 table 示为字符串,并且必须用引号引起来:

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])

await 服务器应用所有其全局事务标识符包含在* gtid_set 中的事务;也就是说,直到条件 GTID_SUBSET( gtid_subset *,@@GLOBAL.gtid_executed)成立。有关 GTID 集的定义,请参见第 16.1.3.1 节,“ GTID 格式和存储”

如果指定了超时,并且在应用 GTID 集合中的所有事务之前* timeout *秒,该函数将停止 await。 * timeout *是可选的,默认超时为 0 秒,在这种情况下,该函数始终 await,直到 GTID 集中的所有事务都已应用。

WAIT_FOR_EXECUTED_GTID_SET()监视服务器上应用的所有 GTID,包括来自所有复制通道和用户 Client 端的事务。它不考虑复制通道是否已启动或停止。

有关更多信息,请参见第 16.1.3 节“使用全局事务标识符进行复制”

与该函数一起使用的 GTID 集以字符串 table 示,因此必须用引号引起,如以下示例所示:

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(),返回值是查询的状态,其中 0table 示成功,而 1table 示超时。任何其他故障都会产生错误。

当任何 Client 端使用此功能 awaitGTID 时,不能将gtid_mode更改为 OFF。

WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[, timeout][,channel])

WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()WAIT_FOR_EXECUTED_GTID_SET()相似,它 await 直到应用了* gtid_set 中包含其全局事务标识符的所有事务,或者直到 timeout *秒过去,以先到者为准。但是,WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()应用于特定的复制通道,并且仅在将事务应用于指定的通道(在该通道上必须运行该应用程序)后才停止。相反,WAIT_FOR_EXECUTED_GTID_SET()在应用事务之后停止,而不管它们应用到何处(在任何复制通道或任何用户 Client 端上),以及是否正在运行任何复制通道。

  • channel *选项指定该功能适用于哪个复制 Channel。如果没有命名通道,并且没有默认复制通道以外的其他通道,则该功能适用于默认复制通道。如果存在多个复制通道,则必须指定一个通道,否则该功能将应用于哪个复制通道。有关复制通道的更多信息,请参见第 16.2.3 节“复制通道”

Note

因为WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()应用于特定的复制通道,所以如果预期的事务到达其他复制通道或来自用户 Client 端,例如在故障转移或手动恢复的情况下,则如果未设置超时,则该函数可以无限期挂起。在这种情况下,请使用WAIT_FOR_EXECUTED_GTID_SET()来确保正确处理事务。

WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()一起使用的 GTID 集 table 示为字符串,并且必须以与WAIT_FOR_EXECUTED_GTID_SET()相同的方式引用。对于WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(),该函数的返回值是任意正数。如果基于 GTID 的复制未处于活动状态(也就是说,如果gtid_mode变量的值为 OFF),则此值未定义,并且WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()返回 NULL。如果从站未运行,则该函数还返回 NULL。

当任何 Client 端使用此功能 awaitGTID 时,不能将gtid_mode更改为 OFF。