Практикум: хранение партиций и проверка архива¶
Пример сервиса аналитики из статьи об обслуживании партиций работает во временной БД PostgreSQL 17. Используются Python 3.13 и pg-partsmith 1.8.0; зависимости Python закреплены в requirements.txt.
План строится на 15 сентября 2026 года: сохраняем июль–сентябрь, готовим октябрь и ноябрь, удаляем старые таблицы через семь дней после отсоединения. Квитанция ссылается на майское событие. Дополнительно есть двухмесячная партиция с обманчивым месячным именем и отдельная таблица без метки библиотеки, имя которой не совпадает с месячной схемой.
Исходники находятся в docs/blog/lab/2026-09-07-partition-retention. Перейдите в этот каталог, запустите Docker и выполните команду с установленным uv:
Скрипт проверяет:
- Построение плана не меняет каталог. План проходит сохранение и чтение JSON; изменение политики приводит к отказу до DDL.
- Октябрь и ноябрь создаются. Апрель и июнь отсоединяются, сохраняя строки. Вставка за октябрь проходит, запоздалая запись за апрель без DEFAULT отклоняется.
Unreferenced()сохраняет май. Без этого условия PostgreSQL сам запрещает отсоединение: в результате одновременно естьsuccess=Trueи ошибка вissues, квитанция остаётся целой.- Пока один воркер держит advisory lock таблицы, второй, с отдельным engine, пропускает запуск и ничего не меняет. После освобождения блокировка снова доступна.
- До истечения семи дней удалений нет. Ошибка обработчика архива или неверное содержимое существующего файла останавливают удаление; обработчик также отказывается работать с таблицей, OID которой не совпадает с планом.
- Повторный запуск удаляет апрель и июнь только после записи и чтения JSON. Все четыре строки восстанавливаются во временную таблицу и сравниваются с исходными.
- После удаления квитанции майская таблица, созданная вручную, подходит под отсоединение. Двухмесячная партиция и отдельная таблица без метки сохраняются.
maintenance_flow.py содержит точные примеры политики, плана, архивирования и запуска по расписанию из обеих версий статьи. lab_support.py создаёт временную БД и предоставляет общие проверки. retention_lab.py выполняет сценарий.
Чтобы не ждать неделю, скрипт передаёт будущий момент через аргумент планирования now и применяет только удаления из полученного плана. Семидневное правило не меняется. Проверка конкурирующего запуска вызывает настоящий API планировщика под уже занятой блокировкой, поэтому не изменяет данные с фиксированными датами.
JSON-архив локальный, временный и маленький: пример читает таблицу целиком в память. Каталог удаляется после проверки восстановления. Это пример обработчика и повторного запуска, а не постоянное резервное хранилище. Приложение не должно напрямую менять отсоединённые таблицы между экспортом и удалением. Для рабочего архива нужны надёжное хранилище, потоковый экспорт больших таблиц и свои проверки восстановления.
Предупреждения в журнале ожидаемы: они относятся к намеренным ошибкам внешнего ключа, блокировки и архива. При успехе все строки начинаются с PASS, а код завершения равен 0. Контейнер и каталог архива удаляются при выходе.