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
| Имя | Описание |
|---|---|
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(). |
-
Принимая два набора глобальных идентификаторов транзакций
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) -
Принимая два набора глобальных идентификаторов транзакций
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.