You need to enable JavaScript to run this app.
导航
SQL 审计
最近更新时间:2025.11.12 10:37:41首次发布时间:2024.08.29 12:45:15
复制全文
我的收藏
有用
有用
无用
无用

ByteHouse 云数仓版为您提供 SQL 审计能力和界面化查看 SQL 执行日志的功能,支持查看 SQL 历史和运行中的查询,帮助您快速定位并优化慢查询、排查错误、审计用户行为以保障数据安全,适用于数据库性能调优、安全合规审计、事后故障追溯等场景。同时 ByteHouse 也提供详细 SQL 日志表,打开详细日志开关后,即可查看对应详细 SQL 日志表数据,进一步查看更细致的日志数据。本文为您介绍如何使用 ByteHouse SQL 审计功能。

背景信息

ByteHouse SQL 审计功能支持查看 SQL 历史与运行中的查询,其中,SQL 历史中可查看慢 SQL 查询、错误查询、ID 或 SQL 语句内容精准检索。
该功能提供全面的审计维度,包括查询 ID、状态、用户名/ID、有效角色、计算组、开始/结束时间、时长、SQL 类型、SQL 语句、CPU 总耗时、内存最大用量(Segment)等。同时该功能也支持丰富的筛选项,便于您进行高效分析 SQL 执行情况。

此外,ByteHouse 也支持查看详细日志。启用该功能后,ByteHouse 将开始积攒数据(需重新与 ByteHouse 建立连接),并自动创建名为 bh_system 的数据库及库内 query_log 表,用于记录详细的 SQL 执行日志数据,您拥有该库和表的全部权限。该表默认数据生命周期为 7 天,如果需要保留更长周期,您可执行 SQL 命令按需删除 TTL 或修改 TTL 时间,操作详情请参见调整 query_log 表生命周期

使用限制
  • 管理员可查看所有用户的 SQL 审计信息,包括 SQL 历史、运行中的查询和详细日志,子用户仅能查看当前账号的 SQL 审计信息。子用户如需查看所有用户的 SQL 审计信息,可联系管理员授予全局审计日志权限,操作详情请参考资源权限设置
  • SQL 历史列表中的 ‘CPU 总耗时’ 和 ‘内存最大用量(Segment)’ 这两个展示项是 Beta 功能且要求引擎版本为 v2.3 及以上版本,如需查看对应信息,请提交工单或联系 ByteHouse 团队获取白名单权限。
  • 详细日志为非公开功能,如需使用,请提交工单或联系 ByteHouse 团队获取白名单权限。

查看 SQL 历史和运行中的查询
  1. 登录 ByteHouse 控制台,单击顶部审计日志,单击 SQL 审计,在 SQL 历史页签下,可以看到历史查询列表。您可以通过筛选条件筛选 SQL 历史,支持通过查询 IDSQL 语句查询,您可从下拉列表中选择并切换。
    Image
    1. SQL 历史列表中包含如下信息:
      • 查询 ID:SQL 查询的唯一 ID 号。
      • 状态:事件完成状态,如“成功”或“失败”。失败的事件,可以在后侧按钮查询具体情况。
      • 有效角色:执行此事件的角色类型。
      • 计算组:执行查询的计算组 VW 名称。
      • CPU总耗时:计算组所有 segment 的 CPU 耗时总和。由于 segment 可并行运行,因此该值可能大于查询时长。
      • 内存最大用量(Segment):该计算组执行的所有 segment 的最大内存用量。
      • 开始时间:事件发生的具体时间。
      • 结束时间:事件结束的具体时间。
      • 时长:事件执行的时间长度。
      • SQL 类型:执行 SQL 语句的类型,如 CREATE、DROP、INSERT、DELETE 等。
      • SQL 语句:执行的 SQL 语句内容,以及其方言类型。
    2. 切换到“错误查询”页签可以快速定位失败事件,并根据需求查询相关状态。
      Image
    3. 切换到“ID或SQL查询”页签,可以根据查询 ID 或 SQL 语句进行查询。
  2. 切换到“运行中的查询”页签,可以看到正在执行的查询列表,可查看查询 ID、开始时间、计算组、SQL 语句,您也可以使用查询 ID、SQL 语句或计算组查询正在执行的查询。

    说明

    您也可以通过使用 SQL 命令 SHOW PROCESSLIST 查看当前运行中的查询,使用方式请参见SHOW PROCESSLIST

查看详细日志(query_log)

注意

详细日志为非公开功能,如需使用,请提交工单或联系 ByteHouse 团队获取白名单权限。

获取白名单权限后,您可以在 SQL 审计页面的右上角打开开启详细日志开关,启用后,ByteHouse 会为您在系统中创建一张 query_log 的表,用于写入详细的 SQL 执行日志数据。

  1. 打开开启详细日志开关。
    Image
    打开详细日志按钮后,ByteHouse 将获得您的授权,在您的【租户-环境】下创建 bh_system 数据库,并在该数据库中创建一张 query_log 表,您拥有该库和表的全部权限。
    该表在打开后立即生效并开始积攒数据,但您需要重新与 ByteHouse 建立连接,旧连接将无法成功写入日志数据。

    注意

    由于 ByteHouse 将您执行的 SQL 日志信息持续写入到 bh_system.query_log 表中,对于该表的增删改操作将会影响日志写入。禁止对该表进行除修改 TTL 外的增删改操作。

  2. 查看 query_log 表。您可以通过单击页面顶部的数据库SQL 工作表查看 query_log 表。
    使用 SQL 工作表查看 query_log 表为例,您可以在 SQL 工作表的左侧数据对象中的 bh_system 数据库中看到该表。
    Image

调整 query_log 表生命周期

bh_system.query_log 表默认数据生命周期只有 7 天, 如果需要保留更长周期,请参考以下命令按需删除 TTL 或修改 TTL 时间。

# 查看 bh_system.query_log 表当前生命周期
SHOW CREATE TABLE bh_system.query_log;

# 删除 TTL
ALTER TABLE bh_system.query_log REMOVE TTL;

# 将默认 TTL 从 7 天改为 180 天(您可以将 180 替换为您希望保留日志的天数,需管理员权限执行)
ALTER TABLE bh_system.query_log  MODIFY TTL event_time + INTERVAL 180 DAY;

query_log 表信息

列名

数据类型

字段描述

type

Enum8,枚举值包括:

  • 'QueryStart' = 1
  • 'QueryFinish' = 2
  • 'ExceptionBeforeStart' = 3
  • 'ExceptionWhileProcessing' = 4

查询事件类型:

  1. QueryStart (查询开始)
  2. QueryFinish (查询成功结束)
  3. ExceptionBeforeStart (执行前异常)
  4. ExceptionWhileProcessing (执行中异常)

event_date

Date

事件发生的日期

event_time

DateTime

事件发生的精确时间戳

event_time_microseconds

DateTime64(6)

事件时间戳(微秒精度)

query_start_time

DateTime

查询开始时间

query_start_time_microseconds

DateTime64(6)

查询开始时间(微秒精度)

query_duration_ms

UInt64

查询总耗时(毫秒)

read_rows

UInt64

查询的所有表和表函数读取的总行数

read_bytes

UInt64

查询的所有表和表函数读取的总字节数

written_rows

UInt64

写入的行数(仅INSERT操作)

written_bytes

UInt64

写入的字节数(仅INSERT操作)

result_rows

UInt64

返回结果的行数

result_bytes

UInt64

返回结果的字节数

memory_usage

UInt64

查询在每个worker,每个segment上使用的最高内存用量

current_database

String

当前数据库

query

String

完整的查询语句

normalized_query_hash

UInt64

规范化查询哈希值

query_kind

String

查询类型(如 SELECT, INSERT 等)

databases

Array(String)

查询涉及到的数据库

tables

Array(String)

查询涉及到的数据表

columns

Array(String)

查询涉及到的数据表字段

partition_ids

Array(String)

分区

projections

Array(String)

查询涉及的投影(Projection)名称列表

materialized_views

Array(String)

查询涉及的物化视图名称列表

exception_code

Int32

异常代码(仅当type为异常事件时有值)

exception

String

异常信息(错误消息)

stack_trace

String

异常堆栈跟踪信息(需配置 log_query_threads=1

is_initial_query

UInt8

是否为初始查询(0:子查询;1:用户直接发起的查询)

user

String

用户名

query_id

String

查询ID

interface

UInt8

发起查询的接口,可能的值:

  • 1 — TCP
  • 2 — HTTP

os_user

String

运行 TCP 客户端的操作系统用户

client_hostname

String

TCP 客户端主机名

client_name

String

TCP 客户端名称

client_revision

UInt32

TCP 客户端版本

client_version_major

UInt32

TCP 客户端主版本

client_version_minor

UInt32

TCP 客户端次版本号

client_version_patch

UInt32

TCP 客户端补丁版本

http_method

UInt8

发起查询的 HTTP 方法,可能值:
0 — TCP接口的查询.
1 — GET
2 — POST

http_user_agent

String

客户端的User-Agent信息

http_referer

String

HTTP 来源信息

forwarded_for

String

HTTP 代理链中的客户端IP

quota_key

String

配额键

revision

UInt32

ByteHouse 修订版

ProfileEvents

Map(String, UInt64)

PrunedPartitions:实际读取到的partition数量。
TotalPartitions:总共partition数量。
TotalCPUTimeMs:查询在每个worker,每个segment上总和的cpu耗时(毫秒)。

注意

TotalCPUTimeMs 列仅在 ByteHouse CDW 引擎 v2.3.x 及以上版本中支持,使用前请确认引擎版本。您可登录 ByteHouse 控制台,单击顶部租户管理,在基础信息页面中查看您使用的引擎版本。

Settings

Map(String, String)

查询生效的配置参数(覆盖默认值的部分)

log_comment

String

日志注释

thread_ids

Array(UInt64)

参与查询的线程ID列表

used_aggregate_functions

Array(String)

使用的聚合函数

used_aggregate_function_combinators

Array(String)

使用的聚合函数

used_database_engines

Array(String)

使用的表引擎

used_data_type_families

Array(String)

使用的数据类型

used_dictionaries

Array(String)

使用的字典表

used_formats

Array(String)

使用数据格式参数(如:FORMAT CSV)

used_functions

Array(String)

使用的函数

used_storages

Array(String)

使用的存储

used_table_functions

Array(String)

使用的表函数

virtual_warehouse

String

查询使用的计算组

query_plan

String

查询的执行计划