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

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

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

LOGICAL_REPLICATION_FAIL 1С:Предприятие и СУБД

Логическая репликация в PostgreSQL: Настройка Publication и Subscription

Обновлено: 26.08.2026 · Официальная документация ↗
  • Необходимость переноса или агрегации отдельных таблиц в аналитическое 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';
💡 Практика специалистов: После создания подписки последовательности (SEQUENCES) не синхронизируются в реальном времени. При переключении трафика на новую базу обязательно обновите значения sequence через setval().

Частые вопросы (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).

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