ClickHouse Лабораторная №3.0 - CheatSheet

Изменение данных и структуры БД

ОСНОВЫ И ALTER

БЫСТРЫЙ СТАРТ

CREATE DATABASE clickXX ON CLUSTER default; USE clickXX;

ALTER СТОЛБЦЫ

ОперацияКоманда
ДобавитьADD COLUMN col UInt64;
ИзменитьMODIFY COLUMN col String;
УдалитьDROP COLUMN col;
ПереместитьMODIFY COLUMN col AFTER col2;

CODEC И TTL

-- Сжатие MODIFY COLUMN col CODEC(ZSTD(10)); MODIFY COLUMN col REMOVE CODEC; -- TTL MODIFY COLUMN col TTL date_col + INTERVAL 1 YEAR; MODIFY COLUMN col REMOVE TTL;

ПРОВЕРКА КЛАСТЕРА

-- Подключение к кластеру SELECT hostName() FROM clusterAllReplicas('default', system.one); -- Структура на всех узлах SELECT name, type, hostName() FROM clusterAllReplicas('default', system.columns) WHERE database = 'clickXX' AND table = 'table_name';
ПРАВИЛО ON CLUSTER:
✅ ALTER TABLE clickXX.table ON CLUSTER default
❌ ALTER TABLE clickXX.table (только локально)

ПАРТИЦИИ

УПРАВЛЕНИЕ ПАРТИЦИЯМИ

ОперацияКоманда
ОтсоединитьDETACH PARTITION 202101;
Присоединить частьATTACH PART '202101_1_1_0';
Присоединить партициюATTACH PARTITION 202101;
УдалитьDROP PARTITION 202101;

ОПЕРАЦИИ МЕЖДУ ТАБЛИЦАМИ

-- Копировать (исходная остается) ALTER TABLE clickXX.dest_table ATTACH PARTITION 202101 FROM clickXX.source_table; -- Переместить (исходная удаляется) ALTER TABLE clickXX.source_table MOVE PARTITION 202101 TO TABLE clickXX.dest_table;

ПАРТИЦИОНИРОВАНИЕ

-- По год-месяц PARTITION BY toYYYYMM(date_col) -- По году PARTITION BY toYear(date_col) -- По дню PARTITION BY toDate(date_col)

ТЕСТОВЫЕ ДАННЫЕ

INSERT INTO clickXX.table (date_col, id, value) SELECT toDateTime('2018-01-01') + number * 3600, number, rand() % 1000000 FROM numbers(8760); -- год данных

СОЗДАНИЕ ТАБЛИЦЫ

CREATE TABLE clickXX.table ( id UInt64, date_col DateTime, value String ) ENGINE = MergeTree ORDER BY (id, date_col) PARTITION BY toYYYYMM(date_col);

МОНИТОРИНГ И ДИАГНОСТИКА

СИСТЕМНЫЕ ТАБЛИЦЫ

-- Активные части SELECT partition, name, rows, bytes_on_disk FROM system.parts WHERE database = 'clickXX' AND table = 'table_name' AND active = 1; -- Отсоединенные части SELECT * FROM system.detached_parts WHERE database = 'clickXX' AND table = 'table_name'; -- Мутации (ALTER операции) SELECT table, command, is_done, latest_failed_part FROM system.mutations WHERE database = 'clickXX' AND is_done = 0;

АНАЛИЗ РАЗМЕРОВ

-- По партициям SELECT partition, count() AS parts, sum(rows) AS rows, formatReadableSize(sum(bytes_on_disk)) AS size FROM system.parts WHERE database = 'clickXX' AND table = 'table_name' AND active = 1 GROUP BY partition ORDER BY size DESC; -- По таблицам SELECT table, total_rows, formatReadableSize(total_bytes_on_disk) AS size FROM system.tables WHERE database = 'clickXX' ORDER BY total_bytes_on_disk DESC;

РЕШЕНИЕ ПРОБЛЕМ

Ошибка "Tables have different structure"
-- Через промежуточную таблицу CREATE TABLE clickXX.temp AS clickXX.source_table ENGINE = MergeTree...; ALTER TABLE clickXX.source_table MOVE PARTITION 202101 TO TABLE clickXX.temp; ALTER TABLE clickXX.temp DROP COLUMN extra_col; ALTER TABLE clickXX.temp MOVE PARTITION 202101 TO TABLE clickXX.dest_table; DROP TABLE clickXX.temp;

ОЧИСТКА

-- Проверить объекты SELECT name FROM system.tables WHERE database = 'clickXX'; -- Удалить DROP TABLE IF EXISTS clickXX.table1; DROP DATABASE IF EXISTS clickXX;
ВАЖНЫЕ НАПОМИНАНИЯ:
• Замените XX на номер (01, 02, 03...)
• Всегда ON CLUSTER для реплицированных таблиц
• Проверяйте через system.parts и system.mutations
• Используйте database = 'clickXX' в WHERE