Логическая репликация в PostgreSQL: публикации (Publications) и подписки
- Репликация останавливается с ошибкой:
ERROR: duplicate key value violates unique constraintна стороне подписчика. - Необходимость выборочной репликации отдельных таблиц между разными мажорными версиями PostgreSQL (например, с PG12 на PG16).
- Рост очереди WAL на источнике из-за отставания логического слота.
1. Настройка сервера-издателя (Publisher)
В postgresql.conf установите:
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10systemctl restart postgresqlСоздайте публикацию для целевых таблиц:
-- Публикация конкретных таблиц
CREATE PUBLICATION pub_sales FOR TABLE orders, customers;
-- Или публикация всех таблиц базы данных
-- CREATE PUBLICATION pub_all FOR ALL TABLES;2. Настройка сервера-подписчика (Subscriber)
Создайте аналогичную схему таблиц на стороне приемника и создайте подписку:
CREATE SUBSCRIPTION sub_sales
CONNECTION 'host=192.168.10.10 port=5432 dbname=sales_db user=rep_user password=SecretPassword'
PUBLICATION pub_sales
WITH (copy_data = true, create_slot = true);3. Мониторинг статуса логической репликации
-- На стороне Subscriber:
SELECT subname, pid, received_lsn, last_msg_send_time, last_msg_receipt_time, latest_end_lsn
FROM pg_stat_subscription;
-- На стороне Publisher:
SELECT slot_name, plugin, active, wal_status
FROM pg_replication_slots WHERE slot_type = 'logical';4. Разрешение конфликтов репликации (в PostgreSQL 15+)
-- Пропустить транзакцию, вызвавшую конфликт по LSN
ALTER SUBSCRIPTION sub_sales SKIP (lsn = '0/16B37D8'); Частые вопросы (FAQ)
Реплицируются ли DDL-команды (CREATE TABLE, ALTER TABLE) через логическую репликацию?
Нет. Стандартная логическая репликация PostgreSQL передает только DML-операции (INSERT, UPDATE, DELETE). Структуру таблиц на стороне подписчика необходимо создавать и обновлять вручную.
Что требуется таблице для корректной репликации UPDATE и DELETE?
Таблица должна иметь PRIMARY KEY или явный REPLICA IDENTITY (например, ALTER TABLE orders REPLICA IDENTITY FULL).