← Все статьи

Переезд на PostgreSQL 18 без даунтайма

· Команда Minetek

Один из наших клиентов держит каталог на ~600 ГБ и не может позволить себе остановку дольше минуты. Классический pg_upgrade требовал бы окна в несколько часов, поэтому мы пошли через логическую репликацию.

План

  1. Поднимаем новый кластер на 18-й версии и переносим схему через pg_dump --schema-only.
  2. Создаём публикацию на старом кластере и подписку на новом.
  3. Ждём, пока догонится начальная синхронизация, и следим за лагом.
  4. Переключаем приложение через PgBouncer и выравниваем последовательности.
CREATE PUBLICATION catalog_pub FOR ALL TABLES;
-- на новом кластере
CREATE SUBSCRIPTION catalog_sub
  CONNECTION 'host=old-db dbname=catalog user=replicator'
  PUBLICATION catalog_pub;

Главная ловушка — последовательности: логическая репликация их не переносит. Мы сняли значения скриптом прямо перед переключением и выставили с запасом в 1000.

Итог: 38 секунд read-only режима и ни одного потерянного заказа.