登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  MySQL

MySQL Version Tokens 的会话令牌与服务器令牌有什么区别

来源:17golang原创

时间:2026-10-31 04:59:39 306浏览 收藏

MySQL Version Tokens中,服务器令牌列表描述管理端为这台服务器登记的状态;会话令牌列表描述当前客户端要求服务器具备的状态。设置会话令牌不会改变服务器列表,修改服务器列表也不会自动重写客户端的期望值。

官方文档地址:https://dev.mysql.com/doc/refman/8.4/en/version-tokens-reference.html。本文限定MySQL 8.4,讨论已安装Version Tokens插件及相关函数后的行为,不把它当成默认启用的数据库功能。

把两份令牌看成状态与期望

设想业务连接缓存了一个节点的路由信息,管理端随后调整节点职责。连接仍然活着,并不意味着它缓存的路由假设仍成立。Version Tokens提供一种让客户端声明假设、服务器参与比较的机制。

比较项服务器令牌列表会话令牌列表
表达什么管理端登记的节点状态当前客户端的匹配要求
典型维护入口version_tokens_set/edit/deleteSET @@SESSION.version_tokens_session
查看入口version_tokens_show()当前会话系统变量
影响对象连接到此服务器的匹配判断此连接后续语句的匹配条件

两边使用相同的名字和值,但职责不同。业务客户端声明“我需要这项状态”,不等于管理端宣布“这台节点现在拥有这项状态”。命名应由应用统一约定,令牌并不会自行识别你的数据库拓扑。

管理端服务器状态与业务会话期望的静态关系
原创结构图:管理边界维护服务器列表,客户端边界维护会话列表,两者共同约束匹配判断。没有节点切换时序或实际运行数据。

用包含匹配检查路由假设

匹配要求是:会话声明的每个名字在服务器列表里都存在,而且对应值一致。服务器多出其他令牌不构成冲突。因此这不是把两段字符串做全量相等比较。

服务器状态示意会话期望示意含义
zone=west;route_rev=r23zone=west会话要求被满足
zone=west;route_rev=r23route_rev=r22同名值不同,不匹配
zone=westroute_rev=r23所需名字不存在

空值或NULL会话要求不限制服务器令牌匹配,不能把它当成更严格的状态。不匹配会使后续语句报错。应用应把这个错误视为路由信息可能过期的信号,再依据管理信息处理,而不是在原连接上盲目重试同一条语句。

分别在管理连接和业务连接设置

以下仅用于已启用插件的独立测试实例。管理操作会改变该实例的令牌状态;不要拿示例覆盖生产令牌。调用Version Tokens函数需要VERSION_TOKEN_ADMIN权限,或官方已标记弃用的SUPER权限,应用应按职责分开管理账号与业务账号。

-- 管理连接:set替换整个服务器令牌列表,仅用于隔离演示实例。
SELECT version_tokens_set('zone=west;route_rev=r23');

-- 管理连接:查看登记状态,不代表检查数据库数据内容。
SELECT version_tokens_show();
-- 业务连接:声明当前连接的要求,不改服务器列表。
SET @@SESSION.version_tokens_session = 'zone=west';

-- 按前述示例状态,此语句的令牌匹配应满足;本文未执行SQL。
SELECT 42 AS demo_value;

管理端如果只想调整某些名字,应理解edit与set的区别:set替换列表,edit增加或修改指定项而保留其他项。演示没有直接引入真实业务表,目的是把“谁改哪份状态”讲清楚,不提供主从切换脚本或真实故障回放。

服务器列表修改接口与会话声明接口的职责边界
原创静态接口关系图:set与edit关联服务器列表,SESSION变量关联会话要求,匹配条件连接两份状态。连线仅表达依赖关系。

令牌匹配不能替代权限和复制一致性

一个典型反例是把令牌值命名为read,然后认为数据库自然禁止该连接写入。Version Tokens不会依据这个词分析SQL的读写性质;业务程序仍要遵守自己声明的用途,数据库权限、只读配置等也有各自职责。

另一个反例是把route_rev匹配当成“复制已经追平”。令牌的字符串相同,并不能单独证明数据版本、事务提交位置或复制延迟符合要求。管理端应在真正完成职责变化后按自己的协议维护状态,不能靠先改一个标签来代替实际条件。

这种模式适合已有管理面、明确路由约定且客户端能够处理不匹配错误的系统。如果客户端从不声明会话要求,或者遇错只无限重试,就没有形成完整的协作机制。它提供的是假设检查的接口,不是自动高可用系统。

连接池交付时保留会话约定

连接池复用的是物理连接,会话要求也需要纳入借出、归还和重连策略。工程上应明确每类请求需要什么令牌,由连接初始化或借用逻辑建立约定;配置失败的连接不应悄悄继续承接业务。不能只在某个请求开头设置一次,就假定以后所有调用者的要求都一致。

切换节点涉及在途事务、语句能否安全重放和幂等性,不能仅凭令牌错误一律重放写操作。处理方案应区分语句执行前的匹配失败与连接中断造成的执行结果不确定;本文不把两者混成同一种重试条件。

SET GLOBAL version_tokens_session是在改服务器令牌吗?

不是。这个变量虽有Global与Session作用域,也不能等同于通过version_tokens_set维护的服务器令牌列表。比较这两类状态时,应始终明确具体接口。

服务器增加一个会话未声明的令牌会失败吗?

不会仅因为这个额外令牌而不匹配。会话要求的是自己声明的那些名字与值,不能据此要求服务器列表只能包含它们。

两边令牌一样就说明客户端有访问权限吗?

不能。匹配只满足Version Tokens这一层条件,用户授权及其他数据库限制仍然独立存在。

依据:MySQL 8.4 Version Tokens参考、Version Tokens使用说明。连接池和重试部分为基于会话状态的工程建议,示例未在本机数据库执行。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>