Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 15.01 · 30 мин
Продвинутый
system tablesquery_logpart_logmergesreplicasprocessesmetricsmutationsdistribution_queue

Системные таблицы: полная карта диагностики

ClickHouse предоставляет богатую систему самодиагностики через system.* таблицы. Каждая из них отвечает на конкретный диагностический вопрос: “Какой запрос потребил 20 GB RAM час назад?”, “Почему replication lag растёт?”, “Какой merge сейчас активен?” Знание восьми ключевых системных таблиц — основа work-flow production-инженера.

INFO

Для подробного анализа system.query_log (ProfileEvents, normalizedQueryHash, кластерный анализ) см. Модуль 12, урок 02. Этот урок охватывает все восемь диагностических таблиц обзорно.


Карта системных таблиц

Системные таблицы ClickHouse: карта диагностики
query_logsystem.query_log: история всех выполненных запросов. Содержит type (QueryStart/QueryFinish/Exception), memory_usage, read_rows, read_bytes, query_duration_ms, ProfileEvents, normalizedQueryHash. Требует WHERE type='QueryFinish' для исключения дублей. Основной инструмент постфактум-анализа производительности.
part_logsystem.part_log: журнал событий с частями MergeTree. Фиксирует MERGE_PARTS (завершение merge), DOWNLOAD_PART (скачивание реплики), REMOVE_PART (удаление части). Полезен для диагностики проблем с merge-очередью и репликацией.
mergessystem.merges: активные merge-операции прямо сейчас. Показывает прогресс в процентах (progress), тип (MERGE_PARTS / MUTATE_PART / MOVE_PART), имена таблиц и elapsed время. Позволяет понять, что именно происходит в фоне в данный момент.
replicassystem.replicas: состояние репликации для всех ReplicatedMergeTree таблиц. Ключевые поля: is_readonly (таблица в режиме только чтения), absolute_delay (секунды отставания от лидера), last_queue_update, queue_size. Первое место для диагностики replication lag.
processessystem.processes: живые запросы прямо сейчас (аналог SHOW PROCESSLIST). Быстрее чем query_log для real-time мониторинга — не нужно ждать завершения запроса. Поля: query_id, user, elapsed, memory_usage, query. Источник для KILL QUERY.
metricssystem.metrics: текущие счётчики состояния сервера (~200 метрик). Мгновенные значения: Merge, BackgroundPoolTask, Query, Connection. Не накапливается, сбрасывается при перезапуске. Удобен для экспорта в Prometheus через expose_metrics.
mutationssystem.mutations: фоновые мутации (ALTER TABLE UPDATE/DELETE). Поля: is_done, parts_to_do, parts_to_do_names, latest_fail_reason. Позволяет отслеживать прогресс ALTER TABLE и находить застрявшие мутации.
distribution_queuesystem.distribution_queue: очередь асинхронных вставок в Distributed-таблицы. Показывает pending файлы (data_files), bytes_inserted, last_exception. Диагностика задержек при async_insert=1 или при недоступности шардов.
WARNING

Без фильтра WHERE type = 'QueryFinish' таблица query_log содержит дублирующие записи QueryStart — всегда фильтруйте по type. Каждый запрос создаёт минимум 2 записи: QueryStart и QueryFinish. COUNT(*) без фильтра будет в 2-4 раза больше ожидаемого.


system.query_log: анализ тяжёлых запросов

Основной инструмент ретроспективного анализа. Требует log_queries = 1 (включено по умолчанию).

-- Топ-10 запросов за последний час по использованию памяти
SELECT
    query_id,
    user,
    query_duration_ms,
    formatReadableSize(memory_usage) AS mem_human,
    read_rows,
    read_bytes,
    normalizedQueryHash(query) AS query_hash,
    substring(query, 1, 100) AS query_preview
FROM system.query_log
WHERE type = 'QueryFinish'
  AND event_time >= now() - INTERVAL 1 HOUR
ORDER BY memory_usage DESC
LIMIT 10
FORMAT PrettyCompact;

system.part_log: события с частями

Фиксирует события жизненного цикла частей MergeTree. Полезен для диагностики аномалий merge.

-- Последние события с частями за 30 минут
SELECT
    event_time,
    event_type,
    table,
    part_name,
    rows,
    size_in_bytes
FROM system.part_log
WHERE event_time >= now() - INTERVAL 30 MINUTE
  AND event_type IN ('MERGE_PARTS', 'DOWNLOAD_PART', 'REMOVE_PART')
ORDER BY event_time DESC
LIMIT 20
FORMAT PrettyCompact;

Типы событий: MERGE_PARTS — завершение merge, DOWNLOAD_PART — скачивание с реплики, REMOVE_PART — удаление устаревшей части.


system.merges: активные merge-операции

Показывает текущие фоновые операции с частями. В отличие от part_log, содержит только активные (незавершённые) операции.

-- Активные merge с прогрессом
SELECT
    database,
    table,
    elapsed,
    progress,
    num_parts,
    result_part_name,
    merge_type
FROM system.merges
ORDER BY elapsed DESC
FORMAT PrettyCompact;

Поле progress (0.0–1.0) показывает процент завершения. merge_type может быть REGULAR (обычный merge), TTL_DELETE (TTL очистка) или TTL_RECOMPRESS (перекодировка при смене кодека).


system.replicas: состояние репликации

Первое место для диагностики проблем с репликацией ReplicatedMergeTree.

-- Таблицы с ненулевым replication lag
SELECT
    database,
    table,
    is_readonly,
    absolute_delay,
    queue_size,
    inserts_in_queue,
    merges_in_queue,
    last_queue_update
FROM system.replicas
WHERE absolute_delay > 0
   OR is_readonly = 1
ORDER BY absolute_delay DESC
FORMAT PrettyCompact;

absolute_delay — отставание в секундах от самой свежей реплики. Значение выше 60 секунд — признак проблемы.


system.processes: живые запросы

Аналог SHOW PROCESSLIST. Быстрее query_log для real-time мониторинга: данные доступны немедленно, не нужно ждать завершения запроса.

-- Текущие активные запросы дольше 5 секунд
SELECT
    query_id,
    user,
    elapsed,
    formatReadableSize(memory_usage) AS memory,
    read_rows,
    substring(query, 1, 100) AS query_preview
FROM system.processes
WHERE elapsed > 5
ORDER BY elapsed DESC
FORMAT PrettyCompact;

query_id из этой таблицы используется для KILL QUERY WHERE query_id = '...'.


system.metrics: текущие счётчики

Около 200 мгновенных счётчиков состояния сервера. Не хранит историю — только текущий момент.

-- Ключевые метрики активности сервера
SELECT
    metric,
    value,
    description
FROM system.metrics
WHERE metric IN (
    'Query',
    'Merge',
    'BackgroundPoolTask',
    'MemoryTracking',
    'TCPConnection',
    'HTTPConnection'
)
ORDER BY metric
FORMAT PrettyCompact;

Query — число активных запросов, Merge — активных фоновых merge, MemoryTracking — суммарная отслеживаемая память в байтах.


system.mutations: фоновые мутации

Отслеживает ALTER TABLE ... UPDATE/DELETE операции (mutations). Мутации выполняются в фоне, переписывая части.

-- Незавершённые мутации (pending)
SELECT
    database,
    table,
    mutation_id,
    command,
    create_time,
    parts_to_do,
    is_done,
    latest_fail_reason
FROM system.mutations
WHERE is_done = 0
ORDER BY create_time
FORMAT PrettyCompact;

parts_to_do — сколько частей осталось переписать. latest_fail_reason — причина последней ошибки, если мутация застряла.


system.distribution_queue: очередь Distributed

Диагностика асинхронных вставок через Distributed-таблицы.

-- Очередь асинхронных вставок по шардам
SELECT
    database,
    table,
    data_path,
    is_blocked,
    error_count,
    data_files,
    data_compressed_bytes,
    last_exception
FROM system.distribution_queue
WHERE data_files > 0
   OR is_blocked = 1
ORDER BY error_count DESC
FORMAT PrettyCompact;

is_blocked = 1 означает, что очередь заблокирована (шард недоступен). last_exception содержит причину блокировки.


Ключевые выводы

  1. system.processes — источник истины для real-time мониторинга. Используйте его, когда нужно немедленно узнать, что происходит на сервере прямо сейчас.
  2. system.query_log с WHERE type='QueryFinish' — главный инструмент ретроспективного анализа. Всегда фильтруйте по type, иначе получите дублирующие QueryStart-записи.
  3. system.replicas — первая таблица для проверки при жалобах на “старые данные”. absolute_delay > 60 и is_readonly = 1 — признаки проблемы репликации.
  4. system.merges — показывает активные фоновые операции с прогрессом. Если progress не движется минутами — возможна проблема с merge-очередью.
  5. system.mutations с WHERE is_done = 0 — поиск застрявших ALTER TABLE UPDATE/DELETE. latest_fail_reason раскрывает причину блокировки.
Observability в data pipelines: метрики, логи и диагностика Мониторинг блокировок в PostgreSQL: pg_stat_activity и pg_locks

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 12