Справочник по маркерам версий 7.6.6.4
Следующее обсуждение служит справочником по элементам маркеров версий:
Функции маркеров версий
Функции, описанные в этом разделе, реализуются плагином version_tokens, который устарел начиная с MySQL 9.2.0.
Библиотека плагина маркеров версий содержит несколько функций. Один набор функций позволяет управлять и просматривать список маркеров версий сервера. Другой набор функций позволяет блокировать и разблокировать маркеры версий. Для вызова любой функции маркеров версий требуется привилегия VERSION_TOKEN_ADMIN (или устаревшая привилегия SUPER).
Следующие функции позволяют создавать, изменять, удалять и просматривать список маркеров версий сервера. Интерпретация аргументов name_list и token_list (включая обработку пробелов) происходит так, как описано в разделе 7.6.6.3 «Использование маркеров версий», который предоставляет подробности о синтаксисе задания маркеров, а также дополнительные примеры.
-
version_tokens_delete(name_list)Удаляет маркеры из списка маркеров версий сервера, используя аргумент
name_list, и возвращает двоичную строку, указывающую результат операции.name_list— это список имён маркеров версий, разделённых точкой с запятой, которые необходимо удалить.mysql>
SELECT version_tokens_delete('tok1;tok3');+------------------------------------+ | version_tokens_delete('tok1;tok3') | +------------------------------------+ | 2 version tokens deleted. | +------------------------------------+Аргумент
NULLобрабатывается как пустая строка, что не оказывает влияния на список маркеров.version_tokens_delete()удаляет маркеры, указанные в аргументе, если они существуют. (Удаление несуществующих маркеров не является ошибкой.) Чтобы очистить список маркеров полностью, не зная, какие маркеры в нём находятся, передайтеNULLили строку без маркеров вversion_tokens_set():mysql>
SELECT version_tokens_set(NULL);+------------------------------+ | version_tokens_set(NULL) | +------------------------------+ | Version tokens list cleared. | +------------------------------+ mysql>SELECT version_tokens_set('');+------------------------------+ | version_tokens_set('') | +------------------------------+ | Version tokens list cleared. | +------------------------------+ -
version_tokens_edit(token_list)Изменяет список маркеров версий сервера, используя аргумент
token_list, и возвращает двоичную строку, указывающую результат операции.token_list— это список пар имён/значений маркеров, разделённых точкой с запятой, указывающий имя каждого маркера, подлежащего определению, и его значение. Если маркер существует, его значение обновляется указанным значением. Если маркер не существует, он создаётся с указанным значением. Если аргументNULLили строка без маркеров, список маркеров остаётся неизменным.mysql>
SELECT version_tokens_set('tok1=value1;tok2=value2');+-----------------------------------------------+ | version_tokens_set('tok1=value1;tok2=value2') | +-----------------------------------------------+ | 2 version tokens set. | +-----------------------------------------------+ mysql>SELECT version_tokens_edit('tok2=new_value2;tok3=new_value3');+--------------------------------------------------------+ | version_tokens_edit('tok2=new_value2;tok3=new_value3') | +--------------------------------------------------------+ | 2 version tokens updated. | +--------------------------------------------------------+ -
version_tokens_set(token_list)Заменяет список маркеров версий сервера маркерами, определёнными в аргументе
token_list, и возвращает двоичную строку, указывающую результат операции.token_list— это список пар имён/значений маркеров, разделённых точкой с запятой, указывающий имя каждого маркера, подлежащего определению, и его значение. Если аргументNULLили строка без маркеров, список маркеров очищается.mysql>
SELECT version_tokens_set('tok1=value1;tok2=value2');+-----------------------------------------------+ | version_tokens_set('tok1=value1;tok2=value2') | +-----------------------------------------------+ | 2 version tokens set. | +-----------------------------------------------+ -
Возвращает список маркеров версий сервера как двоичную строку, содержащую список пар имён/значений, разделённых точкой с запятой.
mysql>
SELECT version_tokens_show();+--------------------------+ | version_tokens_show() | +--------------------------+ | tok2=value2;tok1=value1; | +--------------------------+
Следующие функции позволяют блокировать и разблокировать маркеры версий:
-
version_tokens_lock_exclusive(token_name[,token_name] ...,timeout)Получает эксклюзивные блокировки на один или несколько маркеров версий, указанных по имени как строки, с таймаутом, если блокировки не получены в течение заданного значения таймаута.
mysql>
SELECT version_tokens_lock_exclusive('lock1', 'lock2', 10);+-----------------------------------------------------+ | version_tokens_lock_exclusive('lock1', 'lock2', 10) | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+ -
version_tokens_lock_shared(token_name[,token_name] ...,timeout)Получает общие блокировки на один или несколько маркеров версий, указанных по имени как строки, с таймаутом, если блокировки не получены в течение заданного значения таймаута.
mysql>
SELECT version_tokens_lock_shared('lock1', 'lock2', 10);+--------------------------------------------------+ | version_tokens_lock_shared('lock1', 'lock2', 10) | +--------------------------------------------------+ | 1 | +--------------------------------------------------+ -
Освобождает все блокировки, полученные в текущей сессии с помощью
version_tokens_lock_exclusive()иversion_tokens_lock_shared().mysql>
SELECT version_tokens_unlock();+-------------------------+ | version_tokens_unlock() | +-------------------------+ | 1 | +-------------------------+
Функции блокировки обладают следующими характеристиками:
Значение возвращаемого значения не равно нулю при успехе. В противном случае возникает ошибка.
Имена маркеров — строки.
В отличие от обработки аргументов для функций, манипулирующих списком маркеров сервера, пробелы вокруг аргументов имени маркера не игнорируются, и разрешены символы
=и;.Можно блокировать несуществующие имена маркеров. Это не создаёт маркеры.
Значения таймаута — целые числа, неотрицательные, представляющие время ожидания в секундах для получения блокировок, прежде чем таймаут вызовет ошибку. Если таймаут равен 0, ожидания нет, и функция выдаёт ошибку, если блокировки не могут быть получены немедленно.
Функции блокировки маркеров версий основаны на службе блокировки, описанной в разделе 7.6.9.1 «Служба блокировки».
Переменные системы токенов версий
Переменные системы, описанные в этом разделе, реализованы плагином version_tokens, который устарел в MySQL 9.2.0.
Токены версий поддерживают следующие переменные системы. Эти переменные недоступны, если плагин Токены версий не установлен (см. Раздел 7.6.6.2, «Установка или удаление токенов версий»).
Переменные системы:
-
Формат командной строки --version-tokens-session=valueУстарело Да Переменная системы version_tokens_sessionОбласть действия Глобальная, сессия Динамическая Да Применяется подсказка SET_VARНет Тип Строка Значение по умолчанию NULLЗначение сессии этой переменной задаёт список токенов клиента и указывает на те токены, которые клиентская сессия требует для списка токенов сервера.
Если переменная
version_tokens_sessionимеет значениеNULL(значение по умолчанию) или пустое значение, любой список токенов сервера соответствует. (По сути, пустое значение отключает требования сопоставления.)Если переменная
version_tokens_sessionимеет ненулевое значение, любое несоответствие между её значением и списком токенов сервера приводит к ошибке для любого оператора, отправляемого сессией на сервер. Несоответствие возникает в следующих случаях:Имя токена в значении
version_tokens_sessionотсутствует в списке токенов сервера. В этом случае возникает ошибка.Значение токена в значении
version_tokens_sessionотличается от значения соответствующего токена в списке токенов сервера. В этом случае возникает ошибка.
Не является несоответствием, если список токенов сервера включает токен, не указанный в значении
version_tokens_session.Предположим, что приложение управления установило список токенов сервера следующим образом:
mysql>
SELECT version_tokens_set('tok1=a;tok2=b;tok3=c');+--------------------------------------------+ | version_tokens_set('tok1=a;tok2=b;tok3=c') | +--------------------------------------------+ | 3 version tokens set. | +--------------------------------------------+Клиент регистрирует токены, которые требуются ему для соответствия серверу, установив значение
version_tokens_session. Затем для каждого последующего оператора, отправленного клиентом, сервер проверяет свой список токенов по отношению к значениюversion_tokens_sessionклиента и выводит ошибку, если есть несоответствие:mysql>
SET @@SESSION.version_tokens_session = 'tok1=a;tok2=b';mysql>SELECT 1;+---+ | 1 | +---+ | 1 | +---+ mysql>SET @@SESSION.version_tokens_session = 'tok1=b';mysql>SELECT 1;ERROR 3136 (42000): Version token mismatch for tok1. Correct value aПервый
SELECTвыполняется успешно, потому что токены клиентаtok1иtok2присутствуют в списке токенов сервера, и каждое значение токена в списке сервера такое же. ВторойSELECTтерпит неудачу, потому что, хотяtok1присутствует в списке токенов сервера, его значение отличается от значения, указанного клиентом.В этот момент любой оператор, отправленный клиентом, терпит неудачу, если список токенов сервера не изменится таким образом, чтобы снова соответствовать. Предположим, что приложение управления изменяет список токенов сервера следующим образом:
mysql>
SELECT version_tokens_edit('tok1=b');+-------------------------------+ | version_tokens_edit('tok1=b') | +-------------------------------+ | 1 version tokens updated. | +-------------------------------+ mysql>SELECT version_tokens_show();+-----------------------+ | version_tokens_show() | +-----------------------+ | tok3=c;tok1=b;tok2=b; | +-----------------------+Теперь значение
version_tokens_sessionклиента соответствует списку токенов сервера, и клиент снова может успешно выполнить операторы:mysql>
SELECT 1;+---+ | 1 | +---+ | 1 | +---+ -
Формат командной строки --version-tokens-session-number=#Устарело Да Переменная системы version_tokens_session_numberОбласть действия Глобальная, сессия Динамическая Нет Применяется подсказка SET_VARНет Тип Целое число Значение по умолчанию 0Эта переменная предназначена для внутреннего использования.
© 2025 Oracle
Licensed under the GPLv2 License.