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/delete | SET @@SESSION.version_tokens_session |
| 查看入口 | version_tokens_show() | 当前会话系统变量 |
| 影响对象 | 连接到此服务器的匹配判断 | 此连接后续语句的匹配条件 |
两边使用相同的名字和值,但职责不同。业务客户端声明“我需要这项状态”,不等于管理端宣布“这台节点现在拥有这项状态”。命名应由应用统一约定,令牌并不会自行识别你的数据库拓扑。

用包含匹配检查路由假设
匹配要求是:会话声明的每个名字在服务器列表里都存在,而且对应值一致。服务器多出其他令牌不构成冲突。因此这不是把两段字符串做全量相等比较。
| 服务器状态示意 | 会话期望示意 | 含义 |
|---|---|---|
| zone=west;route_rev=r23 | zone=west | 会话要求被满足 |
| zone=west;route_rev=r23 | route_rev=r22 | 同名值不同,不匹配 |
| zone=west | route_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增加或修改指定项而保留其他项。演示没有直接引入真实业务表,目的是把“谁改哪份状态”讲清楚,不提供主从切换脚本或真实故障回放。

令牌匹配不能替代权限和复制一致性
一个典型反例是把令牌值命名为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使用说明。连接池和重试部分为基于会话状态的工程建议,示例未在本机数据库执行。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
324 收藏
-
155 收藏
-
429 收藏
-
120 收藏
-
250 收藏
-
415 收藏
-
481 收藏
-
363 收藏
-
122 收藏
-
131 收藏
-
178 收藏
-
303 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习