Системные таблицы: полная карта диагностики
ClickHouse предоставляет богатую систему самодиагностики через system.* таблицы. Каждая из них отвечает на конкретный диагностический вопрос: “Какой запрос потребил 20 GB RAM час назад?”, “Почему replication lag растёт?”, “Какой merge сейчас активен?” Знание восьми ключевых системных таблиц — основа work-flow production-инженера.
Для подробного анализа system.query_log (ProfileEvents, normalizedQueryHash, кластерный анализ) см. Модуль 12, урок 02. Этот урок охватывает все восемь диагностических таблиц обзорно.
Карта системных таблиц
Без фильтра 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 содержит причину блокировки.
Ключевые выводы
system.processes— источник истины для real-time мониторинга. Используйте его, когда нужно немедленно узнать, что происходит на сервере прямо сейчас.system.query_logсWHERE type='QueryFinish'— главный инструмент ретроспективного анализа. Всегда фильтруйте поtype, иначе получите дублирующиеQueryStart-записи.system.replicas— первая таблица для проверки при жалобах на “старые данные”.absolute_delay > 60иis_readonly = 1— признаки проблемы репликации.system.merges— показывает активные фоновые операции с прогрессом. Еслиprogressне движется минутами — возможна проблема с merge-очередью.system.mutationsсWHERE is_done = 0— поиск застрявших ALTER TABLE UPDATE/DELETE.latest_fail_reasonраскрывает причину блокировки.