Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

PG_LOGICAL_REP_CONFLICT Linux / DevOps

Логическая репликация в PostgreSQL: публикации (Publications) и подписки

Обновлено: 24.08.2026
  • Репликация останавливается с ошибкой: 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 = 10
systemctl 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');
💡 Практика специалистов: Следите за параметром copy_data = true при создании подписки на больших таблицах. Начальная выгрузка создает длительную нагрузку на Publisher и держит транзакцию открытой.

Частые вопросы (FAQ)

Реплицируются ли DDL-команды (CREATE TABLE, ALTER TABLE) через логическую репликацию?

Нет. Стандартная логическая репликация PostgreSQL передает только DML-операции (INSERT, UPDATE, DELETE). Структуру таблиц на стороне подписчика необходимо создавать и обновлять вручную.

Что требуется таблице для корректной репликации UPDATE и DELETE?

Таблица должна иметь PRIMARY KEY или явный REPLICA IDENTITY (например, ALTER TABLE orders REPLICA IDENTITY FULL).

Полезные материалы
Рекомендуем