PostgreSQL logical replication: подписка на таблицу
Логическая репликация передаёт изменения строк через публикацию и подписку. В отличие от физической репликации, она работает на уровне таблиц и может передавать данные между разными версиями PostgreSQL. На publisher включают wal_level=logical, создают публикацию, а на subscriber — подписку.
Создать публикацию на источнике
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, иначе изменения не смогут найти строку.
Подписаться на изменения
-- На подписчике должна быть таблица с совместимой схемой
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.