ClickHouse官方文档翻译_操作-工具-系统表

Posted by Lance Lee on Sunday, May 24, 2020

TOC

系统表

系统表用于实现系统的部分功能,并提供对有关系统如何工作的信息的访问。

不能删除系统表(但可以执行DETACH)。

系统表在磁盘上没有数据或元数据的文件。服务器在启动时创建所有系统表。

系统表是只读的。

它们位于 'system' 数据库中。

system.asynchronous_metrics

包含定期在后台计算的指标。例如,正在使用的RAM数量。

列:

  • metric (String) — 指标名称
  • value (Float64) — 指标值

system.clusters

包含有关配置文件中可用的集群及其中的服务器的信息。

列:

  • cluster (String) — 集群名称。
  • shard_num (UInt32) — 集群分片数,从1开始。
  • shard_weight (UInt32) — 写入数据时分片的相对权重。
  • replica_num (UInt32) — 分片的副本编号,从1开始。
  • host_name (String) — 主机名,也可以在配置中指定。
  • host_address (String) — 从DNS获得的主机IP地址。
  • port (UInt16) — 用于连接到服务器的端口。
  • user (String) — 用于连接到服务器的用户。
  • errors_count (UInt32) — 此主机无法到达副本的次数。
  • estimated_recovery_time (UInt32) — 副本错误计数归零剩下的秒数,它被认为是恢复正常。

请注意 errors_count 每个查询集群更新一次,但 estimated_recovery_time 按需重新计算。 所以有可能有这样的情况:非零 errors_count 和零 estimated_recovery_time,下一个查询 errors_count将为零 并尝试使用副本,如果它没有错误。

system.columns

包含有关所有表的列的信息。

可以使用此表获取类似于 DESCRIBE TABLE 查询的信息,但一次可以查询多个表。

system.columns 表包含以下列(列类型显示在括号中):

  • database (String) — 数据库名称。
  • table (String) — 表名。
  • name (String) — 列名。
  • type (String) — 列类型。
  • default_kind (String) — 表达式类型 (DEFAULT, MATERIALIZED, ALIAS),如果没有定义,则为空字符串。
  • default_expression (String) — 表达式, 如果没有定义,则为空字符串。
  • data_compressed_bytes (UInt64) — 压缩数据的大小,以字节为单位。
  • data_uncompressed_bytes (UInt64) — 解压数据的大小,以字节为单位。
  • marks_bytes (UInt64) — 标记的大小,以字节为单位。
  • comment (String) — 列的注释,如果没有定义,则为空字符串。
  • is_in_partition_key (UInt8) — 标志,表明列是否在分区表达式中。
  • is_in_sorting_key (UInt8) — 标志,表明列是否在排序键表达式中。
  • is_in_primary_key (UInt8) — 标志,表明列是否在主键表达式中。
  • is_in_sampling_key (UInt8) — 标志,表明列是否在抽样表达式中。

system.contributors

包含有关贡献者的信息。所有贡献者随机排名。该排名在查询执行时是随机的。

列:

  • name (String) — 贡献者名称,源于Git日志

Example

SELECT * FROM system.contributors LIMIT 10
┌─name─────────────┐
│ Olga Khvostikova │
│ Max Vetrov       │
│ LiuYangkuan      │
│ svladykin        │
│ zamulla          │
│ Šimon Podlipský  │
│ BayoNet          │
│ Ilya Khomutov    │
│ Amy Krishnevsky  │
│ Loud_Scream      │
└──────────────────┘

要在表格中找到你自己,使用查询:

SELECT * FROM system.contributors WHERE name='Olga Khvostikova'
┌─name─────────────┐
│ Olga Khvostikova │
└──────────────────┘

system.databases

这个表包含一个名为“name”的字符串列——数据库的名称。 每个服务器知道的数据库在表中都会相应的进入表中。 这个系统表用于实现 SHOW DATABASES 查询。

system.detached_parts

包含关于 MergeTree 表的已卸载分区的信息。reason 列指定了分区卸载的原因。对于用户卸载的分区,原因是空的。可以用 ALTER TABLE ATTACH PARTITION|PART 命令加载这些分区。有关其他列的描述,参考system.parts。如果分区名称无效,某些列的值可能为NULL。可以使用ALTER TABLE DROP DETACHED PART来删除这些分区。

system.dictionaries

包含外部字典信息。

列:

  • database (String) — 包含由DDL查询创建的字典的数据库的名称。其他字典为空字符串。
  • name (String) — 字典名称。
  • status (Enum8) — 字典状态。可能的值:
    • NOT_LOADED — Dictionary未加载,由于没有被使用。
    • LOADED — 字典加载成功。
    • FAILED — 由于错误,无法加载字典。
    • LOADING — 字典正在加载中。
    • LOADED_AND_RELOADING — 字典加载成功,现在正在重新加载(常见原因:系统重新加载字典查询、超时、字典配置发送变化)。
    • FAILED_AND_RELOADING — 由于错误无法加载字典,现在正在加载。
  • origin (String) — 描述字典的配置文件的路径。
  • type (String) — 字典类型。Flat, Hashed, Cache,将字典存储在内存中。
  • key — Key 类型: 数值Key (UInt64) 或者 复合 key (String) — 取自 “(type 1, type 2, …, type n)”。
  • attribute.names (Array(String)) — 由字典提供的属性名数组。
  • attribute.types (Array(String)) — 由字典提供的对应属性类型数组。
  • bytes_allocated (UInt64) — 分配给字典的内存数量。
  • query_count (UInt64) — 自词典加载或上次成功重新启动以来的查询次数。
  • hit_rate (Float64) — 对于缓存字典,值在缓存中使用的百分比。
  • element_count (UInt64) — 字典表中数据记录数
  • load_factor (Float64) — 在字典中填充的百分比(对于散列字典,是在散列表中填充的百分比)。
  • source (String) — 字典数据源的文本描述。
  • lifetime_min (UInt64) — 字典在内存中的最小生存期,在此之后,ClickHouse尝试重新加载字典(如果设置了invalidate_query,则仅当它发生变化变)。在几秒钟内设置。
  • lifetime_max (UInt64) — 字典在内存中的最小生存期,在此之后,ClickHouse尝试重新加载字典(如果设置了invalidate_query,则仅当它发生变化变)。在几秒钟内设置。
  • loading_start_time (DateTime) — 开始加载字典的时间。
  • last_successful_update_time (DateTime) — 加载或更新字典的时间结束。帮助监控一些外部来源的问题和调查原因。
  • loading_duration (Float32) — 字典加载的持续时间。
  • last_exception (String) — 如果无法创建字典,当创建或重新加载字典时发生错误的文本。

字典使用的内存是提前分配的,与实际字典大小不一定一致。

Example

配置字典。

CREATE DICTIONARY dictdb.dict
(
    `key` Int64 DEFAULT -1,
    `value_default` String DEFAULT 'world',
    `value_expression` String DEFAULT 'xxx' EXPRESSION 'toString(127 * 172)'
)
PRIMARY KEY key
SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'default' TABLE 'dicttbl' DB 'dictdb'))
LIFETIME(MIN 0 MAX 1)
LAYOUT(FLAT())

确保字典已加载。

SELECT * FROM system.dictionaries
┌─database─┬─name─┬─status─┬─origin──────┬─type─┬─key────┬─attribute.names──────────────────────┬─attribute.types─────┬─bytes_allocated─┬─query_count─┬─hit_rate─┬─element_count─┬───────────load_factor─┬─source─────────────────────┬─lifetime_min─┬─lifetime_max─┬──loading_start_time─┌──last_successful_update_time─┬──────loading_duration─┬─last_exception─┐
│ dictdb   │ dict │ LOADED │ dictdb.dict │ Flat │ UInt64 │ ['value_default','value_expression'] │ ['String','String'] │           74032 │           0 │        1 │             1 │ 0.0004887585532746823 │ ClickHouse: dictdb.dicttbl │            0 │            1 │ 2020-03-04 04:17:34 │   2020-03-04 04:30:34        │                 0.002 │                │
└──────────┴──────┴────────┴─────────────┴──────┴────────┴──────────────────────────────────────┴─────────────────────┴─────────────────┴─────────────┴──────────┴───────────────┴───────────────────────┴────────────────────────────┴──────────────┴──────────────┴─────────────────────┴──────────────────────────────┘───────────────────────┴────────────────┘

system.events

包含关于系统中发生的事件数量的信息。例如,在表中,您可以找到自ClickHouse服务器启动以来处理了多少SELECT查询。

列:

  • event (String) — 事件名称
  • value (UInt64) — 事件发生的次数
  • description (String) — 时间描述

Example

SELECT * FROM system.events LIMIT 5
┌─event─────────────────────────────────┬─value─┬─description────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Query                                 │    12 │ Number of queries to be interpreted and potentially executed. Does not include queries that failed to parse or were rejected due to AST size limits, quota limits or limits on the number of simultaneously running queries. May include internal queries initiated by ClickHouse itself. Does not count subqueries.                  │
│ SelectQuery                           │     8 │ Same as Query, but only for SELECT queries.                                                                                                                                                                                                                │
│ FileOpen                              │    73 │ Number of files opened.                                                                                                                                                                                                                                    │
│ ReadBufferFromFileDescriptorRead      │   155 │ Number of reads (read/pread) from a file descriptor. Does not include sockets.                                                                                                                                                                             │
│ ReadBufferFromFileDescriptorReadBytes │  9931 │ Number of bytes read from file descriptors. If the file is compressed, this will show the compressed data size.                                                                                                                                              │
└───────────────────────────────────────┴───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

system.functions

包括普通函数和聚合函数信息。

列:

  • name(String) – 函数名
  • is_aggregate(UInt8) — 是否是聚合函数

system.graphite_retentions

包含有关参数graphite_rollup的信息,这些参数在带有*GraphiteMergeTree引擎的表中使用。

列:

  • config_name (String) - graphite_rollup参数名。
  • regexp (String) - 指标名称的正则表达式。
  • function (String) - 聚合函数名称。
  • age (UInt64) - 数据的最小年龄(以秒为单位)。
  • precision (UInt64) - 如何精确定义数据的年龄(以秒为单位)。
  • priority (UInt16) - 优先级模式。
  • is_default (UInt8) - 模式是否为默认模式。
  • Tables.database (Array(String)) - 使用config_name参数的表的数据库名数组。
  • Tables.table (Array(String)) - 使用config_name参数的表名数组。

system.merges

包含有关目前正在处理MergeTree族表的合并和分区变化的信息。

列:

  • database (String) — 表所在的数据库名称。
  • table (String) — 表名。
  • elapsed (Float64) — 从Merge启动后花费的时间(单位秒)
  • progress (Float64) — 完成工作的百分比,从0到1。
  • num_parts (UInt64) — 要合并的块的数量。
  • result_part_name (String) — 合并结果文件名称。
  • is_mutation (UInt8) - 如果这个过程是分区变化。则是1
  • total_size_bytes_compressed (UInt64) — 合并块中压缩数据的总大小。
  • total_size_marks (UInt64) — 合并区分中的标记总数。
  • bytes_read_uncompressed (UInt64) — 读取的未压缩字节数。
  • rows_read (UInt64) — 读取的行数。
  • bytes_written_uncompressed (UInt64) — 写入的未压缩字节数。
  • rows_written (UInt64) — 写入的行数。

system.metrics

包含可以立即计算或具有当前值的指标。例如,同时处理的查询数或当前副本延迟。这张表总是最新的。

列:

  • metric (String) — 指标名称。
  • value (Int64) — 指标值。
  • description (String) — 指标描述。

可以在Clickhouse的src/Common/CurrentMetrics.cpp源文件中找到支持的指标列表。

Example

SELECT * FROM system.metrics LIMIT 10
┌─metric─────────────────────┬─value─┬─description──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Query                      │     1 │ Number of executing queries                                                                                                                                                                      │
│ Merge                      │     0 │ Number of executing background merges                                                                                                                                                            │
│ PartMutation               │     0 │ Number of mutations (ALTER DELETE/UPDATE)                                                                                                                                                        │
│ ReplicatedFetch            │     0 │ Number of data parts being fetched from replicas                                                                                                                                                │
│ ReplicatedSend             │     0 │ Number of data parts being sent to replicas                                                                                                                                                      │
│ ReplicatedChecks           │     0 │ Number of data parts checking for consistency                                                                                                                                                    │
│ BackgroundPoolTask         │     0 │ Number of active tasks in BackgroundProcessingPool (merges, mutations, fetches, or replication queue bookkeeping)                                                                                │
│ BackgroundSchedulePoolTask │     0 │ Number of active tasks in BackgroundSchedulePool. This pool is used for periodic ReplicatedMergeTree tasks, like cleaning old data parts, altering data parts, replica re-initialization, etc.   │
│ DiskSpaceReservedForMerge  │     0 │ Disk space reserved for currently running background merges. It is slightly more than the total size of currently merging parts.                                                                     │
│ DistributedSend            │     0 │ Number of connections to remote servers sending data that was INSERTed into Distributed tables. Both synchronous and asynchronous mode.                                                          │
└────────────────────────────┴───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

system.metric_log

包括system.metricssystem.events表中的历史指标值,定期刷新到磁盘。创建/etc/clickhouse-server/config.d/metric_log.xml,写入以下内容开启在system.metric_log采集历史指标。

<yandex>
    <metric_log>
        <database>system</database>
        <table>metric_log</table>
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>
        <collect_interval_milliseconds>1000</collect_interval_milliseconds>
    </metric_log>
</yandex>

Example

SELECT * FROM system.metric_log LIMIT 1 FORMAT Vertical;
Row 1:
──────
event_date:                                                 2020-02-18
event_time:                                                 2020-02-18 07:15:33
milliseconds:                                               554
ProfileEvent_Query:                                         0
ProfileEvent_SelectQuery:                                   0
ProfileEvent_InsertQuery:                                   0
ProfileEvent_FileOpen:                                      0
ProfileEvent_Seek:                                          0
ProfileEvent_ReadBufferFromFileDescriptorRead:              1
ProfileEvent_ReadBufferFromFileDescriptorReadFailed:        0
ProfileEvent_ReadBufferFromFileDescriptorReadBytes:         0
ProfileEvent_WriteBufferFromFileDescriptorWrite:            1
ProfileEvent_WriteBufferFromFileDescriptorWriteFailed:      0
ProfileEvent_WriteBufferFromFileDescriptorWriteBytes:       56
...
CurrentMetric_Query:                                        0
CurrentMetric_Merge:                                        0
CurrentMetric_PartMutation:                                 0
CurrentMetric_ReplicatedFetch:                              0
CurrentMetric_ReplicatedSend:                               0
CurrentMetric_ReplicatedChecks:                             0
...

system.numbers

这个表包含一个名为'number'的UInt64列,它包含几乎所有从零开始的自然数。 可以将此表用于测试,或者进行蛮力搜索,也可以使用此表。

对该表的读取不是并行的。

system.numbers_mt

system.numbers相同,但是读取是并行的。这些数字可以以任何顺序返回。

用于测试。

system.one

这个表包含一行只有一个名为dummy的UInt8列,值为0.

这个表用于SELECT查询时没有指定FROM子句。和其他关系型数据库系统中的DUAL表类似。

system.parts

包括MergeTree表的片段信息。

每行描述一个数据片段。

part: 数据片段

列:

  • partition (String) – 分区的名称。要了解分区是什么,参考ALTER查询的描述。格式:
    • YYYYMM 按月自动分区。
    • any_string 当手动分区。
  • name (String) – 数据片段的名称。
  • active (UInt8) – 指示数据片段是否处于激活状态的标志。如果数据片段是激活的,则在表中可以使用它。否则它是被删除状态。未激活的数据片段在合并后仍然存在。
  • marks (UInt64) – 标记的数量。要获得数据片段的大概行数,可以用索引粒度乘以标记(通常是8192)(这个提示不适用于自适应粒度)。
  • rows (UInt64) – 行数。
  • bytes_on_disk (UInt64) – 所有数据片段文件的总大小,单位字节。
  • data_compressed_bytes (UInt64) – 数据片段占用压缩数据的总大小。所有的附属文件不包括在内(例如,标记文件)。
  • data_uncompressed_bytes (UInt64) – 数据片段中未压缩数据的总大小。所有的附属文件不包括在内(例如,标记文件)。
  • marks_bytes (UInt64) – 标记的文件的大小。
  • modification_time (DateTime) – 修改包含数据片段的目录的时间。这通常对应于创建数据部分的时间。
  • remove_time (DateTime) – 数据片段变为非激活状态的时间。
  • refcount (UInt32) – 使用数据片段的位置数量。大于2的值表示数据部分用于查询或合并。
  • min_date (Date) – 数据片段中日期键的最小值。
  • max_date (Date) – 数据片段中日期键的最大值。
  • min_time (DateTime) – 数据片段中日期和时间键的最小值。
  • max_time(DateTime) – 数据片段中日期和时间键的最小值。
  • partition_id (String) – 分区的ID。
  • min_block_number (UInt64) – 合并后组成当前片段的最小数据块编号。
  • max_block_number (UInt64) – 合并后组成当前片段的最大数据块编号。
  • level (UInt32) – 合并树的深度。零意味着当前片段是通过插入创建的,而不是通过合并其他片段创建的。
  • data_version (UInt64) – 用于确定应用于数据片段变化的数字(变化版本高于data_version)。
  • primary_key_bytes_in_memory (UInt64) – 主键值使用的内存量(以字节为单位)。
  • primary_key_bytes_in_memory_allocated (UInt64) – 为主键值保留的内存量(以字节为单位)。
  • is_frozen (UInt8) – 表明存在分区数据备份的标志。1、备份存在。0,备份不存在。更多详细信息,请参考FREEZE PARTITION
  • database (String) – 数据库名称
  • table (String) – 表名
  • engine (String) – 表引擎,没有参数。
  • path (String) – 数据片段文件的文件夹绝对路径。
  • disk (String) – 存储数据部分的磁盘的名称。
  • hash_of_all_files (String) – sipHash128压缩文件。
  • hash_of_uncompressed_files (String) – sipHash128的未压缩文件(带有标记文件、索引文件等)。
  • uncompressed_hash_of_compressed_files (String) – sipHash128压缩文件中的数据,就好像它们是未压缩的一样。
  • bytes (UInt64) – bytes_on_disk别名。
  • marks_size (UInt64) – marks_bytes别名。

system.part_log

system.part_log表只有在指定part_log服务器设置时才会创建

此表包含关于MergeTree family表中数据片段发生的事件的信息,例如添加或合并数据。

system.part_log包括以下列:

  • event_type (Enum) — 数据片段发生的事件的类型。可以是以下值之一:
    • NEW_PART — 插入新的数据片段。
    • MERGE_PARTS — 合并数据片段。
    • DOWNLOAD_PART — 下载数据片段。
    • REMOVE_PART — 使用DETACH PARTITION删除或者卸载数据片段。
    • MUTATE_PART — 数据片段变化。
    • MOVE_PART — 将数据片段从一个磁盘移动到另一个磁盘。
  • event_date (Date) — 事件日期
  • event_time (DateTime) — 事件时间
  • duration_ms (UInt64) — 持续时间。
  • database (String) — 数据片段所在数据库名称
  • table (String) — 数据片段所属表名称
  • part_name (String) — 数据片段名称
  • partition_id (String) — 数据片段插入的分区的ID。如果分区是通过tuple()进行的,则列接受'all'值。
  • rows (UInt64) — 数据片段的行数
  • size_in_bytes (UInt64) — 数据片段的大小,单位为字节
  • merged_from (Array(String)) — 组成当前片段(合并后)的名称数组。
  • bytes_uncompressed (UInt64) — 未压缩大小,单位为字节
  • read_rows (UInt64) — 合并期间读取的行数。
  • read_bytes (UInt64) — 合并期间读取的字节。
  • error (UInt16) — 发生错误的代码号。
  • exception (String) — 发生错误的文本消息。

system.part_log表是在第一次向合并树表插入数据之后创建的。

system.processes

这个系统表用于实现SHOW PROCESSLIST查询。

列:

  • user (String) – 发起查询的用户。请记住,对于分布式处理,查询是在default用户下发送到远程服务器的。字段包含指定查询的用户名,而不是此查询发起的查询的用户名。
  • address (String) – 请求发起的IP地址。分布式处理也是如此。要跟踪分布式查询最初是从哪里发出的,请查看system.processes查询请求者服务器上的进程。
  • elapsed (Float64) – 请求执行开始后的时间(以秒为单位)。
  • rows_read (UInt64) – 从表中读取的行数。对于分布式处理,在请求者服务器上是所有远程服务器的总和。
  • bytes_read (UInt64) – 从表中读取的未压缩字节数。对于分布式处理,在请求者服务器上是所有远程服务器的总和。
  • total_rows_approx (UInt64) – 应该读取的行总数的近似值。对于分布式处理,在请求者服务器上是所有远程服务器的总和。可以在请求处理期间更新,当需要处理的新数据源变得已知时。
  • memory_usage (UInt64) – 请求使用的RAM数量。可能不包括某些类型的专用内存。参考max_memory_usage设置。
  • query (String) – 查询文本。对于INSERT,不包含要插入的数据。
  • query_id (String) – 查询ID(如果已定义)。

system.text_log

包含日志记录。日志级别将进入这个表,可以在可以在服务器设置text_log.level限制。

列:

  • event_date (Date) - 记录的日期。
  • event_time (DateTime) - 记录的时间。
  • microseconds (UInt32) - 记录的微秒。
  • thread_name (String) — 执行日志记录的线程的名称。
  • thread_id (UInt64) — 操作系统线程ID。
  • level (Enum8) - 记录级别。
    • ‘Fatal’ = 1
    • ‘Critical’ = 2
    • ‘Error’ = 3
    • ‘Warning’ = 4
    • ‘Notice’ = 5
    • ‘Information’ = 6
    • ‘Debug’ = 7
    • ‘Trace’ = 8
  • query_id (String) - 查询ID。
  • logger_name (LowCardinality(String)) - 日志记录器的名称(即DDLWorker)
  • message (String) - 消息本身。
  • revision (UInt32) - ClickHouse 修改。
  • source_file (LowCardinality(String)) - 完成日志记录的源文件。
  • source_line (UInt64) - 完成日志记录的源行。

system.query_log

包括查询执行的信息。对于每个查询,可以查看开始处理时间,处理持续时间,错误信息以及其他信息。

Note: 该表不包含用于插入查询的输入数据。

ClickHouse只在指定query_log服务器参数的情况下创建这个表。这个参数设置日志记录规则,如记录时间间隔或将登录查询的表的名称。

启用查询日志记录,请将log_queries参数设置为1。更多详细信息,参考Settings部分。

system.query_log注册了两种查询:

  • 1.由客户端直接运行的初始查询。
  • 2.由其他查询发起的子查询(分布式查询执行)。对于这些类型的查询,有关父查询的信息显示在initial_*列中。

列:

  • type (Enum8) — 执行查询时发生的事件类型。值取自:
    • ‘QueryStart’ = 1 — 查询执行成功开始。
    • ‘QueryFinish’ = 2 — 查询执行成功结束。
    • ‘ExceptionBeforeStart’ = 3 — 在开始执行查询之前发生异常。
    • ‘ExceptionWhileProcessing’ = 4 — 查询执行期间的异常。
  • event_date (Date) — 查询开始日期。
  • event_time (DateTime) — 查询开始时间。
  • query_start_time (DateTime) — 查询执行开始时间。
  • query_duration_ms (UInt64) — 查询执行持续时间。
  • read_rows (UInt64) — 读取的行数。
  • read_bytes (UInt64) — 读取的字节数。
  • written_rows (UInt64) — 对于插入查询,写入的行数。对于其他查询,值为0。
  • written_bytes (UInt64) — 对于插入查询,写入的字节数。对于其他查询,值为0。
  • result_rows (UInt64) — 结果中的行数。
  • result_bytes (UInt64) — 结果中的字节数。
  • memory_usage (UInt64) — 查询消耗的内存。
  • query (String) — 查询字符串。
  • exception (String) — 异常信息。
  • stack_trace (String) — 堆栈调用信息(在发生错误之前调用的方法列表)。如果查询成功完成,则为空字符串。
  • is_initial_query (UInt8) — 查询类型。可能的取值:
    • 1 — 查询由客户端发起。
    • 0 — 查询由另一个查询发起,用于分布式查询执行。
  • user (String) — 发起当前查询的用户的名称。
  • query_id (String) — 查询ID。
  • address (IPv6) — 发起查询的IP地址。
  • port (UInt16) —发起行查询的客户端端口。
  • initial_user (String) — 运行初始查询的用户名(用于分布式查询执行)。
  • initial_query_id (String) — 初始查询的ID(用于分布式查询执行)。
  • initial_address (IPv6) — 启动父查询的IP地址。
  • initial_port (UInt16) — 发起父查询的客户端端口。
  • interface (UInt8) — 发起查询的接口。可能的取值:
    • 1 — TCP.
    • 2 — HTTP.
  • os_user (String) — 运行clickhouse-client的操作系统的用户名。
  • client_hostname (String) — 运行clickhouse-client或另一个TCP客户端的客户端机器的主机名。
  • client_name (String) — clickhouse-client或另一个TCP客户端名称。
  • client_revision (UInt32) — clickhouse-client或另一个TCP客户端的修订版。
  • client_version_major (UInt32) — lickhouse-client或另一个TCP客户端的主要版本。
  • client_version_minor (UInt32) — lickhouse-client或另一个TCP客户端的小版本。
  • client_version_patch (UInt32) — clickhouse-client或另一个TCP客户端版本的补丁组件。
  • http_method (UInt8) — 发起查询的HTTP方法。可能的取值:
    • 0 — 查询是从TCP接口启动的。
    • 1 — 使用GET方法。
    • 2 — 采用POST方法。
  • http_user_agent (String) —在HTTP请求中传递的UserAgent请求头。
  • quota_key (String) — 配额设置中指定的配额键。
  • revision (UInt32) — ClickHouse 修订版。
  • thread_numbers (Array(UInt32)) — 参与查询执行的线程数。
  • ProfileEvents.Names (Array(String)) — 测量不同指标的机器数。它们的描述可以在system.events表中找到
  • ProfileEvents.Values (Array(UInt64)) — 在ProfileEvents.Names 列中列出的指标值。
  • Settings.Names (Array(String)) — 客户端运行查询时更改的设置的名称。要启用对设置的日志记录,将log_query_settings参数设置为1。
  • Settings.Values (Array(String)) —Settings.Names列中列出的设置的值。

每个查询会在query_log表中创建1-2行,取决于查询的状态。 :

  • 如果查询执行成功,将创建两个类型为1和2的事件(参考type列)。
  • 如果查询处理过程中发生错误,将创建两个类型为1和4的事件。
  • 如果查询运行前发生错误,将只创建一个类型为3的事件。

默认情况下,每隔7.5秒向表添加一次日志。可以在query_log服务器设置中设置这个时间间隔(参考flush_interval_milliseconds参数)。要将日志从内存缓冲区强制刷新到表中,可以使用SYSTEM FLUSH LOGS查询。

当手动删除表时,将动态地自动创建该表。注意,所有以前的日志都将被删除。

Note:日志的存储周期是无限的。日志不会自动从表中删除。需要自己组织删除过时的日志。

可以为系统指定任意的system.query_logquery_log服务器设置中的query_log表(参考partition_by参数)。

system.query_thread_log

该表包含关于每个查询执行线程的信息。

ClickHouse只在指定query_thread_log服务器参数的情况下创建这个表。此参数设置日志记录规则,如记录时间间隔或将登录查询的表的名称。

要启用查询日志记录,请将log_query_threads参数设置为1。 有关详细信息,参考Settings部分。

列:

  • event_date (Date) — 线程完成查询执行的日期。
  • event_time (DateTime) — 线程完成查询执行的日期和时间。
  • query_start_time (DateTime) — 查询执行的开始时间。
  • query_duration_ms (UInt64) — 查询执行的持续时间。
  • read_rows (UInt64) — 读取行数。
  • read_bytes (UInt64) — 读取字节数。
  • written_rows (UInt64) — 对于插入查询,写入的行数。对于其他查询列值为0。
  • written_bytes (UInt64) — 对于插入查询,写入的字节数。对于其他查询,值为0。
  • memory_usage (Int64) — 在此线程上下文中分配和释放的内存数量之间的差异。
  • peak_memory_usage (Int64) — 在此线程上下文中分配和释放的内存数量之间的最大差异。
  • thread_name (String) — 线程的名称。
  • thread_number (UInt32) — 内部线程ID。
  • os_thread_id (Int32) — 操作系统线程ID。
  • master_thread_id (UInt64) — OS初始线程的初始ID。
  • query (String) — 查询字符串。
  • is_initial_query (UInt8) — 查询类型。可能的取值:
    • 1 — 查询由客户端发起。
    • 0 — 查询由另一个查询发起,用于分布式查询执行。
  • user (String) — 发起当前查询的用户的名称。
  • query_id (String) — 查询ID。
  • address (IPv6) — 发起查询的IP地址。
  • port (UInt16) — 发起行查询的客户端端口。
  • initial_user (String) — 运行初始查询的用户名(用于分布式查询执行)。
  • initial_query_id (String) — 初始查询的ID(用于分布式查询执行)。
  • initial_address (IPv6) — 启动父查询的IP地址。
  • initial_port (UInt16) — 发起父查询的客户端端口。
  • interface (UInt8) — 发起查询的接口。可能的取值:
    • 1 — TCP.
    • 2 — HTTP.
  • os_user (String) — 运行clickhouse-client的操作系统的用户名。 client_hostname (String) — 运行clickhouse-client或另一个TCP客户端的客户端机器的主机名。
  • client_name (String) — clickhouse-client或另一个TCP客户端名称。
  • client_revision (UInt32) — clickhouse-client或另一个TCP客户端的修订版。
  • client_version_major (UInt32) — lickhouse-client或另一个TCP客户端的主要版本。
  • client_version_minor (UInt32) — lickhouse-client或另一个TCP客户端的小版本。
  • client_version_patch (UInt32) — clickhouse-client或另一个TCP客户端版本的补丁组件。
  • http_method (UInt8) — 发起查询的HTTP方法。可能的取值:
    • 0 — 查询是从TCP接口启动的。
    • 1 — 使用GET方法。
    • 2 — 采用POST方法。
  • http_user_agent (String) —在HTTP请求中传递的UserAgent请求头。
  • quota_key (String) — 配额设置中指定的配额键。
  • revision (UInt32) — ClickHouse 修订版。
  • thread_numbers (Array(UInt32)) — 参与查询执行的线程数。
  • ProfileEvents.Names (Array(String)) — 测量不同指标的机器数。它们的描述可以在system.events表中找到
  • ProfileEvents.Values (Array(UInt64)) — 在ProfileEvents.Names 列中列出的指标值。

默认情况下,每隔7.5秒向表添加一次日志。可以在query_thread_log服务器设置中设置这个时间间隔(参考flush_interval_milliseconds参数)。要将日志从内存缓冲区强制刷新到表中,可以使用系统刷新日志查询。

当手动删除表时,将动态地自动创建该表。注意,所有以前的日志都将被删除。

Note:日志的存储周期是无限的。日志不会自动从表中删除。需要自己组织删除过时的日志。

可以在query_thread_log服务器设置中为system.query_thread_log表指定任意的分区键(参考partition_by参数)。

system.trace_log

包含由抽样查询分析器收集的堆栈调用信息。

ClickHouse只有在trace_log服务器配置配置部分设置时才会创建这个表。还应该设置query_profiler_real_time__nsquery_profiler_cpu_time__ns配置。

要分析日志,请使用addressToLineaddressToSymboldemangle自检功能。

列:

  • event_date (Date) — 采样时刻的日期。
  • event_time (DateTime) — 采样时刻的时间戳。
  • timestamp_ns (UInt64) — 采样时刻的时间戳纳秒。
  • revision (UInt32) — ClickHouse服务器构建修订版。

当通过ClickHouse-client连接到服务器时,可以看到类似于Connected to ClickHouse server version 19.18.1 revision 54429..的字符串。此字段包含revision,但不包含服务器的version

  • timer_type (Enum8) — 时间类型:
    • Real 表示时钟时间。
    • CPU 表示CPU时间。
  • thread_number (UInt32) — 线程标识符。
  • query_id (String) — 查询标识符,可用于获取从query_log系统表查询运行的详细信息。
  • trace (Array(UInt64)) — 抽样时间的堆栈调用跟踪。 每个元素都是ClickHouse服务器进程中的一个虚拟内存地址。

Example

SELECT * FROM system.trace_log LIMIT 1 \G
Row 1:
──────
event_date:    2019-11-15
event_time:    2019-11-15 15:09:38
revision:      54428
timer_type:    Real
thread_number: 48
query_id:      acc4d61f-5bd1-4a3e-bc91-2180be37c915
trace:         [94222141367858,94222152240175,94222152325351,94222152329944,94222152330796,94222151449980,94222144088167,94222151682763,94222144088167,94222151682763,94222144088167,94222144058283,94222144059248,94222091840750,94222091842302,94222091831228,94222189631488,140509950166747,140509942945935]

system.replicas

包含驻留在本地服务器上的副本表的信息和状态。

This table can be used for monitoring. The table contains a row for every Replicated* table. 此表可用于监控。表中每个Replicated*表有一行记录。

Example:

SELECT *
FROM system.replicas
WHERE table = 'visits'
FORMAT Vertical
Row 1:
──────
database:                   merge
table:                      visits
engine:                     ReplicatedCollapsingMergeTree
is_leader:                  1
can_become_leader:          1
is_readonly:                0
is_session_expired:         0
future_parts:               1
parts_to_check:             0
zookeeper_path:             /clickhouse/tables/01-06/visits
replica_name:               example01-06-1.yandex.ru
replica_path:               /clickhouse/tables/01-06/visits/replicas/example01-06-1.yandex.ru
columns_version:            9
queue_size:                 1
inserts_in_queue:           0
merges_in_queue:            1
part_mutations_in_queue:    0
queue_oldest_time:          2020-02-20 08:34:30
inserts_oldest_time:        0000-00-00 00:00:00
merges_oldest_time:         2020-02-20 08:34:30
part_mutations_oldest_time: 0000-00-00 00:00:00
oldest_part_to_get:
oldest_part_to_merge_to:    20200220_20284_20840_7
oldest_part_to_mutate_to:
log_max_index:              596273
log_pointer:                596274
last_queue_update:          2020-02-20 08:34:32
absolute_delay:             0
total_replicas:             2
active_replicas:            2

列为:

  • database (String) - 数据库名称
  • table (String) - 表名
  • engine (String) - 表引擎名
  • is_leader (UInt8) - 副本是否是leader。

每次只能有一个副本成为leader。leader负责选择后台合并执行。注意,可以对ZK中可用且具有会话的任何副本执行写操作,无论它是否是leader。

  • can_become_leader (UInt8) - 副本是否可以被选举为leader。
  • is_readonly (UInt8) - 副本是否是read-only只读模式。

如果配置没有带有ZooKeeper的配置部分,或者如果在ZooKeeper中重新初始会话或在重新初始会话期间发生未知错误,则将打开此模式。

  • is_session_expired (UInt8) - ZooKeeper的会话是否已经过期。基本上与is_readonly相同。
  • future_parts (UInt32) - 由于尚未完成的插入或合并而出现的数据片段的数量。
  • parts_to_check (UInt32) - 队列中用于验证的数据片段的数量。如果怀疑某个片段可能被损坏,则将其放入验证队列中。
  • zookeeper_path (String) - ZooKeeper中表数据库的路径
  • replica_name (String) - ZooKeeper中副本名称。同一表的不同副本具有不同的名称。
  • replica_path (String) - ZooKeeper中副本数据的路径。和连接‘zookeeper_path/replicas/replica_path’相同。
  • columns_version (Int32) - 表结构的版本号。指示执行了多少次ALTER。如果副本有不同的版本,这意味着有些副本还没有完成所有的ALTER
  • queue_size (UInt32) - 等待执行的操作的队列大小。操作包括插入数据块、合并和某些其他操作。它通常与未来的部分一致。
  • inserts_in_queue (UInt32) - 队列中等待插入的数据块的数量。插入通常可以很快地复制。如果这个数字很大,就意味着出了问题。
  • merges_in_queue (UInt32) - 队列中等待进行的合并的数量。有时候合并是很长的,所以这个值可能会在很长一段时间内大于零。
  • part_mutations_in_queue (UInt32) - 队列中等待修改的数据片段数量
  • queue_oldest_time (DateTime) - 如果queue_size大于0,则显示何时将最后的操作添加到队列中。
  • inserts_oldest_time (DateTime) - 参考queue_oldest_time
  • merges_oldest_time (DateTime) - 参考queue_oldest_time
  • part_mutations_oldest_time (DateTime) - 参考queue_oldest_time

接下来的4列只有在使用ZK的活跃会话时才具有非零值。

  • log_max_index (UInt64) - 常规活动日志中的最大条目数。
  • log_pointer (UInt64) - 副本复制到其执行队列的一般活动日志中的最大条目数,加1。如果log_pointerlog_max_index小得多,就说明出了问题。
  • last_queue_update (DateTime) - 上次更新队列的时间。
  • absolute_delay (UInt64) - 当前副本有多大的秒延迟。
  • total_replicas (UInt8) - 此表的已知副本的总数。
  • active_replicas (UInt8) - 在ZooKeeper中具有会话的此表的副本的数量(即,函数副本的数量)。

如果请求所有列,那么该表的工作可能会有点慢,因为每一行都需要从ZooKeeper进行多次读取。

如您没有请求最后4列(log_max_index、log_pointer、total_replicas、active_replicas),那么该表可以快速工作。

例如,你可以像这样检查是否正常工作:

SELECT
    database,
    table,
    is_leader,
    is_readonly,
    is_session_expired,
    future_parts,
    parts_to_check,
    columns_version,
    queue_size,
    inserts_in_queue,
    merges_in_queue,
    log_max_index,
    log_pointer,
    total_replicas,
    active_replicas
FROM system.replicas
WHERE
       is_readonly
    OR is_session_expired
    OR future_parts > 20
    OR parts_to_check > 10
    OR queue_size > 20
    OR inserts_in_queue > 10
    OR log_max_index - log_pointer > 10
    OR total_replicas < 2
    OR active_replicas < total_replicas

如果这个查询没有返回任何东西,这意味着一切正常。

system.settings

包含有关当前用户会话设置的信息。

列为:

  • name (String) — 设置项名称。
  • value (String) — 设置的值。
  • changed (UInt8) — 显示设置是否从其默认值更改。
  • description (String) — 设置项的简单描述。
  • min (Nullable(String)) — 设置的最小值,如果通过约束设置的话。如果设置没有最小值,则为NULL。
  • max (Nullable(String)) — 设置的最小值,如果通过约束设置的话。如果设置没有最小值,则为NULL。
  • readonly (UInt8) — 显示当前用户是否可以更改设置:
    • 0 — 当前用户可以更改设置。
    • 1 — 当前用户无法更改设置。

Example

下面的示例显示如何获取有关名称包含min_i的设置的信息。

SELECT *
FROM system.settings
WHERE name LIKE '%min_i%'
┌─name────────────────────────────────────────┬─value─────┬─changed─┬─description───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─min──┬─max──┬─readonly─┐
│ min_insert_block_size_rows                  │ 1048576   │       0 │ Squash blocks passed to INSERT query to specified size in rows, if blocks are not big enough.                                                                         │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │        0 │
│ min_insert_block_size_bytes                 │ 268435456 │       0 │ Squash blocks passed to INSERT query to specified size in bytes, if blocks are not big enough.                                                                        │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │        0 │
│ read_backoff_min_interval_between_events_ms │ 1000      │       0 │ Settings to reduce the number of threads in case of slow reads. Do not pay attention to the event, if the previous one has passed less than a certain amount of time. │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │        0 │
└─────────────────────────────────────────────┴───────────┴─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────┴──────┴──────────┘

WHERE changed可以很有用,例如,当你想要检查:

  • 配置文件中的设置是否正确加载并正在使用。
  • 在当前会话中更改的设置。
SELECT * FROM system.settings WHERE changed AND name='load_balancing'

system.merge_tree_settings

包括MergeTree表的设置信息。

列:

  • name (String) — 设置项。
  • value (String) — 设置值。
  • description (String) — 设置描述。
  • type (String) — 设置类型(实现特定的字符串值)。
  • changed (UInt8) — 设置是在配置中显式定义的还是显式更改的。

system.table_engines

包含服务器支持的表引擎及其特性支持信息的描述。

该表包含以下列(列类型显示在括号中):

  • name (String) — 表引擎名称
  • supports_settings (UInt8) — 指示表引擎是否支持设置的标志。
  • supports_skipping_indices (UInt8) — 指示表引擎是否支持跳越索引的标志。
  • supports_ttl (UInt8) — 指示表引擎是否支持TTL的标志。
  • supports_sort_order (UInt8) — 指示表引擎是否支持PARTITION_BYPRIMARY_KEYORDER_BYSAMPLE_BY的标志。
  • supports_replication (UInt8) — 指示表引擎是否支持数据复制的标志。
  • supports_duduplication (UInt8) — 指示表引擎是否支持数据重复数据删除的标志。

Example:

SELECT *
FROM system.table_engines
WHERE name in ('Kafka', 'MergeTree', 'ReplicatedCollapsingMergeTree')
┌─name──────────────────────────┬─supports_settings─┬─supports_skipping_indices─┬─supports_sort_order─┬─supports_ttl─┬─supports_replication─┬─supports_deduplication─┐
│ Kafka                         │                 1 │                         0 │                   0 │            0 │                    0 │                      0 │
│ MergeTree                     │                 1 │                         1 │                   1 │            1 │                    0 │                      0 │
│ ReplicatedCollapsingMergeTree │                 1 │                         1 │                   1 │            1 │                    1 │                      1 │
└───────────────────────────────┴───────────────────┴───────────────────────────┴─────────────────────┴──────────────┴──────────────────────┴────────────────────────┘

system.tables

包含服务器已知的每个表的元数据。卸载的表不在system.tables中显示。

该表包含以下列(列类型显示在括号中):

  • database (String) — 表所在的数据库的名称。
  • name (String) — 表名。
  • engine (String) — 表引擎名称(没有参数)。
  • is_temporary (UInt8) - 指示表是否是临时的标志。
  • data_path (String) - 文件系统中表数据的路径。
  • metadata_path (String) - 文件系统中表元数据的路径。
  • metadata_modification_time (DateTime) - 表元数据的最新修改时间。
  • dependencies_database (Array(String)) - 数据库的依赖关系。
  • dependencies_table (Array(String)) - 表依赖关系(MaterializedView表基于当前表)
  • create_table_query (String) - 创建表的查询语句。
  • engine_full (String) - 表引擎的参数。
  • partition_key (String) - 表中指定的分区键表达式。
  • sorting_key (String) - 表中指定的排序键表达式。
  • primary_key (String) - 表中指定的主键表达式。
  • sampling_key (String) - 表中指定的抽样键表达式。
  • storage_policy (String) - 存储策略:
    • MergeTree
    • Distributed
  • total_rows (Nullable(UInt64)) - 总行数,如果能够快速确定表中的准确行数,则为Null(包括下面的Buffer表)。
  • total_bytes (Nullable(UInt64)) - 如果能够快速确定存储上的表的确切字节数,则为总字节数,否则为Null(不包括任何底层存储)。
    • 如果表将数据存储在磁盘上,则返回磁盘上使用的空间(即压缩空间)。
    • 如果表在内存中存储数据,则返回内存中使用的近似字节数。

system.tables表用于SHOW TABLES查询实现。

system.zookeeper

如果不配置ZooKeeper,则该表不存在。允许从配置中定义的ZooKeeper集群读取数据。

查询必须在WHERE子句中有一个“path”等于条件。ZooKeeper中需要获取数据的路径的子节点。

查询SELECT * FROM system.zookeeper WHERE path = '/clickhouse'输出/clickhouse节点上所有子节点的数据。

要输出所有根节点的数据,写path = '/'

如果在“path”中指定的路径不存在,将抛出异常。

列:

  • name (String) — 节点名称。
  • path (String) — 节点的路径。
  • value (String) — 节点的值。
  • dataLength (Int32) — 值的大小。
  • numChildren (Int32) — 子节点的数量。
  • czxid (Int64) — 创建节点的事务的ID。
  • mzxid (Int64) — 最后更改节点的事务的ID。
  • pzxid (Int64) — 最后删除或添加子节点的事务的ID。
  • ctime (DateTime) — 节点创建时间。
  • mtime (DateTime) — 节点最后一次修改的时间。
  • version (Int32) — 节点版本:节点被更改的次数。
  • cversion (Int32) — 添加或删除子节点的数量。
  • aversion (Int32) — ACL的更改次数。
  • ephemeralOwner (Int64) — 对于临时节点,拥有此节点的会话的ID。

Example:

SELECT *
FROM system.zookeeper
WHERE path = '/clickhouse/tables/01-08/visits/replicas'
FORMAT Vertical
Row 1:
──────
name:           example01-08-1.yandex.ru
value:
czxid:          932998691229
mzxid:          932998691229
ctime:          2015-03-27 16:49:51
mtime:          2015-03-27 16:49:51
version:        0
cversion:       47
aversion:       0
ephemeralOwner: 0
dataLength:     0
numChildren:    7
pzxid:          987021031383
path:           /clickhouse/tables/01-08/visits/replicas

Row 2:
──────
name:           example01-08-2.yandex.ru
value:
czxid:          933002738135
mzxid:          933002738135
ctime:          2015-03-27 16:57:01
mtime:          2015-03-27 16:57:01
version:        0
cversion:       37
aversion:       0
ephemeralOwner: 0
dataLength:     0
numChildren:    7
pzxid:          987021252247
path:           /clickhouse/tables/01-08/visits/replicas

system.mutations

该表包含有关MergeTree表的变化及其处理信息。每个变化命令都用一行表示。

该表有以下列:

  • database - 该次变化数据库的名称
  • table - 该次变化表的名称。
  • mutation_id - 变化的ID。对于副本集的表,这些id对应于ZooKeeper中的<table_path_in_zookeeper>/mutations/目录中的znode名称。对于没有副本的表,id对应于表的数据目录中的文件名。
  • command - 命令字符串(ALTER TABLE [db.] TABLE后的查询部分)。
  • create_time - 当提交执行此变化命令的时间。
  • block_numbers.partition_id, block_numbers.number - 一个嵌套列。对于副本表的变化,它为每个分区包含一条记录:由变化 获得的分区ID和数据块编号(在每个分区中,只有包含小于该分区中由变化获得的块号的块的数据片段才会发生变化)。在非复制表中,所有分区中的数据块编号形成一个序列。这意味着对于非复制表的变化,列将包含一条记录,该记录具有变化所获得的单个块号。
  • parts_to_do - 需要为完成变化而进行突变的数据变化的数量。
  • is_done - 变化自行完成了吗?注意,即使parts_to_do = 0,由于长时间运行的插入操作将创建需要进行修改的新的新数据片段,复制表的修改仍然有可能没有完成。

如果某些数据片段出现了变化的问题,下面的列包含了额外的信息:

  • latest_failed_part - 最近不能修改的数据片段的名称。
  • latest_fail_time - 最新数据片段修改失败的时间。
  • latest_fail_reason - 导致最近的数据片段修改失败的异常消息。

system.disks

包含有关服务器配置中定义的磁盘的信息。

列:

  • name (String) — 服务器配置中磁盘的名称。
  • path (String) — 指向文件系统中的挂载点的路径。
  • free_space (UInt64) — 磁盘上的空闲空间(以字节为单位)。
  • total_space (UInt64) — 磁盘容量(以字节为单位)。
  • keep_free_space (UInt64) — 以字节为单位在磁盘上保持空闲的磁盘空间量。在磁盘配置的keep_free_space_bytes参数中定义。

system.storage_policies

包含有关服务器配置中定义的存储策略和卷的信息。

列:

  • policy_name (String) — 存储策略的名称。
  • volume_name (String) — 在存储策略中定义的卷名。
  • volume_priority (UInt64) — 配置中的卷顺序编号。
  • disks (Array(String)) — 磁盘名称,在存储策略中定义。
  • max_data_part_size (UInt64) — 可以存储在卷磁盘上的数据片段的最大大小(0 -无限)。
  • move_factor (Float64) — 空闲磁盘空间的比率。当比率超过配置参数值时,ClickHouse开始按顺序将数据移动到下一个卷。

如果存储策略包含多个卷,则每个卷的信息存储在表的单个行中。

「如果这篇文章对你有用,请支持一下哦」

Attack On Programmer

如果这篇文章对你有用,请支持一下哦

使用微信扫描二维码完成支付