文档主页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  与全局事务标识符 (GTID) 一起使用的函数

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

本节中描述的函数用于基于 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 节,“使用全局事务标识符的复制”

表 14.26 GTID 函数

名称 描述
WAIT_FOR_EXECUTED_GTID_SET() 等待给定的 GTID 在副本上执行。

  • GTID_SUBSET(set1,set2)

    给定两个全局事务标识符集 set1set2,如果 set1 中的所有 GTID 也在 set2 中,则返回 true。如果 set1set2NULL,则返回 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)
  • GTID_SUBTRACT(set1,set2)

    给定两个全局事务标识符集 set1set2,仅返回 set1 中不在 set2 中的 GTID。如果 set1set2NULL,则返回 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 时,gtid_mode 不能更改为 OFF。