以下讨论作为对这些版本令牌元素的参考
版本令牌插件库包含几个函数。一组函数允许操作和检查服务器的版本令牌列表。另一组函数允许锁定和解锁版本令牌。 VERSION_TOKEN_ADMIN
权限(或已弃用的 SUPER
权限)是调用任何版本令牌函数所必需的。
以下函数允许创建、更改、删除和检查服务器的版本令牌列表。 name_list
和 token_list
参数的解释(包括空格处理)与 Section 7.6.6.3, “Using Version Tokens” 中描述的一致,该部分提供了有关指定令牌的语法以及其他示例的详细信息。
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
此变量用于内部使用。