Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Version Tokens Reference

7.6.6.4 版本令牌参考

以下讨论作为版本令牌元素的参考:

版本令牌函数

版本令牌插件库包括多个函数。有一组函数允许服务器的版本令牌列表被操作和检查。另一组函数允许版本令牌被锁定和解锁。需要 invoke VERSION_TOKEN_ADMIN 权限(或弃用的 SUPER 权限)才能调用任何版本令牌函数。

以下函数允许服务器的版本令牌列表被创建、更改、删除和检查。解释 name_listtoken_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.                         |
    +-----------------------------------------------+
  • 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

    Command-Line Format --version-tokens-session=value
    System Variable version_tokens_session
    Scope 全局、会话
    Dynamic
    SET_VAR Hint Applies
    Type 字符串
    Default Value 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值进行比较,并在出现冲突时产生错误:

    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

    Command-Line Format --version-tokens-session-number=#
    System Variable version_tokens_session_number
    Scope 全局、会话
    Dynamic
    SET_VAR Hint Applies
    Type 整数
    Default Value 0

    这个变量用于内部使用。