扩展 MySQL 8.0  / 第 6 章 向 MySQL 添加函数  /  12.18 与全局事务 ID 一起使用的函数

12.18 与全局事务 ID 一起使用的函数

本节中描述的函数与基于 GTID 的复制一起使用。重要的是要记住,所有这些函数都将 GTID 集的字符串表示形式作为参数——因此,在与它们一起使用时必须始终引用 GTID 集。

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

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

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

表 12.22 GTID 函数

姓名 描述 弃用
GTID_SUBSET() 如果子集中的所有 GTID 也在集合中,则返回 true;否则为假。
GTID_SUBTRACT() 返回集合中不在子集中的所有 GTID。
SQL_THREAD_WAIT_AFTER_GTIDS() 过时的。使用WAIT_FOR_EXECUTED_GTID_SET() 是的
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() 使用WAIT_FOR_EXECUTED_GTID_SET()

  • GTID_SUBSET(subset,set)

    给定两组全局事务 ID subsetset,如果所有 GTIDsubset也在 中 ,则返回真 (1) set。否则返回假 (0)。

    与此函数一起使用的 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(set,subset)

    给定两组全局事务 ID subsetset,仅返回那些不在 set中 的 GTID subset

    与此函数一起使用的所有 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)
  • SQL_THREAD_WAIT_AFTER_GTIDS(gtid_set[, timeout])

    SQL_THREAD_WAIT_AFTER_GTIDS()在 MySQL 5.6.5 中添加,并 WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() 在 MySQL 5.6.9 中替换为。(漏洞 #14775984)

    有关详细信息,请参阅第 17.1.3 节,“使用全局事务标识符进行复制”

  • WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[, timeout])

    等到副本 SQL 线程执行了所有事务,其全局事务标识符包含在gtid_set(请参阅 第 17.1.3.1 节,“GTID 概念”,了解GTID 集的定义),或者直到 timeout几秒钟过去,以先发生者为准. timeout是可选的;默认超时为 0 秒,在这种情况下,源只是等待,直到 GTID 集中的所有事务都已执行。

    在 MySQL 5.6.9 之前, WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()被命名为 SQL_THREAD_WAIT_AFTER_GTIDS(). (漏洞 #14775984)

    有关详细信息,请参阅第 17.1.3 节,“使用全局事务标识符进行复制”

    与此函数一起使用的 GTID 集表示为字符串,因此必须按以下示例所示引用:

    mysql> SELECT WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS('3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5');
            -> 5

    返回值是已执行的事务事件数。在 MySQL 5.6.8 之前,如果没有设置超时并且在基于 GTID 的复制未处于活动状态时调用该函数,则该函数的行为不可预测;在 MySQL 5.6.8 及更高版本中,该函数在is NULL时 返回。(漏洞 #14640065) gtid_modeOFF