本文介绍如何在读写模式为可读可写(自动读写分离)的集群地址中使用HINT语法。
使用限制
仅读写模式为可读可写(自动读写分离)的集群地址支持HINT语法,只读模式下的集群地址和主地址均不支持HINT语法。关于集群地址的读写模式信息,请参见集群地址的读写模式。
注意事项
HINT的路由优化级别最高,不受一致性级别和事务拆分的约束,使用前请进行评估。
使用方法
- 支持在SQL语句前加上 - /*FORCE_MASTER*/或- /*FORCE_SLAVE*/强制指定这条SQL的路由方向。- 例如 - select * from test默认会路由到只读节点,改为- /*FORCE_MASTER*/ select * from test就会路由到主节点。需要注意的是,- /*FORCE_MASTER*/只能在可读可写的地址上生效,对于只读地址即使使用/- /*FORCE_MASTER*/也不会路由到主节点。
- 支持在SQL语句前加上 - /*force_node='<节点ID>'*/强制指定在某节点执行某查询命令。- 例如 - /*force_node='pi-bpxxxxxxxx'*/ show processlist,该- show processlist命令只在- pi-bpxxxxxxxx节点执行。如果该节点发生故障,则返回报错- force HINT server node is not found, please check.。
- 支持在SQL语句前加上 - /*force_proxy_internal*/set force_node = '<节点ID>'强制指定在某节点执行所有查询命令。- 例如 - /*force_proxy_internal*/set force_node = 'pi-bpxxxxxxxx',执行该命令后,后续所有查询命令只发往- pi-bpxxxxxxxx节点,如果该节点发生故障,则返回报错- set force node 'rr-bpxxxxx' is not found, please check.。
- 支持在SQL语句前加上 /*force_all*/ 强制将语句广播到所有的节点,返回结果分两种场景: 说明- 该场景适用的PolarDB数据库代理(PolarProxy)版本需为2.8.36版本及以上,如何查看和升级当前数据库代理版本,请参见版本管理。 - 对于一些系统库表(information_schema.processlist,information_schema.innodb_trx,performance_schema.threads,performance_schema.metadata_locks,sys.schema_table_lock_waits)的访问会返回所有节点的合并结果。 - 例如/*force_all*/select * from information_schema.processlist,广播到所有的节点并返回所有节点合并后的结果。另外,如果该语句前没有/*force_all*/ hint,即select * from information_schema.processlist,将随机路由。 
- 其它库表或场景的访问只返回主库的结果。 
 
- 当开启列存和行存自动引流功能时,支持通过增加HINT语法 - /*FORCE_IMCI_NODES*/将请求强制路由到列存节点上执行。行列自动引流详情请参见配置行列自动分流。说明- 上述HINT语法不区分大小写,但在使用时必须将HINT语法放在SQL语句的句首。 
- 若您需要通过MySQL官方命令行执行上述HINT语句,请在命令行中加上-c参数,否则该HINT会被MySQL官方命令行过滤导致HINT失效,具体请参见MySQL官方命令行。 
- 通常不建议使用 - /*force_proxy_internal*/语法,会导致后续所有查询请求都发往该节点,读写分离失效。
- HINT语句里不要有改变环境变量的语句,例如 - /*FORCE_SLAVE*/ set names utf8;等,这类语句可能导致后续的业务出错。