Clickhouse系统表详解

754 阅读12分钟

引言

该文章主要讲解Clikhouse所有系统表、表字段的诠释。在你遇到Clickhouse问题时能更有效、快速定位问题所在。以及对Clickhouse有更深入的认识。本文知识点主要依赖于博主本人工作中对clickhouse的了解以及 clickhouse官网 文档.

需快速解决问题的朋友直接跳到第三节看query_log、query_thread_log、即可

系统表:

  • 存储于 system 数据库。
  • 仅提供数据读取功能。
  • 不能被删除或更改,但可以对其进行分离(detach)操作。 大多数系统表将其数据存储在RAM中。 一个ClickHouse服务在刚启动时便会创建此类系统表。

不同于其他系统表,系统日志表 metric_logquery_logquery_thread_logtrace_logpart_log, crash_log and text_log 默认采用MergeTree 引擎并将其数据存储在文件系统中。 如果人为的从文件系统中删除表,ClickHouse服务器会在下一次进行数据写入时再次创建空表。 如果系统表结构在新版本中发生更改,那么ClickHouse会重命名当前表并创建一个新表。

一、如何自定义系统日志表的结构

/etc/clickhouse-server/config.d/下创建与系统表同名的配置文件, 或者在/etc/clickhouse-server/config.xml中设置相应配置项 可供自定义的配置项如下:

  • database: 系统日志表所在的数据库。这个选项目前已经不推荐使用。所有的系统日表都位于system库中。
  • table: 接收数据写入的系统日志表。
  • partition_by: 指定PARTITION BY表达式。
  • ttl: 指定系统日志表TTL选项。
  • flush_interval_milliseconds: 指定日志表数据刷新到磁盘的时间间隔。
  • engine: 指定完整的表引擎定义。(以ENGINE = 开头)。 这个选项与partition_by以及ttl冲突。如果与两者一起设置,服务启动时会抛出异常并且退出。

定义示例:

<clickhouse>  
    <query_log>  
        <database>system</database>  
        <table>query_log</table>  
        <partition_by>toYYYYMM(event_date)</partition_by>  
        <ttl>event_date + INTERVAL 30 DAY DELETE</ttl>  
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>  
        </query_log>  
</clickhouse>

默认情况下,表增长是无限的。可以通过TTL 删除过期日志记录的设置来控制表的大小

二、系统表概览

只详解个别几张日志表,其他的表不做详细解释。详解下滑至 > 三、日志相关表详解

分类表名解释
权限相关users包含服务器上配置的用户账号的列表.
权限相关role-grants包含用户和角色的角色授予. 向该表添加项, 请使用GRANT role TO user.
权限相关roles包含有关已配置的 角色 信息.
权限相关quota_limits包含关于所有配额的所有间隔的最大值的信息. 任何行数或0行都可以对应一个配额.
权限相关quota_usage当前用户的配额使用情况: 使用了多少, 还剩多少.
权限相关quotas包含 quotas 信息.
权限相关quotas_usage所有用户配额使用情况.
权限相关current_roles包含当前用户的激活角色. SET ROLE 修改该表的内容.
权限相关enabled_roles包含当前所有活动角色, 包括当前用户的当前角色和当前角色的已授予角色.
权限相关grants授予ClickHouse用户帐户的权限.(该表我司使用版本没有)
元数据相关clusters包含有关配置文件中可用的集群及其中的服务器的信息。
元数据相关databases包含当前用户可用的数据库的相关信息。
元数据相关tables包含服务器知道的每个表的元数据。 分离的表不在 system.tables 显示。
元数据相关columns此系统表包含所有表中列的信息。
元数据相关data_type_families包含有关受支持的数据类型的信息.
元数据相关mutations该表包含关于MergeTree表的mutation及其进度信息 。每条mutation命令都用一行来表示。
元数据相关parts此系统表包含 MergeTree 表分区的相关信息。
元数据相关parts_columns包含关于MergeTree表的部分和列的信息.
监控相关crash_log包含有关致命错误堆栈跟踪的信息.该表默认不存在于数据库中, 仅在发生致命错误时才创建.
监控相关asynchronous_metrics包含在后台定期计算的指标。 例如,在使用的RAM量。
监控相关asynchronous_metric_log包含每分钟记录一次的 system.asynchronous_metrics历史值。默认开启。
系统日志相关metrics此系统表包含可以即时计算或具有当前值的指标。例如,同时处理的查询数量或当前的复制延迟。这个表始终是最新的。
系统日志相关opentelemetry_span_log包含已执行查询的跟踪范围的信息.
系统日志相关processes该系统表用于实现 SHOW PROCESSLIST 查询.
系统日志相关part_log此表包含与以下情况发生的事件有关的信息 数据部分 在 MergeTree 家庭表,例如添加或合并数据。
系统日志相关metric_log包含表中度量值的历史记录 system.metrics 和 system.events,定期刷新到磁盘。 
系统日志相关query_log包含已执行查询的相关信息,例如:开始时间、处理持续时间、错误消息。
系统日志相关query_thread_log包含有关执行查询的线程的信息,例如,线程名称、线程开始时间、查询处理的持续时间。
系统日志相关query_views_log包含有关运行查询时执行的从属视图的信息,例如视图类型或执行时间.
系统日志相关text_log包含日志记录条目。 进入该表的日志记录级别可以通过以下方式进行限制 text_log.level 服务器设置。
系统日志相关trace_log包含采样查询探查器收集的堆栈跟踪。
系统日志相关zookeeper_log此表包含有关对 ZooKeeper 服务器的请求及其响应的参数的信息.
系统信息相关disks包含在 服务器配置 中定义的磁盘信息.
系统信息相关events包含有关系统中发生的事件数的信息。 例如,在表中,您可以找到多少 SELECT 自ClickHouse服务器启动以来已处理查询。
系统信息相关functions包含有关常规函数和聚合函数的信息。
系统信息相关merges包含有关MergeTree系列中表当前正在进行的合并和部件突变的信息。
系统信息相关settings包含当前用户会话设置的相关信息。
系统信息相关replicas包含驻留在本地服务器上的复制表的信息和状态。 此表可用于监视。 该表对于每个已复制的*表都包含一行。
系统信息相关settings_profile_elements描述settings配置文件的内容:
系统信息相关settings_profiles包含 Setting 配置文件中指定的属性.
系统信息相关table_engines包含服务器支持的表引擎的描述及其功能支持信息。
系统信息相关time_zones包含 ClickHouse 服务器支持的时区列表. 此时区列表可能因 ClickHouse 的版本而异
系统信息相关stack_trace包含所有服务器线程的堆栈跟踪. 允许开发人员对服务器状态进行自省.
系统信息相关detached_parts包含关于 MergeTree 表的分离分区的信息。reason 列详细说明了该分区被分离的原因。
系统信息相关storage_policies包含有关 服务器配置 中定义的存储策略和卷信息。
工具类相关numbers这个表有一个名为 number 的 UInt64 列,包含了几乎所有从 0 开始的自然数。
工具类相关numbers_mt带mt的表读取是并行的
工具类相关one此表包含一行只有一个值为 0 的 dummy UInt8 列的数据。
未分类replicated_fetches包含当前正在运行的后台提取的信息.
replication_queue包含用于 ReplicatedMergeTree 系列表的复制队列中存储在ZooKeeper中的任务的信息.
zookeeper如果未配置ZooKeeper,则该表不存在。 允许从配置中定义的ZooKeeper集群读取数据。
contributors此系统表包含有关贡献者的信息。排列顺序是在查询执行时随机生成的。
data_skipping_indices包含有关所有表中现有数据跳过索引的信息.(我这个版本没这张表啊,有需要了解去官网看看吧)
dictionaries包含以下信息 外部字典.
distributed_ddl_queue包含有关在集群上执行的分布式ddl查询(集群环境)的信息.
distribution_queue包含关于队列中要发送到分片的本地文件的信息. 这些本地文件包含通过以异步模式将新数据插入到Distributed表中而创建的新部分.
errors包含错误代码和它们被触发的次数.
graphite_retentions包含有关参数的信息 graphite_rollup 这是在表中使用 *GraphiteMergeTree 引擎
licenses包含位于 ClickHouse 源的 contrib 目录中的第三方库的许可证.
merge_tree_settings包含 MergeTree 表的设置 (Setting) 信息。
未分类processors对用户来说没太大意义,对系统而言有强相关的表,别乱动

三、日志相关表详解

查问题至尊SQL(如果没自己想要的,翻下去找自己想要的字段)

select
    query, --查询语句.
    count(1) cnt,
    sum(query_duration_ms) /1000 `查询消耗的时间(秒)`,
    sum(read_rows) read_rows, --从参与了查询的所有表和表函数读取的总行数.
    sum(read_bytes) / 1024 / 1024 `read(MB)`, -- 从参与了查询的所有表和表函数读取的大小
    sum(written_rows) written_rows, -- 对于 INSERT 查询,为写入的行数
    sum(written_bytes) written_bytes, --对于 INSERT 查询时,为写入的字节数。
    sum(result_rows) result_rows, --SELECT 查询结果的行数,或INSERT 的行数。
    sum(result_bytes) result_bytes, --  存储查询结果的RAM量.
    sum(memory_usage) memory_usage -- 查询使用的内存.
from system.query_log
where 1=1
  and event_date = today() -- 日期条件 yyyyMMdd
  and type in (1,2) -- 1 — 查询成功启动. 2 — 查询成功完成. 3 — 查询执行前有异常. 4 — 查询执行期间有异常.
  and stack_trace != '' -- 如果查询成功完成,则为空字符串。
group by query
order by cnt,`查询消耗的时间(秒)` desc

query_log

  • type — 执行查询时的事件类型. 值:

    • 'QueryStart' = 1 — 查询成功启动.
    • 'QueryFinish' = 2 — 查询成功完成.
    • 'ExceptionBeforeStart' = 3 — 查询执行前有异常.
    • 'ExceptionWhileProcessing' = 4 — 查询执行期间有异常.
  • event_date — 查询开始日期.

  • event_time  — 查询开始时间.

  • query_start_time — 查询执行的开始时间.

  • query_duration_ms  — 查询消耗的时间(毫秒).

  • read_rows  — 从参与了查询的所有表和表函数读取的总行数. 包括:普通的子查询, IN 和 JOIN的子查询. 对于分布式查询 read_rows 包括在所有副本上读取的行总数。 每个副本发送它的 read_rows 值,并且查询的服务器-发起方汇总所有接收到的和本地的值。

  • read_bytes — 从参与了查询的所有表和表函数读取的总字节数. 然后同 read_rows

  • written_rows  — 对于 INSERT 查询,为写入的行数。 对于其他查询,值为0。

  • written_bytes  — 对于 INSERT 查询时,为写入的字节数。 对于其他查询,值为0。

  • result_rows  — SELECT 查询结果的行数,或INSERT 的行数。

  • result_bytes  — 存储查询结果的RAM量.

  • memory_usage — 查询使用的内存.

  • query — 查询语句.

  • exception  — 异常信息.

  • exception_code  — 异常码.

  • stack_trace 如果查询成功完成,则为空字符串。

  • is_initial_query  — 查询类型. 可能的值:

    • 1 — 客户端发起的查询.
    • 0 — 由另一个查询发起的,作为分布式查询的一部分.
  • user — 发起查询的用户.

  • query_id — 查询ID.

  • address — 发起查询的客户端IP地址.

  • port — 发起查询的客户端端口.

  • initial_user — 初始查询的用户名(用于分布式查询执行).

  • initial_query_id — 运行初始查询的ID(用于分布式查询执行).

  • initial_address — 运行父查询的IP地址.

  • initial_port  发起父查询的客户端端口.

  • interface  — 发起查询的接口. 可能的值:

    • 1 — TCP.
    • 2 — HTTP.
  • os_user 运行的操作系统用户名.

  • client_hostname 运行 或其他TCP客户端的机器的主机名。

  • client_name clickhouse-client 或其他TCP客户端的名称。

  • http_method (UInt8) — 发起查询的HTTP方法. 可能值:

    • 0 — TCP接口的查询.
    • 1 — GET
    • 2 — POST
  • thread_ids — 参与查询的线程数.

  • Settings.Names— 客户端运行查询时更改的设置的名称。 要启用对设置的日志记录更改,请将log_query_settings参数设置为1。

  • Settings.Values  — Settings.Names 列中列出的设置的值。

query_thread_log

  • event_date — 该查询线程执行完成的日期。

  • event_time — 该查询线程执行完成的时间。

  • query_start_time — 查询的开始时间。

  • query_duration_ms  — 查询执行持续的时间。

  • read_rows  — 读取的行数。

  • read_bytes  — 读取的字节数。

  • written_rows  — 对于 INSERT 查询,写入的行数。 对于其他查询,为0。

  • written_bytes  — 对于 INSERT 查询,写入的字节数。 对于其他查询,为0。

  • memory_usage — 在线程上下文,分配的内存和空闲内存之差。

  • peak_memory_usage  — 在线程上下文,分配的内存和空闲内存之差的最大值。

  • thread_name — 线程名。

  • thread_number — 内部线程ID。

  • thread_id — 线程ID。

  • master_thread_id  — OS初始线程的初始ID。

  • query — 查询语句。

  • is_initial_query  — 查询类型,可能的值:

    • 1 — 由用户发起的查询。
    • 0 — 由其他查询发起的分布式查询。
  • user  — 发起查询的用户名。

  • query_id  — 查询的ID。

  • address  — 发起查询的IP地址。

  • port — 发起查询的端口。

  • initial_user  — 首次发起查询的用户名(对于分布式查询)。

  • initial_query_id — 首次发起查询的ID(对于分布式查询)。

  • initial_address  — 发起该查询的父查询IP地址。

  • initial_port  — 发起该查询的父查询端口。

  • interface — 发起查询的界面,可能的值:

    • 1 — TCP.
    • 2 — HTTP.
  • http_method  — 发起查询的HTTP方法,可能的值:

    • 0 — 查询通过TCP界面发起。
    • 1 — GET 方法被使用。
    • 2 — POST 方法被使用。
  • revision — ClickHouse 修订版本号.

  • ProfileEvents 对于该线程的多个指标计数器。

processes

  • user – 进行查询的用户。 请记住,对于分布式处理,查询将发送到默认用户下的远程服务器。 该字段包含特定查询的用户名,而不是该查询发起的查询的用户名。

  • address – 发出请求的 IP 地址。

  • elapsed – 自请求执行开始以来的秒数。

  • rows_read – 从表中读取的行数。

  • bytes_read – 从表中读取的未压缩字节数。

  • total_rows_approx – 应读取的总行数的近似值。

  • memory_usage – 请求使用的 RAM 量。 它可能不包括某些类型的专用内存。

  • query – 查询文本。 对于 INSERT,它不包括要插入的数据。

  • query_id – 查询 ID(如果已定义)。

  • is_cancelled – 查询被取消。

  • is_all_data_sent – 是否所有数据都发送到客户端(换句话说,查询已在服务器上完成)。