SQL ヒントを使用すると、読み書き分離(自動読み書き分離)モードで設定されたクラスターエンドポイントのデフォルトのルーティング判断をオーバーライドできます。ヒントは最も高いルーティング優先度を持ち、整合性レベルおよびトランザクション分割の両方をバイパスします。本番環境で使用する前に、その影響を十分に評価してください。
使用制限
ヒントは、読み取り/書き込みモードが [読み取り/書き込み (自動読み取り/書き込み分割)] に設定されているクラスターエンドポイントでのみ機能します。読み取り専用に設定されたクラスターエンドポイントまたはプライマリエンドポイントではサポートされていません。
エンドポイントの読み書きモードの詳細については、「エンドポイント」の「クラスターエンドポイントの読み書きモード」セクションをご参照ください。
利用可能なヒント
| ヒント | ルーティング先 | 主な用途 |
|---|---|---|
/*FORCE_MASTER*/ | プライマリノード | 読み取り操作を強制的にプライマリノードで実行する |
/*FORCE_SLAVE*/ | 読み取り専用ノード | 読み書き分離対応エンドポイント上で、ステートメントを明示的に読み取り専用ノードに送信する |
/*force_node='<Node ID>'*/ | 特定のノード(単一ステートメント) | 特定のノードのデバッグまたは検査 |
/*force_proxy_internal*/set force_node = '<Node ID>' | 特定のノード(以降のすべてのステートメント) | セッションを特定のノードに固定する — 注意して使用してください |
/*force_all*/ | すべてのノード | クラスター全体にわたってシステムテーブルをクエリする |
/*FORCE_IMCI_NODES*/ | 列ストアノード | 分析クエリをインメモリ列指向インデックス(IMCI)列ストアノードで強制的に実行する |
ヒントは大文字・小文字を区別せず、SQL ステートメントの前に配置する必要があります。
MySQL コマンドラインクライアントからヒントを実行する場合は、-c(または--comments)フラグを指定してください。このフラグを指定しないと、クライアントがサーバーにクエリを送信する前にヒントを削除してしまいます。詳細については、「MySQL クライアントのオプション」をご参照ください。
使用方法
/*FORCE_MASTER*/ — プライマリノードへのルーティング
任意の SQL ステートメントの前にこのヒントを追加すると、デフォルトのルーティングロジックに関係なく、そのステートメントをプライマリノードに送信できます。
/*FORCE_MASTER*/ SELECT * FROM test;ヒントを指定しない場合、SELECT * FROM test は読み取り専用ノードにルーティングされます。ヒントを指定すると、プライマリノードで実行されます。
このヒントは、読み取り専用 モードに設定されたエンドポイントには効果がありません — ステートメントはプライマリノードにリダイレクトされません。
/*FORCE_SLAVE*/ — 読み取り専用ノードへのルーティング
このヒントを追加することで、ステートメントを明示的に読み取り専用ノードに送信できます。
/*FORCE_SLAVE*/ SELECT * FROM orders WHERE status = 'shipped';ヒントとセッション変数を変更するステートメントを組み合わせないでください。たとえば、/*FORCE_SLAVE*/ SET NAMES utf8; を実行するとエラーが発生する場合があります。
/*force_node='<Node ID>'*/ — 特定ノードへのルーティング(単一ステートメント)
このヒントを追加すると、指定したノード上で単一の SQL ステートメントを実行できます。
/*force_node='pi-bpxxxxxxxx'*/ SHOW PROCESSLIST;指定したノードが利用不可の場合、以下のエラーが返されます:
force hint server node is not found, please check./*force_proxy_internal*/set force_node — セッションを特定ノードに固定
このステートメントを実行すると、そのセッション内の以降のすべての SQL ステートメントが特定のノードにルーティングされます。
/*force_proxy_internal*/set force_node = 'pi-bpxxxxxxxx';ノードが障害を起こした場合、以下のエラーが返されます:
set force node 'rr-bpxxxxx' is not found, please check./*force_proxy_internal*/ は、セッションを固定する必要がある特定の理由がない限り使用しないでください。このヒントを使用すると、接続内の以降のすべてのステートメントについて読み書き分離が無効になります。
/*force_all*/ — すべてのノードへのブロードキャスト
このヒントを追加すると、クラスター内のすべてのノードにステートメントをブロードキャストできます。
/*force_all*/ SELECT * FROM information_schema.processlist;/*force_all*/ を使用するには、PolarProxy のバージョン 2.8.36 以降が必要です。PolarProxy のバージョンを確認および更新するには、「マイナーバージョンの更新」をご参照ください。返される結果はクエリの種類によって異なります:
システムテーブル(
information_schema.processlist、information_schema.innodb_trx、performance_schema.threads、performance_schema.metadata_locks、sys.schema_table_lock_waits):PolarProxy がステートメントをすべてのノードにブロードキャストし、マージされた結果を返します。その他のすべてのテーブルおよびシナリオ:プライマリデータベースの結果のみが返されます。
ヒントを指定しない場合、SELECT * FROM information_schema.processlist はランダムなノードにルーティングされます。
/*FORCE_IMCI_NODES*/ — 列ストアノードへのルーティング
ローストアと列ストアノード間のリクエストの自動分散を有効化している場合、このヒントを追加することで、クエリを IMCI(インメモリ列指向インデックス)列ストアノードで強制的に実行できます。
/*FORCE_IMCI_NODES*/ SELECT * FROM large_analytics_table;設定方法の詳細については、「ローストアおよび列ストアノード間のリクエストの自動分散」をご参照ください。