本文介绍如何通过 Hint 语法使指定节点执行 SQL 请求。
使用 Hint 语法可以强制 SQL 请求在指定的节点上执行。Hint 的路由优先级最高,不受一致性、事务的约束,但 Hint 功能依赖 Proxy 链路,需要开启读写分离,并对所有连接生效,请在使用前合理评估是否可以用于业务。
指定到主节点执行。
/* FORCE_MASTER */
指定到只读节点执行。
/* FORCE_SLAVE */
指定某个具体节点执行。在目标实例的连接管理菜单下获取节点 ID。
/* FORCE_NODE='<id>' */
说明
指定节点不存在 / 该节点暂时不可用时,使用 Hint 强制路由将报错 specific node[<id>] not found
。
支持以下类型的单 SQL 语句:
说明
/* FORCE_master */ show databases;
)。在读写分离指定各节点权重前提下使用 Hint,将会按照以下策略进行转发:
指定到主节点执行(/* FORCE_MASTER */
)
可在主节点权重为 0 的情况下,将 SQL 语句强制路由至主节点。
指定到只读节点执行(/* FORCE_SLAVE */
)
首先尝试在只读节点间按权重做转发,若只读节点权重均为 0,语句将被路由至主节点。
指定某个具体节点执行(/* FORCE_NODE='<id>' */
)
可在特定节点权重为 0 的情况下,将语句强制路由至该节点。
在 MySQL 客户端中通过命令行进行连接并使用 Hint 语句时,需在命令中增加 -c
选项,否则 Hint 会被 MySQL 命令行工具过滤
Hint 注释限制在 SQL 语句起始部分,如 /* FORCE_MASTER */ show databases;
;语句内注释不解析,如 show /* FORCE_MASTER */ databases;
。
不支持在一条 SQL 语句中加入多条 Hint,如 /* FORCE_MASTER FORCE_SLAVE */
。
暂不支持通过 Hint 转发 PREPARE
语句或多语句,如 show databases;
或 use test;
。