开启

clickhouse在20.5的版本开始query log是默认打开的,在此之前需要手动开启 详情

打开clickhouse的users.xml文件,在default中加入<font style="color:#E8323C;"><log_queries>1</log_queries></font>(需要重启服务)

Query Log - 图1

当log_queries打开后,config.xml中的「query_log配置」随即生效,此时会自动生成system.query_log表。

Query Log - 图2

partition_by表示查询日志表的分区列,语法与普通建表时相同,默认按月分区。flush_interval_milliseconds则表示日志刷入表中的周期,默认7.5秒,可以根据取数时效自己调节。
在标记处添加:<font style="color:#E8323C;"><ttl>event_date + INTERVAL 15 DAY DELETE</ttl></font>配置,这样该表会每隔15天做一次清理(为什么是15天?考虑到排查问题15天应该足够),更多关于TTL配置的介绍 配置一个分布式表,用来外部查询。
  1. CREATE TABLE IF NOT EXISTS system.query_log_all
  2. ON CLUSTER yk_ck_cluster
  3. AS system.query_log ENGINE = Distributed(yk_ck_cluster,system,query_log,rand())

查询

开启query log功能后,被执行的sql都会记录到system.query_log表中,字段信息丰富。

  1. SELECT
  2. formatReadableSize(memory_usage),result_bytes,query
  3. FROM system.query_log
  4. WHERE event_time >= toDateTime('2023-07-11 04:30:00')
  5. AND event_time <= toDateTime('2023-07-11 04:55:00')
  6. AND query like '%faa55cb50ecbc476abfb5f7b%'
  7. ORDER BY memory_usage DESC limit 10\G

Query Log - 图3

query_log表会记录每条query请求,且元信息丰富。具体字段详情

当时间过去5分钟以后(测试时,TTL设置成5分钟过期),会看到历史的数据会被清除。

ttl没生效解决办法

system.query_log表已经能正常记录sql执行记录了,按时ttl定时清理功能并没有开始工作。

需要手动执行**<font style="color:#000080;">ALTER TABLE system</font>**.query_log **<font style="color:#000080;">MODIFY TTL </font>**event_date + **<font style="color:#000080;">INTERVAL 1</font>**<font style="color:#0000ff;">5 </font>**<font style="color:#000080;">DAY DELETE</font>**;

为什么在config.xml配置文件中加event_date + INTERVAL 15 DAY DELETE配置不能生效? 这是因为在20.4.5版本的配置文件中还不支持ttl配置,只能手动修改表结构。

Query Log - 图4

  1. ALTER TABLE system.query_log
  2. on cluster yk_ck_cluster MODIFY
  3. TTL event_date + INTERVAL 15 DAY

分析查询结果

system.query_log注册了两种查询:
  • 由客户端直接运行的初始查询。
  • 由其他查询发起的子查询(分布式查询执行)。对于这些类型的查询,有关父查询的信息显示在initial_*列中。
每个查询会在query_log表中创建1-2行,取决于查询的状态:
  • 如果查询执行成功,将创建两个类型为1和2的事件(参考type列)。
  • 如果查询处理过程中发生错误,将创建两个类型为1和4的事件。
  • 如果查询运行前发生错误,将只创建一个类型为3的事件。
  • 默认情况下,每隔7.5秒向表添加一次日志。可以在query_log服务器设置中设置这个时间间隔(参考flush_interval_milliseconds参数)。要将日志从内存缓冲区强制刷新到表中,可以使用SYSTEM FLUSH LOGS。
列信息:
  1. type (Enum8) 执行查询时发生的事件类型。
  2. QueryStart = 1 查询执行成功开始。
  3. QueryFinish = 2 查询执行成功结束。
  4. ExceptionBeforeStart = 3 在开始执行查询之前发生异常。
  5. ExceptionWhileProcessing = 4 查询执行期间的异常。
  6. event_date (Date) 查询开始日期。
  7. event_time (DateTime) 查询开始时间。
  8. query_start_time (DateTime) 查询执行开始时间。
  9. query_duration_ms (UInt64) 查询执行持续时间。
  10. read_rows (UInt64) 读取的行数。
  11. read_bytes (UInt64) 读取的字节数。
  12. written_rows (UInt64) 对于插入查询,写入的行数。对于其他查询,值为0
  13. written_bytes (UInt64) 对于插入查询,写入的字节数。对于其他查询,值为0
  14. result_rows (UInt64) 结果中的行数。
  15. result_bytes (UInt64) 结果中的字节数。
  16. memory_usage (UInt64) 查询消耗的内存。
  17. query (String) 查询字符串。
  18. exception (String) 异常信息。
  19. stack_trace (String) 堆栈调用信息(在发生错误之前调用的方法列表)。如果查询成功完成,则为空字符串。
  20. is_initial_query (UInt8) 查询类型。可能的取值:
  21. 1 查询由客户端发起。
  22. 0 查询由另一个查询发起,用于分布式查询执行。
  23. user (String) 发起当前查询的用户的名称。
  24. query_id (String) 查询ID
  25. address (IPv6) 发起查询的IP地址。
  26. port (UInt16) —发起行查询的客户端端口。
  27. initial_user (String) 运行初始查询的用户名(用于分布式查询执行)。
  28. initial_query_id (String) 初始查询的ID(用于分布式查询执行)。
  29. initial_address (IPv6) 启动父查询的IP地址。
  30. initial_port (UInt16) 发起父查询的客户端端口。
  31. interface (UInt8) 发起查询的接口。可能的取值:
  32. 1 TCP
  33. 2 HTTP
  34. os_user (String) 运行clickhouse-client的操作系统的用户名。
  35. client_hostname (String) 运行clickhouse-client或另一个TCP客户端的客户端机器的主机名。
  36. client_name (String) clickhouse-client或另一个TCP客户端名称。
  37. client_revision (UInt32) clickhouse-client或另一个TCP客户端的修订版。
  38. client_version_major (UInt32) lickhouse-client或另一个TCP客户端的主要版本。
  39. client_version_minor (UInt32) lickhouse-client或另一个TCP客户端的小版本。
  40. client_version_patch (UInt32) clickhouse-client或另一个TCP客户端版本的补丁组件。
  41. http_method (UInt8) 发起查询的HTTP方法。可能的取值:
  42. 0 查询是从TCP接口启动的。
  43. 1 使用GET方法。
  44. 2 采用POST方法。
  45. http_user_agent (String) —在HTTP请求中传递的UserAgent请求头。
  46. quota_key (String) 配额设置中指定的配额键。
  47. revision (UInt32) ClickHouse 修订版。
  48. thread_numbers (Array(UInt32)) 参与查询执行的线程数。
  49. ProfileEvents.Names (Array(String)) 测量不同指标的机器数。它们的描述可以在system.events表中找到
  50. ProfileEvents.Values (Array(UInt64)) ProfileEvents.Names 列中列出的指标值。
  51. Settings.Names (Array(String)) 客户端运行查询时更改的设置的名称。要启用对设置的日志记录,将log_query_settings参数设置为1
  52. Settings.Values (Array(String)) Settings.Names列中列出的设置的值。