全部產品
Search
文件中心

PolarDB:HINT文法使用說明

更新時間:Dec 27, 2024

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