关于 triaging-live-sql-activity
用于 CockroachDB 运维人员即时诊断集群 SQL 活动的技能,通过 SQL 查看正在运行的查询、会话和事务。它支持按应用、用户或客户端定位负载来源,并可在具备权限时选择取消异常工作。
主要功能
- 01识别长时间运行的查询
- 02检查活跃会话与事务
- 03按应用、用户或客户端筛选活动
- 04通过重试次数发现潜在争用
- 05提供可选的查询或会话取消操作
适用场景
- 01调查集群当前变慢的原因
- 02定位占用资源的查询来源
- 03排查事务重试与争用问题
- 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) |
分诊工作流:
- 找出运行时间较长的查询(> 5-10 分钟)
- 将查询与会话及应用关联起来
- 检查事务重试次数(重试次数高 = 存在争用)
- 按应用/用户/客户端进一步排查
- (可选)取消失控作业
安全性: 所有诊断查询均为只读。取消操作为可选项,并会提供明确警告。
核心诊断查询
长时间运行的查询
找出运行时间超过指定阈值的查询:
-- 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:“集群运行缓慢”调查
场景: 用户报告整体运行缓慢。
-
检查是否有长时间运行的查询:
-- Run the "Long-Running Queries" diagnostic -- Look for queries running > 5-10 minutes -
识别源应用:
-- 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; -
深入检查特定应用:
-- Filter by top application from step 2 -- Use "Filter by Application" query -
决定采取何种措施:
- 联系应用团队,调查查询模式
- 如情况紧急,取消特定的失控查询
- 如果查询合理,检查架构/索引问题
工作流 2:查找重试次数较高的事务
场景: 怀疑存在争用问题。
-
检查重试次数是否过高:
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; -
调查特定事务:
-- 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:按用户识别资源占用大户
场景: 需要确定负载归属于哪些特定用户。
-
统计每位用户的活跃查询数:
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; -
深入检查特定用户的活动:
-- Use "Filter by User" query -
采取措施:
- 如果负载异常,联系用户
- 检查用户的查询模式
- 如果确认失控,则取消
故障排除
| 问题 | 原因 | 解决方法 |
|---|---|---|
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
参考资料
技能参考:
相关技能:
- profiling-statement-fingerprints - 用于分析历史性能模式和识别趋势
- profiling-transaction-fingerprints - 用于历史事务级别分析,包括重试风暴和提交延迟
CockroachDB 官方文档: