Spec-Zone.ru › MySQL 5.7

12.18 Функции, используемые с идентификаторами глобальных транзакций (GTID)

Функции, описанные в этом разделе, используются с репликацией на основе GTID. Важно помнить, что все эти функции принимают строковые представления наборов GTID в качестве аргументов. Таким образом, наборы GTID всегда должны быть заключены в кавычки при использовании с ними. Дополнительную информацию см. в разделе Наборы GTID.

Объединение двух наборов GTID просто представляет собой их строковые представления, соединенные запятой. Другими словами, вы можете определить очень простую функцию для получения объединения двух наборов GTID, аналогичную той, что создана здесь:

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

Дополнительную информацию о GTID и о том, как эти функции GTID используются на практике, см. в разделе Раздел 16.1.3, «Репликация с глобальными идентификаторами транзакций».

Таблица 12.24 Функции GTID

Таблица 12.24 Функции GTID
Имя Описание
GTID_SUBSET() Возвращает true, если все GTID в подмножестве также находятся в наборе; в противном случае возвращает false.
GTID_SUBTRACT() Возвращает все GTID в наборе, которые не находятся в подмножестве.
WAIT_FOR_EXECUTED_GTID_SET() Ожидает, пока заданные GTID будут выполнены на реплике.
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() Используйте WAIT_FOR_EXECUTED_GTID_SET().

  • GTID_SUBSET(set1,set2)

    Принимая два набора глобальных идентификаторов транзакций set1 и set2, возвращает true, если все GTID в set1 также находятся в set2. В противном случае возвращает 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)

    Принимая два набора глобальных идентификаторов транзакций set1 и set2, возвращает только те GTID из set1, которые не находятся в set2.

    Все наборы 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 см. в разделе Раздел 16.1.3.1, «Формат и хранение GTID».

    Если задан таймаут и истекут timeout секунд, прежде чем все транзакции в наборе GTID будут применены, функция прекратит ожидание. timeout является необязательным, а значение таймаута по умолчанию составляет 0 секунд, в этом случае функция всегда ждет, пока все транзакции в наборе GTID будут применены. timeout должно быть больше или равно 0; начиная с MySQL 5.7.18, при выполнении в строгом режиме SQL отрицательное значение timeout сразу отбрасывается с ошибкой; в противном случае функция возвращает NULL и выводит предупреждение.

    WAIT_FOR_EXECUTED_GTID_SET() отслеживает все GTID, которые применяются на сервере, включая транзакции, поступающие со всех каналов репликации и от пользовательских клиентов. Она не учитывает, были ли начаты или остановлены каналы репликации.

    Дополнительную информацию см. в разделе Раздел 16.1.3, «Репликация с глобальными идентификаторами транзакций».

    Наборы GTID, используемые с этой функцией, представляются в виде строк и поэтому должны быть заключены в кавычки, как показано в следующем примере:

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

    Описание синтаксиса для наборов GTID см. в разделе Раздел 16.1.3.1, «Формат и хранение GTID».

    Для WAIT_FOR_EXECUTED_GTID_SET() возвращаемое значение — состояние запроса, где 0 соответствует успеху, а 1 — таймауту. Любые другие ошибки генерируют ошибку.

    gtid_mode нельзя изменить на OFF, пока какой-либо клиент использует эту функцию для ожидания применения GTID.

  • WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[, timeout][,channel])

    WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() подобна WAIT_FOR_EXECUTED_GTID_SET() в том, что она ждет, пока все транзакции, глобальные идентификаторы которых содержатся в gtid_set, не будут применены или пока не истечет timeout секунд, что наступит раньше. Однако WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() относится к определенному каналу репликации и останавливается только после того, как транзакции будут применены в указанном канале, при этом приложение должно быть запущено. В отличие от этого, WAIT_FOR_EXECUTED_GTID_SET() останавливается после применения транзакций, независимо от того, где они были применены (на любом канале репликации или любом пользовательском клиенте), и независимо от того, работают ли каналы репликации.

    timeout должно быть больше или равно 0; начиная с MySQL 5.7.18, при выполнении в строгом режиме SQL отрицательное значение timeout сразу же отклоняется с ошибкой, в противном случае WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() возвращает NULL и выводит предупреждение.

    Имя параметра channel, которому функция применяет к какому каналу репликации. Если ни один канал не указан, а других каналов, кроме стандартного, нет, функция применяется к стандартному каналу репликации. Если существуют несколько каналов репликации, вы должны указать канал, так как в противном случае неизвестно, к какому каналу репликации функция применяется. Дополнительную информацию о каналах репликации см. в разделе Раздел 16.2.2, «Каналы репликации».

    Примечание

    Поскольку WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() применяется к определенному каналу репликации, если ожидаемая транзакция поступает по другому каналу репликации или от пользовательского клиента, например, в ситуации с отказом или ручной восстановлением, функция может зависнуть на неопределенное время, если таймаут не задан. Используйте WAIT_FOR_EXECUTED_GTID_SET() для обеспечения корректной обработки транзакций в таких ситуациях.

    Наборы GTID, используемые с WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(), представляются в виде строк и должны быть заключены в кавычки так же, как и для WAIT_FOR_EXECUTED_GTID_SET(). Для WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() возвращаемое значение функции — произвольное положительное число. Если репликация на основе GTID не активна (то есть, если значение переменной gtid_mode равно OFF), то это значение не определено, и WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() возвращает NULL. Если реплика не запущена, функция также возвращает NULL.

    gtid_mode нельзя изменить на OFF, пока какой-либо клиент использует эту функцию для ожидания применения GTID.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/gtid-functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API