Автоматизировать создание секций и их хранение через pg_partman
PostgreSQLСекционированиеКоманда
CREATE SCHEMA partman;
CREATE EXTENSION pg_partman SCHEMA partman;
CREATE TABLE public.measurements (
id bigint GENERATED ALWAYS AS IDENTITY,
ts timestamptz NOT NULL,
value numeric,
PRIMARY KEY (id, ts)
) PARTITION BY RANGE (ts);
-- Daily partitions, pre-create 7 days ahead (pg_partman 5.x syntax)
SELECT partman.create_parent(
p_parent_table := 'public.measurements',
p_control := 'ts',
p_interval := '1 day',
p_premake := 7
);
-- Drop partitions older than 30 days
UPDATE partman.part_config
SET retention = '30 days',
retention_keep_table = false
WHERE parent_table = 'public.measurements';
-- Maintenance: run periodically (schedule with pg_cron or pg_partman_bgw)
CALL partman.run_maintenance_proc();
-- Any rows in the default partition?
SELECT * FROM partman.check_default(p_exact_count := true);Что делает
Регистрирует родительскую таблицу в pg_partman; заранее создаёт будущие секции, удаляет вышедшие за срок хранения и сообщает о строках, попавших в секцию по умолчанию.
Когда использовать
Когда нужна стандартная, наблюдаемая автоматизация вместо ручного управления ежедневными/ежемесячными секциями или собственных скриптов (таблицы журналов, метрик, событий).
Внимание
API изменился между pg_partman 4.x и 5.x: в 5.x p_type принимает только 'range'/'list' (по умолчанию 'range'), а p_type := 'native' из 4.x недопустим; проверьте установленную версию через SELECT extversion FROM pg_extension WHERE extname = 'pg_partman';. create_parent по умолчанию также создаёт секцию по умолчанию. retention_keep_table = false безвозвратно удаляет секции через DROP; если нужен архив, оставьте true и используйте retention_schema. Если run_maintenance_proc() не запланирован, новые секции не создаются и данные попадают в секцию по умолчанию. pg_partman_bgw требует shared_preload_libraries и перезапуска.
Связанные материалы
- Создать таблицу с помесячным range-секционированием (генерация секций в цикле)
- Подключить подготовленную таблицу как секцию с короткой блокировкой (ATTACH PARTITION)
- Отключить старую секцию, не блокируя рабочий трафик (DETACH CONCURRENTLY)
- Ловушка секции по умолчанию: создание новой секции завершается ошибкой 'would be violated by some row'
- Проверить, что работает отсечение секций (partition pruning) на этапе планирования и выполнения