Перейти к содержанию

Практикум: переход с pg_partman на pg-partsmith

Во временном контейнере PostgreSQL 17 расширение pg_partman 5.5.0 создаёт и обслуживает месячные партиции events. Затем передаём обслуживание pg-partsmith 1.8.0, сверяя объекты таблиц и данные. Сценарий разобран в статье.

Dockerfile устанавливает pg_partman из исходников с фиксированным тегом v5.5.0, без фонового воркера. Все вызовы обслуживания выполняет сам практикум, поэтому старое задание не может вмешаться в переход. Зависимости Python закреплены через файл соседнего практикума хранения партиций. При копировании примера сохраните оба каталога.

Исходники находятся в docs/blog/lab/2026-09-07-migrating-from-pg-partman. Из этого каталога, с запущенным Docker и установленным uv, выполните:

docker build -t pg-partman-lab:17 .
uv run --no-project --python 3.13 --with-requirements requirements.txt python partman_lab.py

Для сборки образа нужен доступ к репозиториям Debian/PostgreSQL и GitHub. Скрипт проверяет:

  • partman.create_partition работает с закреплённой версией расширения. Границы месяцев отсчитываются от времени PostgreSQL, которым пользуется и pg_partman.
  • automatic_maintenance='off' отключает общее обслуживание, но явный run_maintenance('public.events') всё ещё может создать нужную партицию. Проверка выполняется до перехода.
  • Изучение схемы и построение плана не меняют таблицы. Имена events_p... распознаются по границам; отсоединённые pg_partman таблицы без метки не попадают под удаление.
  • premake = N превращается в CreateAhead(count=N + 1), потому что pg-partsmith считает и текущий месяц; retention = '3 months' в KeepNewest(count=4); retention_keep_table = true в DropNever(). С таким соответствием первый план pg-partsmith пуст.
  • После удаления записи таблицы из part_config даже явный run_maintenance('public.events') ничего не меняет.
  • План на следующий месяц создаёт одну партицию и отсоединяет самую старую, которую сохраняет DropNever(). OID существующих таблиц и все строки сохраняются, следующий план пуст, DEFAULT остаётся пустым.

adoption_flow.py содержит функции настройки и снятия регистрации из статьи; partman_lab.py выполняет проверки. Общие средства запуска БД импортируются из соседнего каталога 2026-09-07-partition-retention.

При переходе реального сервиса сохраните полные настройки и список таблиц, остановите автоматические и явно адресованные задания, дождитесь активных запусков и только затем снимайте регистрацию. Часовой пояс, интервал, шаблоны, DEFAULT, публикации и правила хранения сопоставляйте отдельно. Этот пример ограничен простой месячной таблицей и не является универсальным конвертером настроек.

При успехе скрипт печатает четыре строки PASS и завершается с кодом 0. Контейнер удаляется при выходе; собранный локально Docker-образ остаётся для повторных запусков.