Documentation Home

5.6.6.4 版本令牌参考

以下讨论可作为对这些 Version Tokens 元素的参考:

版本令牌函数

Version Tokens 插件库包括几个函数。一组函数允许操作和检查服务器的版本标记列表。另一组函数允许锁定和解锁版本令牌。调用任何 Version Tokens 函数都需要 VERSION_TOKEN_ADMIN 特权(或已弃用的 特权)。SUPER

以下函数允许创建、更改、删​​除和检查服务器的版本令牌列表。name_list和 参数的解释token_list(包括空格处理)如 第 5.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.                         |
    +-----------------------------------------------+
  • 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,则没有等待,并且如果无法立即获取锁,该函数将产生错误。

  • 版本令牌锁定功能基于第 5.6.9.1 节“锁定服务”中描述的锁定服务。

版本标记系统变量

Version Tokens 支持以下系统变量。除非安装了 Version Tokens 插件,否则这些变量不可用(请参阅第 5.6.6.2 节,“安装或卸载 Version Tokens”)。

系统变量:

  • 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

    此变量供内部使用。