gtid-functions.md 6.5 KB
Newer Older
茶陵後's avatar
茶陵後 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
## 12.19 与全局事务标识符 (GTID) 一起使用的函数

[](<>)[](<>)

本节中描述的函数用于基于 GTID 的复制。重要的是要记住,所有这些函数都将 GTID 集的字符串表示形式作为参数。因此,GTID 集在与它们一起使用时必须始终被引用。看[GTID 集](replication-gtids-concepts.html#replication-gtids-concepts-gtid-sets)了解更多信息。

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

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

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

[](<>)

**表 12.24 GTID 函数**

| 姓名 | 描述 | 已弃用 |
| --- | --- | --- |
| [`GTID_SUBSET()`](gtid-functions.html#function_gtid-subset) | 如果子集中的所有 GTID 也在集合中,则返回 true;否则为假。 |  |
| [`GTID_SUBTRACT()`](gtid-functions.html#function_gtid-subtract) | 返回集合中所有不在子集中的 GTID。 |  |
| [`WAIT_FOR_EXECUTED_GTID_SET()`](gtid-functions.html#function_wait-for-executed-gtid-set) | 等到给定的 GTID 已在副本上执行。 |  |
| [`WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()`](gtid-functions.html#function_wait-until-sql-thread-after-gtids) | 采用`WAIT_FOR_EXECUTED_GTID_SET()`. | 8.0.18 |

-   [](<>)

    [`GTID_SUBSET(*`设置1`*,*`设置2`*)`](gtid-functions.html#function_gtid-subset)

    [](<>)

    给定两组全局事务标识符*`设置1`*和*`设置2`*, 如果所有 GTID 在*`设置1`*也在*`设置2`*.否则返回 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(*`设置1`*,*`设置2`*)`](gtid-functions.html#function_gtid-subtract)

    [](<>)

    给定两组全局事务标识符*`设置1`*和*`设置2`*, 只返回那些 GTID*`设置1`*不在*`设置2`*.

    与此函数一起使用的所有 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)
    ```

-   [](<>)

    [`WAIT_FOR_EXECUTED_GTID_SET(*`gtid_set`*[, *`暂停`*])`](gtid-functions.html#function_wait-for-executed-gtid-set)

    [](<>)

    等到服务器应用了全局事务标识符包含在其中的所有事务*`gtid_set`*;也就是说,直到条件 GTID\_子集(*`gtid_subset`*,`@@GLOBAL.gtid_executed`) 成立。看[第 17.1.3.1 节,“GTID 格式和存储”](replication-gtids-concepts.html)用于 GTID 集的定义。

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

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

    有关详细信息,请参阅[第 17.1.3 节,“使用全局事务标识符进行复制”](replication-gtids.html).

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

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

    有关 GTID 集的语法描述,请参阅[第 17.1.3.1 节,“GTID 格式和存储”](replication-gtids-concepts.html).

    为了`WAIT_FOR_EXECUTED_GTID_SET()`,返回值为查询的状态,其中0代表成功,1代表超时。任何其他故障都会产生错误。

    [`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)当任何客户端使用此功能等待应用 GTID 时,不能将其更改为 OFF。

-   [](<>)

    [`WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(*`gtid_set`*[, *`暂停`*][,*`渠道`*])`](gtid-functions.html#function_wait-until-sql-thread-after-gtids)

    [](<>)

    `WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()`已弃用。采用`WAIT_FOR_EXECUTED_GTID_SET()`相反,无论指定事务通过哪个复制通道或用户客户端到达服务器,它都可以工作。