以下讨论是对这些版本标记元素的参考
版本标记插件库包含多个函数。一组函数允许操作和检查服务器的版本标记列表。另一组函数允许锁定和解锁版本标记。需要 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
=value
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
是
对的分号分隔列表,指定要定义的每个标记的名称及其值。如果参数为name
=value
NULL
或不包含任何标记的字符串,则清除标记列表。mysql> 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; | +--------------------------+
以下函数允许锁定和解锁版本标记
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 节“锁定服务” 中描述的锁定服务。
版本令牌支持以下系统变量。除非安装了版本令牌插件(请参阅 第 7.6.6.2 节“安装或卸载版本令牌”),否则这些变量不可用。
系统变量
-
命令行格式 --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
此变量供内部使用。