本文介紹如何在讀寫模式為可讀可寫(自動讀寫分離)的集群地址中使用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;
等,這類語句可能導致后續的業務出錯。