PostgreSQL logical replication: подписка на таблицу

Категория: Postgresql · Язык: SQL · Обновлено:

Логическая репликация передаёт изменения строк через публикацию и подписку. В отличие от физической репликации, она работает на уровне таблиц и может передавать данные между разными версиями PostgreSQL. На publisher включают wal_level=logical, создают публикацию, а на subscriber — подписку.

Создать публикацию на источнике

SQL
ALTER SYSTEM SET wal_level = 'logical';
-- Перезапустите PostgreSQL, чтобы параметр применился

CREATE PUBLICATION app_pub FOR TABLE orders;

SELECT pubname, schemaname, tablename
FROM pg_publication_tables
WHERE pubname = 'app_pub';

ALTER SYSTEM записывает параметр в postgresql.auto.conf; без перезапуска wal_level не изменится. Публикация может включать все таблицы (FOR ALL TABLES), схему или конкретный список. Для UPDATE и DELETE у таблицы нужен первичный ключ или явный REPLICA IDENTITY, иначе изменения не смогут найти строку.

Подписаться на изменения

SQL
-- На подписчике должна быть таблица с совместимой схемой
CREATE TABLE orders (
    id integer PRIMARY KEY,
    total numeric(10, 2) NOT NULL
);

CREATE SUBSCRIPTION app_sub
CONNECTION 'host=publisher port=5432 dbname=app user=repl passfile=/var/lib/postgresql/.pgpass'
PUBLICATION app_pub;

CREATE SUBSCRIPTION по умолчанию копирует существующие данные и создаёт слот репликации на источнике. Пароль не храните в тексте подписки: используйте .pgpass с правами 600 или сервисный файл. Для защищённого соединения добавьте sslmode=verify-full и проверьте сертификат.

Последовательности, DDL и глобальные объекты не реплицируются. После добавления таблицы в публикацию выполните ALTER SUBSCRIPTION ... REFRESH PUBLICATION. Конфликт уникального ключа или отсутствующая строка останавливают apply-процесс; смотрите pg_stat_subscription и pg_replication_slots, устраняйте расхождение вручную.

Перед удалением подписки выполните ALTER SUBSCRIPTION app_sub DISABLE; и только затем DROP SUBSCRIPTION, иначе слот может остаться и удерживать WAL. Следите за задержкой и размером слота: неактивный слот на publisher приводит к росту WAL и заполнению диска.

Документация: logical replication, CREATE SUBSCRIPTION.