Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

14.18.2 使用全局事务标识符(GTIDs)的函数

本节中描述的函数用于GTID基于的复制。请注意,这些函数都将GTID集作为字符串表示形式的参数。因此,在使用这些函数时,GTID集必须始终被引号括起来。有关GTID集的更多信息,请参阅GTID 集

两个GTID集的并集只是它们的字符串表示形式,中间用逗号分隔。换言之,您可以创建一个非常简单的函数来获取两个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
等待执行的 GTID 集(WAIT_FOR_EXECUTED_GTID_SET) 等待给定的 GTIDs 在副本上执行。

  • GTID_SUBSET(set1,set2)

    给定两个全局事务标识符集 set1set2,如果所有 GTIDs 在 set1 也在 set2 中,则返回 true。如果 set1set2 是 NULL,则返回 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 中的 GTIDs,但不在 set2 中。如果 set1set2 是 NULL,则返回 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)
  • 等待执行的 GTID 集(WAIT_FOR_EXECUTED_GTID_SET(gtid_set[, timeout])

    等待服务器应用所有在 gtid_set 中的全局事务标识符,即等待条件 GTID_SUBSET(gtid_subset, @@GLOBAL.gtid_executed) 成立。有关 GTID 集的定义,请参阅第 19.1.3.1 节,“GTID 格式和存储”

    如果指定了超时,并且在 timeout 秒内所有事务在 GTID 集中都被应用,则函数停止等待。timeout 是可选的,默认超时为 0 秒,在这种情况下,函数总是等待所有事务在 GTID 集中被应用。timeout 必须大于或等于 0;在严格 SQL 模式下,负的 timeout 值将立即被拒绝(ER_WRONG_ARGUMENTS);否则函数返回 NULL,并发出警告。

    等待执行的 GTID 集(WAIT_FOR_EXECUTED_GTID_SET) 监控服务器上应用的所有 GTIDs,包括来自所有复制通道和用户客户端的事务。它不考虑复制通道是否启动或停止。

    有关更多信息,请参阅第 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。