以下讨论可作为对这些版本令牌组件的参考:
版本令牌功能
版本令牌插件库包括几个用户定义的函数。一组UDF允许操作和检查服务器的版本令牌列表。另一组UDF允许锁定和解锁版本令牌。 调用任何版本令牌UDF都需要该 VERSION_TOKEN_ADMIN特权(或不建议使用的SUPER特权)。
以下UDF允许创建,更改,删除和检查服务器的版本令牌列表。如第5.6.6.3节“使用版本标记”所述,对参数进行解释*name_list和 解释token_list*(包括空白处理) ,该节提供了有关指定标记的语法的详细信息以及其他示例。
-
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*=*value*``NULLmysql> 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*=*value*``NULLmysql> SELECT version_tokens_set('tok1=value1;tok2=value2'); +-----------------------------------------------+ | version_tokens_set('tok1=value1;tok2=value2') | +-----------------------------------------------+ | 2 version tokens set. | +-----------------------------------------------+ -
以二进制字符串形式返回服务器的版本令牌列表,该二进制字符串包含用分号分隔的 对列表 。
*name*=*value*mysql> SELECT version_tokens_show(); +--------------------------+ | version_tokens_show() | +--------------------------+ | tok2=value2;tok1=value1; | +--------------------------+
以下UDF允许版本令牌被锁定和解锁:
-
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 | +-------------------------+
锁定功能具有以下特征:
- 成功的返回值非零。否则,将发生错误。
- 令牌名称是字符串。
- 与操纵服务器令牌列表的UDF的参数处理相反,令牌名称参数周围的空格不会被忽略,
=并且;允许使用字符。 - 可以锁定不存在的令牌名称。这不会创建令牌。
- 超时值是非负整数,表示错误超时之前等待获取锁的时间(以秒为单位)。如果超时为0,则没有等待,如果无法立即获取锁,该函数将产生错误。
- 版本令牌锁定功能基于第5.6.8.1节“锁定服务”中描述的锁定服务。
版本令牌系统变量
版本令牌支持以下系统变量。除非安装了Version Tokens插件,否则这些变量不可用(请参见第5.6.6.2节“安装或卸载Version Token”)。
系统变量:
-
命令行格式 --version-tokens-session=value系统变量 version_tokens_session范围 全局 动态 是 SET_VAR提示适用没有 类型 串 默认值 NULL此变量的会话值指定客户端版本令牌列表,并指示客户端会话要求服务器版本令牌列表具有的令牌。
如果
version_tokens_session变量是NULL(默认值)或具有空值,则任何服务器版本令牌列表都匹配。(实际上,空值将禁用匹配要求。)如果
version_tokens_session变量具有非空值,则其值与服务器版本令牌列表之间的任何不匹配都会导致会话发送到服务器的任何语句出错。在以下情况下会发生不匹配:- 该
version_tokens_session值中的令牌名称 不在服务器令牌列表中。在这种情况下,将ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND发生错误。 - 值中的令牌值
version_tokens_session与服务器令牌列表中相应令牌的 值不同。在这种情况下,将ER_VTOKEN_PLUGIN_TOKEN_MISMATCH发生错误。
服务器版本令牌列表包括未在
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此变量仅供内部使用。




