clickhouse的query_log

发布时间 2023-05-22 15:40:24作者: abce

clickhouse的query_log包含了执行过的的查询的信息,比如开始时间、持续时长、错误信息等

开启该功能通过参数log_queries=1进行设置。一般不建议关闭该功能。

'log_queries'是用户级别的配置。打开clickhouse的users.xml文件,在profiles中加入<log_queries>1</log_queries>。高版本中默认就是开启的。

默认设置:

:)select * from system.settings where name='log_queries';	
┌─name────────┬─value─┬─changed─┬─description─────────────────────────────────────────┬─min──┬─max──┬─readonly─┬─type─┬─default─┬─alias_for─┐
│ log_queries │ 1     │       0 │ Log requests and write the log to the system table. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │        0 │ Bool │ 1       │           │
└─────────────┴───────┴─────────┴─────────────────────────────────────────────────────┴──────┴──────┴──────────┴──────┴─────────┴───────────┘

打开clickhouse的users.xml文件,在profiles中加入<log_queries>1</log_queries>

    <profiles>
        <!-- Default settings. -->
        <log_queries>1</log_queries>
        <default>
                <max_memory_usage>10000000000</max_memory_usage>
        </default>
    </profiles>

在配置文件的query_log标签中配置(参考控制文件config.xml)

    <!-- Query log. Used only for queries with setting log_queries = 1. -->
    <query_log>
        <!-- What table to insert data. If table is not exist, it will be created.
             When query log structure is changed after system update,
              then old table will be renamed and new table will be created automatically.
        -->
        <database>system</database>
        <table>query_log</table>
        <partition_by>toYYYYMM(event_date)</partition_by>
        <ttl>event_date + INTERVAL 30 DAY DELETE</ttl>

        <!-- Interval of flushing data. -->
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>

        <!-- example of using a different storage policy for a system table -->
        <!-- storage_policy>local_ssd</storage_policy -->
    </query_log>

其中:

·database – 数据库名

·table – 表名

·partition_by — 分区列,如果定义了engine,该参数就不被使用

·engine - 表的引擎,如果定义了partition_by,该参数就不被使用

·flush_interval_milliseconds – 刷新数据到表的时间间隔。要将日志从内存缓冲区强制刷新到表中,可以使用SYSTEM FLUSH LOGS。

·storage_policy – 表的存储策略,是可选参数

 

日志信息存储在表system.query_log中,包含两种查询:

1.客户端执行的查询

2.由其他查询发起的子查询(分布式查询执行)。对于这些类型的查询,有关父查询的信息显示在initial_*列中

 

一个查询会产生一条或两条记录,这个取决与状态(查看type列):

1.执行成功的查询,会生成两条记录,type的值分别是QueryStart和QueryFinish

2.查询执行过程中产生了错误,会生成两个事件,type的值分别是QueryStart和ExceptionWhileProcessing

3.在查询执行之前发生了错误,会生成一个事件,type的值是ExceptionBeforeStart 

 

手动配置过期TTL

ALTER TABLE system.query_log
 on cluster cluster_name MODIFY 
 TTL event_date + INTERVAL 30 DAY

 

配置文件中配置过期TTL 

 <query_log>
    <database>system</database>
    <table>query_log</table>
    <engine>Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + INTERVAL 30 day</engine>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>

 

查看对磁盘的使用情况

select  
  partition, 
  database, 
  table,  
  sum(rows) as row,  
  formatReadableSize(sum(bytes_on_disk)) as used_disk,  
  formatReadableSize(sum(data_uncompressed_bytes)) as before_compress,  
  formatReadableSize(sum(data_compressed_bytes)) as after_compress,  
  round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100, 0) compress_rate  
from system.parts  
where database='system'
and table='query_log'
group by table,database,partition 
order by row desc limit 10;