スロークエリのトリガールールを設定する
このドキュメントでは、tidb_slow_log_rules システム変数を使用して、スロークエリログ のトリガールールを定義する方法について説明します。
tidb_slow_log_rules は、多次元メトリクスの組み合わせをサポートします。これは、スロークエリログの「対象を絞ったサンプリング」や「問題の再現」に適しており、特定のメトリクスの組み合わせに基づいて対象のステートメントをフィルタリングできます。
TiDB Self-Managed では、スロークエリログのトリガー動作は tidb_slow_log_rules の設定に依存します。
- 現在のセッションに適用可能な
tidb_slow_log_rulesルールがない場合(この変数が設定されていない、または設定済みのルールのいずれもセッションに適用されない場合)、スロークエリのログ出力は引き続きtidb_slow_log_threshold(ミリ秒)に依存します。 - 現在のセッションに適用可能な
tidb_slow_log_rulesルールが1つでもある場合、スロークエリのログ出力はルールのマッチ結果によって決まり、tidb_slow_log_thresholdは無視されます。
例
標準形式(
SESSIONスコープ):SET SESSION tidb_slow_log_rules = 'Query_time: 0.5, Is_internal: false';無効な
SESSIONルール(SESSIONスコープはConn_IDをサポートしません):SET SESSION tidb_slow_log_rules = 'Conn_ID: 12, Query_time: 0.5, Is_internal: false';
グローバルルール(すべての接続に適用):
SET GLOBAL tidb_slow_log_rules = 'Query_time: 0.5, Is_internal: false';特定の接続向けのグローバルルール(2 つの接続
Conn_ID:11とConn_ID:12にそれぞれ別々に適用):SET GLOBAL tidb_slow_log_rules = 'Conn_ID: 11, Query_time: 0.5, Is_internal: false; Conn_ID: 12, Query_time: 0.6, Process_time: 0.3, DB: db1';
統一されたルール構文と型制約
- ルール数の上限と区切り: サポートされる各スコープには最大 10 個のルールを含めることができます。ルールは
;で区切ります。 - 条件形式: 各条件は
field_name:value形式を使用します。1 つのルール内の複数条件は,で区切ります。 - フィールド名は大文字と小文字を区別しません。フィールド名内のアンダースコアやその他の文字はそのまま保持されます。
TiDB Self-Managed は、tidb_slow_log_rules に対して SESSION ルールと GLOBAL ルールの両方をサポートします。1 つのセッションでは、2 つのスコープをまたいで最大 20 個の有効なルールを持つことができます。SESSION ルールは Conn_ID をサポートせず、このフィールドをサポートするのは GLOBAL ルールのみです。
- マッチングの意味:
Conn_IDを除く数値フィールドは>=でマッチします。Conn_ID、文字列フィールド、ブールフィールドは等価比較(=)でマッチします。DBとResource_groupのマッチングでは大文字と小文字を区別しません。>、<、!=などの明示的な演算子はサポートされません。
型制約は次のとおりです。
- 数値型(
int64、uint64、float64)では、値は0以上である必要があります。負の値はパースエラーになります。int64: 最大値は2^63-1です。uint64: 最大値は2^64-1です。float64: 値は有限かつ非負である必要があります。最大値はおよそ1.79e308です。NaNやInf、-Infなどの無限値は無効であり、エラーになります。
bool:true/false、1/0、t/fをサポートします(大文字と小文字は区別しません)。string: 現時点では、引用符(シングルまたはダブル)で囲んだ場合でも、区切り文字,(条件区切り)または;(ルール区切り)を含む文字列はサポートされません。エスケープはサポートされません。- 重複フィールド: 同じフィールドが 1 つのルール内で複数回指定された場合、最後に出現したものが有効になります。
サポートされるフィールド
以下の表のフィールドは、特に明記がない限り、統一されたルール構文と型制約 で説明した一般的なマッチングルールと型ルールに従います。
有効時の動作とマッチ順序
tidb_slow_log_rulesを設定すると、新しいルールが追加されるのではなく、指定したスコープ内の既存ルールが上書きされます。tidb_slow_log_rulesに空文字列を設定すると、指定したスコープ内のルールがクリアされます。- 複数ルールは
ORで結合され、1 つのルール内の複数フィールド条件はANDで結合されます。 - SQL 実行時間を引き続きスロークエリログ出力の条件として使用したい場合は、ルール内で
Query_timeを使用し、単位が秒であることに注意してください。
TiDB Self-Managed は、tidb_slow_log_rules に対して SESSION ルールと GLOBAL ルールの両方をサポートします。
- 現在のセッションに、
SESSIONルール、現在のConn_IDに対するGLOBALルール、またはConn_IDを持たない汎用GLOBALルールなど、適用可能なルールが 1 つでもある場合、スロークエリログの出力はルールのマッチ結果によって決まり、tidb_slow_log_thresholdは無視されます。 - 現在のセッションに適用可能なルールがない場合、たとえば
SESSIONルールとGLOBALルールの両方が空である場合や、現在のConn_IDに一致しないGLOBALルールのみが設定されている場合、スロークエリのログ出力は引き続きtidb_slow_log_thresholdに依存します。tidb_slow_log_thresholdの単位はミリ秒です。 - TiDB はまず
SESSIONルールをマッチします。どれも一致しない場合、TiDB は次に現在のConn_IDに対するGLOBALルールをマッチし、その後Conn_IDを持たない汎用GLOBALルールをマッチします。 SHOW VARIABLES LIKE 'tidb_slow_log_rules'とSELECT @@SESSION.tidb_slow_log_rulesはSESSIONルールのテキストを返します。未設定の場合は空文字列を返します。SELECT @@GLOBAL.tidb_slow_log_rulesはGLOBALルールのテキストを返します。
推奨事項
tidb_slow_log_rulesは、単一しきい値方式を置き換えるために設計されています。多次元メトリクス条件の組み合わせをサポートし、スロークエリログ出力をより柔軟かつきめ細かく制御できます。1 台の TiDB ノード(16 CPU コア、48 GiB メモリ)と 3 台の TiKV ノード(各 16 CPU コア、48 GiB メモリ)を備えた十分なリソースのあるテスト環境において、sysbench テストを繰り返した結果、多次元のスロークエリログルールによって 30 分以内に数百万件のスローログエントリが生成される場合でも、パフォーマンスへの影響は小さいことが示されています。ただし、ログ量が数千万件に達すると、TPS は大幅に低下し、レイテンシーも顕著に増加します。したがって、業務ワークロードが高い場合や CPU とメモリリソースが限界に近い場合は、過度に広いルールによるログの氾濫を避けるため、
tidb_slow_log_rulesを慎重に設定してください。 ログ出力レートを制限する必要がある場合は、tidb_slow_log_max_per_secを使用してスロットリングし、業務パフォーマンスへの影響を軽減してください。