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