Логическая репликация в PostgreSQL: Настройка Publication и Subscription
- Необходимость переноса или агрегации отдельных таблиц в аналитическое DWH-хранилище.
- Миграция базы данных на новую мажорную версию PostgreSQL с околонулевым Downtime.
- Ошибки репликации из-за отсутствия первичных ключей
REPLICA IDENTITYна целевых таблицах.
1. Настройка источника (Publisher) в postgresql.conf
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10Перезапустите СУБД и создайте публикацию таблиц:
-- Публикация конкретных таблиц
CREATE PUBLICATION pub_sales FOR TABLE orders, order_items;
-- Либо публикация всех таблиц базы данных
-- CREATE PUBLICATION pub_all_tables FOR ALL TABLES;2. Подготовка схемы на приемнике (Subscriber)
Логическая репликация не реплицирует DDL. Создайте структуру таблиц на сервере-приемнике вручную:
CREATE TABLE orders (id BIGINT PRIMARY KEY, customer_id INT, amount NUMERIC(10,2), created_at TIMESTAMPTZ);
CREATE TABLE order_items (id BIGINT PRIMARY KEY, order_id BIGINT, product_id INT, quantity INT);3. Создание подписки на сервере-приемнике
CREATE SUBSCRIPTION sub_sales
CONNECTION 'host=192.168.10.50 port=5432 dbname=production user=replicator password=Secret'
PUBLICATION pub_sales
WITH (copy_data = true, create_slot = true);4. Проверка и траблшутинг состояния подписки
На стороне подписчика проверьте статус воркеров:
SELECT subname, pid, received_lsn, last_msg_send_time, latest_end_time
FROM pg_stat_subscription;На стороне источника проверьте состояние слота логической репликации:
SELECT slot_name, plugin, active, confirmed_flush_lsn
FROM pg_replication_slots
WHERE slot_type = 'logical'; Частые вопросы (FAQ)
Почему логическая репликация падает при изменении схемы (ALTER TABLE)?
Логическая репликация передает только DML-события (INSERT, UPDATE, DELETE). DDL команды не реплицируются автоматически и должны применяться на подписчике синхронно вручную.
Что такое REPLICA IDENTITY и зачем оно нужно?
Для выполнения UPDATE и DELETE логический декодер должен однозначно найти строку на подписчике. По умолчанию используется PRIMARY KEY. Если его нет, требуется выполнить ALTER TABLE t REPLICA IDENTITY FULL;, что замедлит работу.
Можно ли реплицировать данные между разными версиями PostgreSQL (например, с 12 на 16)?
Да, это ключевое преимущество логической репликации: она полностью совместима между разными мажорными версиями и операционными системами.
Что делать при возникновении конфликта первичного ключа (duplicate key) на подписчике?
Подписка остановится с ошибкой в логах. Необходимо либо удалить дубликат на приемнике, либо временно пропустить транзакцию с помощью ALTER SUBSCRIPTION sub_name SKIP (LSN).