mcpField
T
triaging-live-sql-activity

triaging-live-sql-activity

github.com/cockroachlabsデータ・データベース23124 回インストール14 週間前に更新
リポジトリ

triaging-live-sql-activity について

CockroachDB の運用担当者向けに、実行中のクエリ、セッション、トランザクションを SQL で調べるスキルです。アプリケーション、ユーザー、クライアント別に負荷を特定でき、権限があれば問題のある処理をキャンセルできます。

主な機能

  1. 01長時間実行中のクエリ特定
  2. 02アクティブなセッションとトランザクションの確認
  3. 03アプリケーション・ユーザー・クライアント別の絞り込み
  4. 04リトライ回数による競合の把握
  5. 05クエリまたはセッションの任意キャンセル

活用シーン

  1. 01現在のクラスタ遅延の調査
  2. 02リソース消費元となるクエリの特定
  3. 03トランザクションのリトライと競合の診断
  4. 04問題を確認したクエリのキャンセル

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/cockroachlabs/cockroachdb-skills --skill triaging-live-sql-activity

インストール後、Claude Code で/triaging-live-sql-activityを入力して読み込まれたか確認します。

同梱ファイルreferences/permissions.mdreferences/sql-queries.md

詳細

ライブ SQL アクティビティのトリアージ

現在実行中の長時間クエリ、負荷の高いセッション、アクティブなトランザクションを特定し、クラスターのパフォーマンス問題を診断します。SQL のみのインターフェース(SHOW ステートメントと crdb_internal ビュー)を使用するため、DB Console、HTTP エンドポイント、Prometheus へのアクセスがなくても、すぐにトリアージできます。

このスキルを使用する状況

  • ユーザーから「今、クラスターの動作が遅い」と報告された場合
  • クラスターノードの CPU またはメモリ使用率が高い場合
  • 暴走クエリや停止したトランザクションを特定する必要がある場合
  • どのアプリケーションやユーザーがリソースを消費しているか確認したい場合
  • DB Console にアクセスせず、すぐにトリアージする必要がある場合
  • 問題のあるセッションやクエリをキャンセルする SQL を生成する必要がある場合

過去のパフォーマンス分析の場合: profiling-statement-fingerprints を使用して、時間経過に伴うクエリパターンを分析し、遅いフィンガープリントを特定し、ライブクエリを必要とせずに傾向を調査します。 トランザクションレベルの分析の場合: profiling-transaction-fingerprints を使用して、過去のトランザクション再試行パターン、コミットレイテンシーの傾向、ステートメント構成を分析します。 バックグラウンドジョブの監視の場合: monitoring-background-jobs を使用して、SHOW CLUSTER STATEMENTS に表示されないスキーマ変更、バックアップ、自動ジョブを監視します。

前提条件

必要な SQL アクセス:

  • 任意の CockroachDB ノードへの接続
  • クラスター全体を表示するには、VIEWACTIVITY または VIEWACTIVITYREDACTED 権限が必要です
    • VIEWACTIVITYREDACTED:ほかのユーザーのクエリ内の定数をマスキングします(プライバシー保護のため推奨)
    • VIEWACTIVITY:すべてのユーザーのクエリ全文を表示します
    • これらの権限がない場合:自分のセッションとクエリのみ表示されます
  • SQL クエリ実行に関する基本的な理解
  • (任意)キャンセル操作には CANCELQUERY / CANCELSESSION 権限が必要です

権限を確認するには:

SHOW SYSTEM GRANTS FOR <username>;

RBAC の詳しい設定については、権限のリファレンスを参照してください。

基本的な診断アプローチ

CockroachDB には、ライブアクティビティのトリアージに使用できる SQL のみのインターフェースが用意されています。

インターフェース用途クラスター全体を対象とするか
SHOW CLUSTER STATEMENTS現在実行中のクエリはい(VIEWACTIVITY がある場合)
SHOW CLUSTER SESSIONSアクティブなクライアントセッションはい(VIEWACTIVITY がある場合)
crdb_internal.cluster_transactions進行中のトランザクションはい(VIEWACTIVITY がある場合)

トリアージのワークフロー:

  1. 長時間実行中のクエリを特定します(5~10 分超)。
  2. セッションおよびアプリケーションと関連付けます。
  3. トランザクションの再試行回数を確認します(再試行回数が多い場合は競合を示します)。
  4. アプリ、ユーザー、クライアントごとに詳細を調べます。
  5. (任意)暴走している処理をキャンセルします。

安全性: すべての診断クエリは読み取り専用です。キャンセルは、明示的な警告を確認したうえで任意に実行できます。

基本的な診断クエリ

長時間実行中のクエリ

指定したしきい値を超えて実行されているクエリを特定します。

-- Queries running longer than 5 minutes
WITH q AS (SHOW CLUSTER STATEMENTS)
SELECT
  query_id,
  node_id,
  session_id,
  user_name,
  client_address,
  application_name,
  start,
  now() - start AS running_for,
  substring(query, 1, 200) AS query_preview,
  distributed,
  phase
FROM q
WHERE start < now() - INTERVAL '5 minutes'
ORDER BY start
LIMIT 50;

主な列:

  • running_for:クエリの実行時間
  • query_preview:先頭 200 文字(非常に長いクエリへの対策)
  • phase:実行フェーズ(準備中、実行中など)
  • distributed:クエリが複数のノードにまたがっているかどうか

しきい値のカスタマイズ:

  • INTERVAL '5 minutes' を '10 minutes'、'30 seconds' などに変更します。
  • クラスターの規模と想定負荷に応じて LIMIT を調整します。
アクティブなセッション

長時間実行中のアクティブなクエリがあるセッションを確認します。

-- Sessions with active queries running > 5 minutes
WITH s AS (SHOW CLUSTER SESSIONS)
SELECT
  node_id,
  session_id,
  user_name,
  client_address,
  application_name,
  status,
  active_query_start,
  now() - active_query_start AS active_query_for,
  substring(active_queries, 1, 200) AS active_queries_preview,
  substring(last_active_query, 1, 200) AS last_query_preview
FROM s
WHERE active_query_start IS NOT NULL
  AND active_query_start < now() - INTERVAL '5 minutes'
ORDER BY active_query_start
LIMIT 50;

主な列:

  • active_query_for:現在のアクティブなクエリの実行時間
  • application_name:詳細調査に使用する接続元のアプリケーション
  • client_address:トラブルシューティングに使用するクライアントの IP アドレスまたはホスト名
  • status:セッションの状態(アイドル、アクティブなど)
アクティブなトランザクション

長時間実行されているトランザクション(ブロッカーとなる可能性があります)を特定します。

-- Transactions running > 5 minutes
SELECT
  id AS txn_id,
  node_id,
  session_id,
  application_name,
  start,
  now() - start AS running_for,
  num_stmts,
  num_retries,
  num_auto_retries,
  substring(txn_string, 1, 200) AS txn_string_preview
FROM crdb_internal.cluster_transactions
WHERE start < now() - INTERVAL '5 minutes'
ORDER BY start
LIMIT 50;

主な列:

  • num_retries / num_auto_retries:再試行回数が多い場合は、競合が発生している可能性があります
  • num_stmts:トランザクション内のステートメント数(多い場合は問題となる可能性があります)
  • txn_string:トランザクションのフィンガープリント

本番環境での安全性に関する注意: crdb_internal.cluster_transactions は本番環境での使用が承認されており、トリアージに安全に使用できます。

アプリケーション、ユーザー、またはクライアントで絞り込む

疑わしいアクティビティを特定したら、次のように絞り込んで詳しく調査します。

アプリケーションで絞り込む
-- All activity from specific application
WITH q AS (SHOW CLUSTER STATEMENTS)
SELECT query_id, user_name, start, now() - start AS running_for,
       substring(query, 1, 200) AS query_preview
FROM q
WHERE application_name = 'payments-api'
ORDER BY start;
ユーザーで絞り込む
-- All activity from specific user
WITH s AS (SHOW CLUSTER SESSIONS)
SELECT session_id, application_name, client_address,
       active_query_start, substring(active_queries, 1, 200) AS active_queries_preview
FROM s
WHERE user_name = 'app_user'
  AND active_query_start IS NOT NULL
ORDER BY active_query_start;
クライアントアドレスで絞り込む
-- All sessions from specific client IP
WITH s AS (SHOW CLUSTER SESSIONS)
SELECT session_id, user_name, application_name,
       status, substring(active_queries, 1, 200) AS active_queries_preview
FROM s
WHERE client_address LIKE '10.0.1.%'
ORDER BY active_query_start;
複合条件で絞り込む
-- Long queries from specific app and user
WITH q AS (SHOW CLUSTER STATEMENTS)
SELECT query_id, node_id, start, now() - start AS running_for,
       substring(query, 1, 200) AS query_preview
FROM q
WHERE application_name = 'payments-api'
  AND user_name = 'app_user'
  AND start < now() - INTERVAL '10 minutes'
ORDER BY start;

安全上の考慮事項

読み取り専用の操作: すべての診断クエリ(SHOW ステートメント、crdb_internal.cluster_transactions)は読み取り専用であり、本番環境で安全に実行できます。

キャンセル操作(任意):

注意:クエリやセッションをキャンセルすると、ユーザーの作業が終了します

次の条件を満たす場合にのみ実行してください。

  • クエリ/セッションが暴走している、または停止していることを確認している
  • ユーザーのワークロードを中断する権限がある
  • 必要に応じて関係者に通知している
  • CANCELQUERY または CANCELSESSION 権限を持っている

暴走した処理のキャンセル(任意)

特定のクエリをキャンセルする
-- 1. Identify the query_id from triage queries above
-- 2. Cancel it
CANCEL QUERY '<query_id>';

例:

CANCEL QUERY '15f9e0e91f072f0f0000000000000001';
セッション全体をキャンセルする
-- 1. Identify the session_id from triage queries above
-- 2. Cancel all queries in that session
CANCEL SESSION '<session_id>';

例:

CANCEL SESSION '15f9e0e91f072f0f';

確認: キャンセル後、トリアージクエリを再実行し、クエリ/セッションがなくなったことを確認します。

必要な権限:

  • クエリをキャンセルするには、CANCELQUERY システム権限が必要です
  • セッションをキャンセルするには、CANCELSESSION システム権限が必要です
  • 管理者ロールには、デフォルトで両方の権限があります

これらの権限を付与する方法については、権限リファレンスを参照してください。

よくあるトリアージのワークフロー

ワークフロー 1:「クラスターの動作が遅い」場合の調査

状況: ユーザーから全般的な動作の遅さが報告されています。

  1. 長時間実行されているクエリを確認します。

    -- Run the "Long-Running Queries" diagnostic
    -- Look for queries running > 5-10 minutes
    
  2. 発生元のアプリケーションを特定します。

    -- Group by application to find culprits
    WITH q AS (SHOW CLUSTER STATEMENTS)
    SELECT application_name, COUNT(*) AS num_queries,
           AVG(now() - start) AS avg_duration
    FROM q
    WHERE start < now() - INTERVAL '5 minutes'
    GROUP BY application_name
    ORDER BY num_queries DESC;
    
  3. 特定のアプリを詳しく調査します。

    -- Filter by top application from step 2
    -- Use "Filter by Application" query
    
  4. 対応を判断します。

    • アプリチームに連絡し、クエリのパターンを調査してもらいます
    • 重大な場合は、暴走している特定のクエリをキャンセルします
    • クエリに問題がない場合は、スキーマ/インデックスの問題を確認します
ワークフロー 2:再試行回数の多いトランザクションを特定する

状況: 競合の問題が疑われます。

  1. 再試行回数が多いトランザクションを確認します。

    SELECT application_name, AVG(num_retries) AS avg_retries,
           MAX(num_retries) AS max_retries, COUNT(*) AS num_txns
    FROM crdb_internal.cluster_transactions
    WHERE start < now() - INTERVAL '5 minutes'
    GROUP BY application_name
    HAVING AVG(num_retries) > 5
    ORDER BY avg_retries DESC;
    
  2. 特定のトランザクションを調査します。

    -- Find transactions with >10 retries
    SELECT id, application_name, num_retries, num_stmts,
           substring(txn_string, 1, 200) AS txn_preview
    FROM crdb_internal.cluster_transactions
    WHERE num_retries > 10
    ORDER BY num_retries DESC;
    
  3. 次の手順:

    • 競合がないか、トランザクションのパターンを確認します
    • ロックの競合やホットスポットを確認します
    • 競合を減らすためのスキーマ変更を検討します
ワークフロー 3:ユーザーごとにリソースを大量に消費している対象を特定する

状況: 特定のユーザーに負荷を割り当てる必要があります。

  1. ユーザーごとのアクティブなクエリ数を数えます。

    WITH q AS (SHOW CLUSTER STATEMENTS)
    SELECT user_name, COUNT(*) AS num_active_queries,
           AVG(now() - start) AS avg_duration
    FROM q
    GROUP BY user_name
    ORDER BY num_active_queries DESC;
    
  2. 特定のユーザーのアクティビティを詳しく調査します。

    -- Use "Filter by User" query
    
  3. 対応します。

    • 予期しない負荷の場合はユーザーに連絡します
    • ユーザーのクエリパターンを確認します
    • 明らかに暴走している場合はキャンセルします

トラブルシューティング

問題原因解決方法
SHOW CLUSTER STATEMENTS の結果が空になるアクティブなクエリがない、または権限が不十分VIEWACTIVITY または VIEWACTIVITYREDACTED を付与し、クラスターにアクティブな負荷があることを確認します
クエリテキストに <hidden> と表示されるVIEWACTIVITYREDACTED 権限を使用しているプライバシー保護のため、これは想定された動作です。全文が必要な場合は VIEWACTIVITY を使用します
クエリをキャンセルできない:「permission denied」CANCELQUERY 権限がないユーザーに CANCELQUERY システム権限を付与します
crdb_internal.cluster_transactions の処理が遅いクラスター上のトランザクション量が多いフィルター(application_name、時間のしきい値)を追加して、結果セットを絞り込みます
「relation does not exist」エラーテーブル名の誤記、または古い CockroachDB バージョン本番環境での使用が承認されたテーブルを使用していることを確認し、CockroachDB のバージョン互換性を確認します
トリアージクエリ自体の処理が遅いクラスターに極端な負荷がかかっているより厳しいフィルター(短い時間範囲、特定のアプリ)を使用します。明らかに暴走している処理を先にキャンセルすることも検討してください

主な考慮事項

  • プライバシー: マルチテナント環境で機密性の高いクエリ定数を保護するには、VIEWACTIVITY の代わりに VIEWACTIVITYREDACTED を使用してください。
  • パフォーマンスへの影響: トリアージクエリは読み取り専用で軽量ですが、極端な高負荷時に短い間隔で繰り返し実行することは避けてください。
  • LIMIT 句: 大規模なクラスターで出力が過剰にならないよう、必ず LIMIT を含めてください。
  • 時間のしきい値: ワークロードに応じて INTERVAL を調整してください(5 分が妥当なデフォルトですが、高速な OLTP では 30 秒が適している場合があります)。
  • キャンセルは混乱を招きます: 問題があることを確認してから、クエリやセッションをキャンセルしてください。可能であれば、アプリケーションチームと調整してください。
  • 履歴分析には不向き: これらのクエリで確認できるのは現在の状態のみです。時間の経過に伴う傾向を把握するには、DB Console または Prometheus のメトリクスを使用してください。
  • 本番環境で承認されたデータソース: 本番環境のトリアージには、SHOW CLUSTER STATEMENTS、SHOW CLUSTER SESSIONS、crdb_internal.cluster_transactions のみを使用してください。

参考資料

スキルの参考資料:

関連スキル:

CockroachDB の公式ドキュメント:

コメント