文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  版本令牌参考

7.6.6.4 版本令牌参考

以下讨论作为对这些版本令牌元素的参考

版本令牌函数

版本令牌插件库包含几个函数。一组函数允许操作和检查服务器的版本令牌列表。另一组函数允许锁定和解锁版本令牌。 VERSION_TOKEN_ADMIN 权限(或已弃用的 SUPER 权限)是调用任何版本令牌函数所必需的。

以下函数允许创建、更改、删除和检查服务器的版本令牌列表。 name_listtoken_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_listname=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_listname=value 对的用分号分隔的列表,指定要定义的每个令牌的名称及其值。如果参数为 NULL 或不包含任何令牌的字符串,则令牌列表将被清除。

    mysql> SELECT version_tokens_set('tok1=value1;tok2=value2');
    +-----------------------------------------------+
    | version_tokens_set('tok1=value1;tok2=value2') |
    +-----------------------------------------------+
    | 2 version tokens set.                         |
    +-----------------------------------------------+
  • version_tokens_show()

    将服务器的版本令牌列表作为包含用分号分隔的 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_unlock()

    释放当前会话中使用 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

    命令行格式 --version-tokens-session=value
    系统变量 version_tokens_session
    范围 全局,会话
    动态
    SET_VAR 提示适用
    类型 字符串
    默认值 NULL

    此变量的会话值指定客户端版本标记列表,并指示客户端会话需要服务器版本标记列表具有的标记。

    如果 version_tokens_session 变量为 NULL(默认值)或为空值,则任何服务器版本标记列表都匹配。(实际上,空值会禁用匹配要求。)

    如果 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 成功是因为客户端标记 tok1tok2 存在于服务器标记列表中,并且每个标记在服务器列表中具有相同的值。第二个 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=#
    系统变量 version_tokens_session_number
    范围 全局,会话
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0

    此变量用于内部使用。