以下讨论作为版本标记元素的参考:
版本标记插件库包括多个函数。一个函数集允许服务器的版本标记列表被操作和检查。另一个函数集允许版本标记被锁定和解锁。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是一个以分号分隔的对,指定要定义的每个标记的名称及其值。如果标记存在,其值将被更新为给定的值。如果标记不存在,将创建该标记并将其值设置为给定的值。如果参数为name=valueNULL或包含无标记的字符串,标记列表将保持不变。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是一个以分号分隔的对,指定要定义的每个标记的名称及其值。如果参数为name=valueNULL或包含无标记的字符串,标记列表将被清除。mysql> SELECT version_tokens_set('tok1=value1;tok2=value2'); +-----------------------------------------------+ | version_tokens_set('tok1=value1;tok2=value2') | +-----------------------------------------------+ | 2 version tokens set. | +-----------------------------------------------+ -
返回服务器的版本标记列表作为一个二进制字符串,包含一个以分号分隔的
对列表。name=valuemysql> SELECT version_tokens_show(); +--------------------------+ | version_tokens_show() | +--------------------------+ | tok2=value2;tok1=value1; | +--------------------------+
以下函数允许版本标记被锁定和解锁:
-
版本令牌独占锁定(token_name[,token_name] ...,timeout)获取一个或多个版本令牌的独占锁定,指定名称为字符串,超时时以错误形式返回,如果锁定不能在给定的超时值内获取。
mysql> SELECT version_tokens_lock_exclusive('lock1', 'lock2', 10); +-----------------------------------------------------+ | version_tokens_lock_exclusive('lock1', 'lock2', 10) | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+ -
版本令牌共享锁定(token_name[,token_name] ...,timeout)获取一个或多个版本令牌的共享锁定,指定名称为字符串,超时时以错误形式返回,如果锁定不能在给定的超时值内获取。
mysql> SELECT version_tokens_lock_shared('lock1', 'lock2', 10); +--------------------------------------------------+ | version_tokens_lock_shared('lock1', 'lock2', 10) | +--------------------------------------------------+ | 1 | +--------------------------------------------------+ -
释放当前会话中使用
版本令牌独占锁定()和版本令牌共享锁定()获取的所有锁定。mysql> SELECT version_tokens_unlock(); +-------------------------+ | version_tokens_unlock() | +-------------------------+ | 1 | +-------------------------+
锁定函数共享以下特征:
-
返回值为非零表示成功,否则发生错误。
-
令牌名称为字符串。
-
与服务器令牌列表操作函数不同的是,token 名称参数周围的空格不被忽略,并且允许使用
=和;字符。 -
可以锁定不存在的令牌名称。这不会创建令牌。
-
超时值为非负整数,表示等待获取锁定的秒数。如果超时值为 0,则不等待,如果锁定不能立即获取,则产生错误。
-
版本令牌锁定函数基于 第 7.6.9.1 节,“锁定服务” 中描述的锁定服务。
版本令牌支持以下系统变量。这些变量仅在安装了版本令牌插件时可用(见 第 7.6.6.2 节,“安装或卸载版本令牌”)。
系统变量:
-
Command-Line Format --version-tokens-session=valueSystem Variable 版本令牌会话Scope 全局、会话 Dynamic 是 SET_VARHint Applies否 Type 字符串 Default Value NULL该会话变量指定客户端版本令牌列表,指示客户端会话需要服务器版本令牌列表拥有的令牌。
如果
版本令牌会话变量为NULL(默认)或为空值,则任何服务器版本令牌列表都匹配。(实际上,空值禁用了匹配要求。)如果
版本令牌会话变量具有非空值,则任何服务器版本令牌列表与其值不匹配将导致会话发送到服务器的任何语句出错。这种不匹配情况下会出现以下情况:-
令牌名称在
版本令牌会话值中不存在于服务器令牌列表中。在这种情况下,会出现ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND错误。 -
令牌值在
版本令牌会话值中与服务器令牌列表中的对应令牌值不同。在这种情况下,会出现ER_VTOKEN_PLUGIN_TOKEN_MISMATCH错误。
服务器版本令牌列表中包含未命名的令牌并不算是Mismatch。
假设管理应用程序将服务器令牌列表设置如下:
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值,并在出现Mismatch时产生错误: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 | +---+ -
-
Command-Line Format --version-tokens-session-number=#System Variable version_tokens_session_numberScope 全局、会话 Dynamic 否 SET_VARHint Applies否 Type 整数 Default Value 0该变量仅供内部使用。