mcpField
T
triaging-live-sql-activity

triaging-live-sql-activity

github.com/cockroachlabs数据与数据库23124 次安装14 周前更新
代码仓库

关于 triaging-live-sql-activity

用于 CockroachDB 运维人员即时诊断集群 SQL 活动的技能,通过 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 版本兼容性
排查查询本身运行缓慢集群负载极高使用更严格的筛选条件(缩短时间范围、指定应用);考虑先取消明显失控的任务

关键注意事项

  • 隐私: 在多租户环境中,使用 VIEWACTIVITYREDACTED 代替 VIEWACTIVITY,以保护敏感的查询常量
  • 性能影响: 排查查询为只读且开销较低,但在极端负载期间,请避免在紧密循环中运行这些查询
  • LIMIT 子句: 始终包含 LIMIT,以免在大型集群上产生过多输出
  • 时间阈值: 根据工作负载调整 INTERVAL(5 分钟是合理的默认值,但快速 OLTP 可能需要 30 秒)
  • 取消操作会造成干扰: 只有在确认查询或会话存在问题后才取消;条件允许时,请与应用团队协调
  • 不适用于历史分析: 这些查询仅显示当前状态;如需分析随时间变化的趋势,请使用 DB Console 或 Prometheus 指标
  • 适用于生产环境的来源: 生产环境排查时,仅使用 SHOW CLUSTER STATEMENTS、SHOW CLUSTER SESSIONS 和 crdb_internal.cluster_transactions

参考资料

技能参考:

相关技能:

CockroachDB 官方文档:

评论

支持 Markdown