Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Functions Used with Global Transaction Identifiers (GTIDs)

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节,“基于全局事务标识符的复制”

表14.26 GTID 函数

Name Description
WAIT_FOR_EXECUTED_GTID_SET() 等待给定的GTIDs在副本上执行。

  • GTID_SUBSET(set1,set2)

    给定两个全局事务标识符集set1set2set1中也存在于set2中。返回NULL如果set1set2NULL,否则返回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)

    给定两个全局事务标识符集set1set2set1中不在set2中的GTID。返回NULL如果set1set2NULL

    使用该函数的所有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。