Логическая репликация PostgreSQL

Логическая репликация в отличии от физической копирует не сами данные, а sql выражения эти данные изменяющие.

  1. На мастере в postgresql.conf указать wal_level="logical" после чего перезапустить сервер.
  2. На реплике выполнить следующие команды:
pg_dumpall --database=postgres --host=db.mak-sim.ru --no-password --globals-only --no-privileges | psql
 
pg_dump --dbname db_name --host=db.mak-sim.ru --no-password --create --schema-only | psql

Первая перенесет пользователей и прочие глобальные объекты. Вторая схему данных.

  1. Подключившись на мастере к нужной бд создадим публикацию:
CREATE PUBLICATION db_pub FOR ALL TABLES;
  1. На реплике создадим подписку
CREATE SUBSCRIPTION health_sub CONNECTION 'host=db.mak-sim.ru dbname=health user=postgres password=**** sslmode=require' PUBLICATION db_pub;

Причём health_sub это имя слота на источнике репликации, а значит должно быть уникальным!

Репликация новых таблиц

Если после создания подписки на источнике появились новые таблицы то сначала необходимо создать на приемнике ту же таблицу (DDL), а затем выполнить команду:

ALTER SUBSCRIPTION sub_name REFRESH PUBLICATION;

команду следует выполнить от лица пользователя владельца подписки. Узнать его можно так:

select
	rolname
from 
	pg_authid
where
	oid =
		(select
			pubowner
		from
			pg_publication
		where
			pubname='main');