system_history.query_history
完整的 SQL 执行审计跟踪:记录在 Databend 中执行的所有 SQL 查询(Query)的全面详细信息。每个查询(Query)生成两个条目(开始和结束),提供对以下内容的完全可见性:
- 性能分析:查询(Query)持续时间、资源使用情况和优化机会
- 安全审计:谁在何时何地执行了哪些查询(Query)
- 合规性跟踪:满足监管要求的完整审计跟踪
- 使用情况监控:数据库活动模式和用户行为分析
凭证脱敏
query_text 会对可识别的 SQL 凭证值进行脱敏。普通查询字面量仍可能显示。日志中的错误会使用已记录的隐藏值进行清理;返回给提交查询的客户端的错误保持不变。有关范围和限制,请参阅凭证脱敏。这不会清理旧版本已记录的历史数据。
字段
| 字段 | 类型 | 描述 |
|---|---|---|
| log_type | TINYINT | 查询状态:1=开始,2=完成,3=错误,4=中止,5=关闭。 |
| log_type_name | VARCHAR | 查询状态的字符串名称:"Start"、"Finish"、"Error"、"Aborted" 或 "Closed"。 |
| handler_type | VARCHAR | 用于查询的协议或处理程序(例如 HTTPQuery、MySQL)。 |
| tenant_id | VARCHAR | 租户标识符。 |
| cluster_id | VARCHAR | 集群标识符。 |
| node_id | VARCHAR | 节点标识符。 |
| sql_user | VARCHAR | 执行查询的用户。 |
| sql_user_quota | VARCHAR | 用户的配额信息。 |
| sql_user_privileges | VARCHAR | 用户的权限。 |
| query_id | VARCHAR | 查询的唯一标识符。 |
| query_kind | VARCHAR | 查询的类型(例如 Query、Insert、CopyIntoTable 等)。 |
| query_text | VARCHAR | 查询的 SQL 文本。 |
| query_hash | VARCHAR | 查询文本的哈希值。 |
| query_parameterized_hash | VARCHAR | 查询的哈希值(忽略具体参数值)。 |
| event_date | DATE | 事件发生的日期。 |
| event_time | TIMESTAMP | 事件发生的时间戳。 |
| query_start_time | TIMESTAMP | 查询开始的时间戳。 |
| query_duration_ms | BIGINT | 查询的总持续时间(以毫秒为单位),包括排队时间和执行时间。 |
| query_queued_duration_ms | BIGINT | 查询在队列中花费的时间(以毫秒为单位)。 |
| current_database | VARCHAR | 执行查询时使用的数据库。 |
| written_rows | BIGINT UNSIGNED | 查询写入的行数。 |
| written_bytes | BIGINT UNSIGNED | 查询写入的字节数。 |
| join_spilled_rows | BIGINT UNSIGNED | 连接操作期间溢出的行数。 |
| join_spilled_bytes | BIGINT UNSIGNED | 连接操作期间溢出的字节数。 |
| agg_spilled_rows | BIGINT UNSIGNED | 聚合操作期间溢出的行数。 |
| agg_spilled_bytes | BIGINT UNSIGNED | 聚合操作期间溢出的字节数。 |
| group_by_spilled_rows | BIGINT UNSIGNED | 分组操作期间溢出的行数。 |
| group_by_spilled_bytes | BIGINT UNSIGNED | 分组操作期间溢出的字节数。 |
| written_io_bytes | BIGINT UNSIGNED | 归属于查询的存储写入字节数。 |
| written_io_bytes_cost_ms | BIGINT UNSIGNED | 累计存储写操作时长,单位为毫秒。 |
| scan_rows | BIGINT UNSIGNED | 扫描工作量的行数,不是结果行数。请参阅指标范围。 |
| scan_bytes | BIGINT UNSIGNED | 逻辑扫描工作量的字节数,不是存储读取字节数。 |
| scan_io_bytes | BIGINT UNSIGNED | 归属于查询的存储读取字节数,范围不限于扫描输出。 |
| scan_io_bytes_cost_ms | BIGINT UNSIGNED | 累计存储读操作时长,单位为毫秒。 |
| scan_partitions | BIGINT UNSIGNED | 扫描的分区(Partition)数。 |
| total_partitions | BIGINT UNSIGNED | 涉及的总分区(Partition)数。 |
| result_rows | BIGINT UNSIGNED | 查询结果中的行数。 |
| result_bytes | BIGINT UNSIGNED | 查询结果中的字节数。 |
| bytes_from_remote_disk | BIGINT UNSIGNED | 从远程磁盘读取的字节数。 |
| bytes_from_local_disk | BIGINT UNSIGNED | 从本地磁盘读取的字节数。 |
| bytes_from_memory | BIGINT UNSIGNED | 从内存中读取的字节数。 |
| client_address | VARCHAR | 发起查询的客户端地址。 |
| user_agent | VARCHAR | 客户端的用户代理字符串。 |
| exception_code | INT | 查询失败时的异常代码。 |
| exception_text | VARCHAR | 查询失败时的异常消息。 |
| server_version | VARCHAR | 处理查询的服务器版本。 |
| query_tag | VARCHAR | 与查询关联的标签。 |
| has_profile | BOOLEAN | 查询是否关联执行配置文件。 |
| peek_memory_usage | VARIANT | 查询执行期间的峰值内存使用情况(以 JSON 对象表示)。 |
| session_id | VARCHAR | 与查询关联的会话标识符。 |
指标范围
从 v1.2.953 开始,存储 I/O 字段使用每查询计数器。scan_io_bytes 和 written_io_bytes 包括本地节点 I/O 和已上报给查询的远程节点增量。对应的时长字段来自同一组计数器。每条日志中的 I/O 字段与 resource_usage 使用同一个快照。时长字段累计操作时间,不是查询的墙钟耗时。
这些计数器度量归属于查询的存储操作,包括数据块和元数据 I/O。它们独立于逻辑扫描/写入进度和结果大小。写入查询可以同时报告读取和写入。例如,INSERT ... SELECT 读取源数据并写入目标数据。这两类字节度量不必相等。
同样从 v1.2.953 开始,FUSE Parquet 扫描在 prewhere 和运行时过滤器移除行之前报告工作量。scan_rows 统计已扫描数据块的行数,即使没有行通过这些过滤器。被裁剪的数据块不会被扫描。scan_bytes 表示这些数据块的未压缩投影列工作量。当行选择下推跳过部分行的解码时,这些行的字节数可以通过估算得到。它不是存储传输字节数的精确计数。
同一扫描工作量也用于 system.processes.scan_progress_read_rows、scan_progress_read_bytes 和 Profile 的 ScanBytes。实时的 system.processes.data_read_bytes 和 data_write_bytes 则使用每查询 I/O 计数器。过滤后的结果更小,本身不表示扫描工作量更少。解释指标时,请比较兼容的查询阶段和版本。
查看已完成查询的度量:
SELECT query_id, scan_rows, scan_bytes, scan_io_bytes,
written_io_bytes, result_rows
FROM system_history.query_history
WHERE log_type = 2
ORDER BY event_time DESC
LIMIT 10;
示例
使用 query_id 查询特定查询的历史记录
SELECT * FROM system_history.query_history WHERE query_id = '4e1f50a9-bce2-45cc-86e4-c7a36b9b8d43';
*************************** 1. row ***************************
log_type: 2
log_type_name: Finish
handler_type: HTTPQuery
tenant_id: test_tenant
cluster_id: test_cluster
node_id: jxSgvulZFAq1sDckR1bu85
sql_user: root
sql_user_quota: NULL
sql_user_privileges: NULL
query_id: 4e1f50a9-bce2-45cc-86e4-c7a36b9b8d43
query_kind: Query
query_text: SELECT * FROM t
query_hash: cd36a2072e7f9deaa746db7480200944
query_parameterized_hash: cd36a2072e7f9deaa746db7480200944
event_date: 2025-06-12
event_time: 2025-06-12 03:31:35.135987
query_start_time: 2025-06-12 03:31:35.041725
query_duration_ms: 94
query_queued_duration_ms: 0
current_database: default
written_rows: 0
written_bytes: 0
join_spilled_rows: 0
join_spilled_bytes: 0
agg_spilled_rows: 0
agg_spilled_bytes: 0
group_by_spilled_rows: 0
group_by_spilled_bytes: 0
written_io_bytes: 0
written_io_bytes_cost_ms: 0
scan_rows: 1
scan_bytes: 20
scan_io_bytes: 605
scan_io_bytes_cost_ms: 0
scan_partitions: 1
total_partitions: 1
result_rows: 1
result_bytes: 20
bytes_from_remote_disk: 74
bytes_from_local_disk: 0
bytes_from_memory: 0
client_address: 127.0.0.1
user_agent: bendsql/0.26.2-unknown
exception_code: 0
exception_text:
server_version: v1.2.753-nightly-c3d5fabb79(rust-1.88.0-nightly-2025-06-12T01:48:36.733925000Z)
query_tag:
has_profile: NULL
peek_memory_usage: {"jxSgvulZFAq1sDckR1bu85":223840}
session_id: e3c54c32-f3c0-4ea9-bdd2-65701aa3f2a6

