Learning Platform
Глоссарий Troubleshooting
Урок 11.04 · 30 мин
Продвинутый
partitionsATTACHDETACHMOVEREPLACEFETCH

Операции с партициями

Партиция в ClickHouse — это логическая группа parts с одинаковым значением ключа партиционирования. Операции на уровне партиций работают с целыми группами parts атомарно, что делает их значительно быстрее поострочных операций и мутаций.


Обзор операций

Операции с партициями: что делает каждая команда
DETACHDETACH PARTITION: физически перемещает файлы партиции из активного хранилища в директорию detached/ на том же диске. Партиция становится невидимой для SELECT. Данные не удалены — можно вернуть через ATTACH. Мгновенная операция (переименование директории).
ATTACHATTACH PARTITION: подключает файлы из detached/ обратно в активную таблицу. Партиция становится видимой в SELECT. Также используется для загрузки партиций, скопированных из другого сервера вручную. Мгновенная операция.
MOVEMOVE PARTITION: атомарно перемещает партицию из одной таблицы в другую таблицу с идентичной схемой и ORDER BY. Физические файлы переименовываются, не копируются. Таблицы должны быть на одном сервере. Используется для архивирования.
REPLACEREPLACE PARTITION: атомарно заменяет партицию в целевой таблице данными из исходной таблицы. Операция без downtime: старая партиция заменяется новой в один шаг. Обе таблицы должны иметь совместимую схему. Используется для обновления исторических данных.
FETCHFETCH PARTITION: загружает партицию с другой реплики через ZooKeeper/Keeper path. Используется при ручном восстановлении реплики или копировании данных между кластерами с ReplicatedMergeTree. Требует доступа к Keeper и к реплике-источнику.
DROPDROP PARTITION: немедленно и безвозвратно удаляет все данные партиции. Самая быстрая операция удаления в ClickHouse — O(1) переименование, без сканирования строк. Для удаления больших объёмов данных за конкретный период: значительно быстрее DELETE и мутаций.

DETACH PARTITION: временное отключение

DETACH PARTITION перемещает файлы партиции в директорию detached/ внутри хранилища таблицы. Партиция перестаёт участвовать в SELECT-запросах, но физически данные остаются на диске.

-- Отключить партицию за январь 2024
ALTER TABLE events DETACH PARTITION '202401';

-- Проверить, что данные ушли в detached/
SELECT partition_id, name, path
FROM system.detached_parts
WHERE table = 'events';
-- Файлы находятся в data/<database>/events/detached/

Типичные сценарии для DETACH:

  • Временное скрытие партиции без удаления (для тестирования)
  • Подготовка партиции к ручному переносу между серверами
  • Изоляция проблемной партиции от SELECT без потери данных

ATTACH PARTITION: повторное подключение

-- Подключить обратно из detached/
ALTER TABLE events ATTACH PARTITION '202401';

-- ATTACH также работает для загрузки данных, скопированных вручную:
-- 1. Скопируйте files в data/<db>/events/detached/my_partition/
-- 2. ALTER TABLE events ATTACH PARTITION '202401'

MOVE PARTITION: перемещение между таблицами

MOVE PARTITION атомарно переносит партицию из одной таблицы в другую. Обе таблицы должны находиться на одном сервере и иметь идентичный ORDER BY.

-- Архивирование: перенести старые данные в archive-таблицу
ALTER TABLE events MOVE PARTITION '202312' TO TABLE events_archive;

-- После MOVE партиция исчезает из events и появляется в events_archive
SELECT count() FROM events WHERE toYYYYMM(event_time) = 202312;   -- 0
SELECT count() FROM events_archive WHERE toYYYYMM(event_time) = 202312;  -- данные здесь
WARNING

MOVE PARTITION требует, чтобы обе таблицы имели идентичный ORDER BY. Если ключи сортировки различаются, операция завершится ошибкой. Это одна из самых частых причин сбоя MOVE PARTITION.


REPLACE PARTITION: атомарная замена данных

REPLACE PARTITION атомарно заменяет содержимое партиции в целевой таблице данными из исходной таблицы. Это атомарная операция без downtime — запросы к целевой таблице не прерываются.

-- Обновить данные за январь 2024 из staging-таблицы
-- (staging_events содержит исправленные данные)
ALTER TABLE events REPLACE PARTITION '202401' FROM staging_events;

-- Атомарность: в момент REPLACE старая партиция заменяется новой мгновенно
-- Запросы видят либо старые данные, либо новые — промежуточного состояния нет

Паттерн использования: ETL-pipeline с промежуточной таблицей. Данные загружаются в staging, трансформируются, затем атомарно заменяют партицию в production-таблице.


FETCH PARTITION: загрузка с реплики

FETCH PARTITION загружает партицию с конкретной реплики через путь в Keeper. Используется при ручном восстановлении реплики или первичном наполнении нового узла.

-- Загрузить партицию '202401' с другой реплики
-- zookeeper_path — путь к таблице в Keeper
ALTER TABLE events
    FETCH PARTITION '202401'
    FROM '/clickhouse/tables/01/db/events';

-- После FETCH партиция попадает в detached/ -- нужно выполнить ATTACH
ALTER TABLE events ATTACH PARTITION '202401';

DROP PARTITION: самый быстрый способ удаления

DROP PARTITION немедленно удаляет все данные партиции. Это O(1) операция: ClickHouse переименовывает директорию parts партиции, делая их невидимыми, и физически удаляет файлы в фоне.

-- Удалить все данные за декабрь 2023
ALTER TABLE events DROP PARTITION '202312';

-- Множественные партиции
ALTER TABLE events DROP PARTITION ID '202310';  -- по partition_id
ALTER TABLE events DROP PARTITION '202311';
TIP

Скорость операций удаления данных:

DROP PARTITION >> lightweight DELETE >> ALTER TABLE DELETE (mutation)

  • DROP PARTITION: мгновенно, O(1), независимо от объёма данных
  • lightweight DELETE: маска над parts, O(parts), данные фильтруются при чтении
  • ALTER TABLE DELETE: полная перезапись затронутых колонок, O(строки * колонки), асинхронно

Если нужно удалить данные за конкретный временной период и таблица партиционирована по времени — DROP PARTITION всегда предпочтительнее.


Практические примеры: проверка через system.parts

-- Перед операциями: посмотреть партиции таблицы
SELECT
    partition,
    partition_id,
    count() AS parts_count,
    sum(rows) AS total_rows,
    formatReadableSize(sum(bytes_on_disk)) AS disk_size
FROM system.parts
WHERE table = 'events'
  AND active
GROUP BY partition, partition_id
ORDER BY partition;

-- После DETACH: партиция видна только в system.detached_parts
SELECT name, partition_id, disk
FROM system.detached_parts
WHERE table = 'events';

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

  1. DETACH PARTITION перемещает файлы в detached/ — партиция скрыта для SELECT, но данные не удалены; ATTACH возвращает её обратно.
  2. MOVE PARTITION переносит партицию между таблицами атомарно; обе таблицы должны иметь идентичный ORDER BY.
  3. REPLACE PARTITION атомарно заменяет данные партиции из исходной таблицы — операция без downtime, запросы не прерываются.
  4. FETCH PARTITION загружает партицию с другой реплики через Keeper; после FETCH нужен ATTACH для активации.
  5. DROP PARTITION — самый быстрый способ удаления: O(1) независимо от объёма. Для bulk-удаления данных за период всегда предпочтительнее мутаций.
Партиционирование в PostgreSQL: RANGE, LIST, HASH и partition pruning ETL-паттерны: загрузка, трансформация и атомарная замена данных

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 4. Таблица events партиционирована по toYYYYMM(event_time). Необходимо удалить все данные за январь 2024 (partition '202401'). Объём данных — 500 ГБ. Какой подход обеспечит наибольшую скорость при минимальной нагрузке на кластер?

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

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

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

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