Логическая репликация PostgreSQL
Логическая репликация в отличии от физической копирует не сами данные, а sql выражения эти данные изменяющие.
- На мастере в
postgresql.conf
указатьwal_level="logical"
после чего перезапустить сервер. - На реплике выполнить следующие команды:
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
Первая перенесет пользователей и прочие глобальные объекты. Вторая схему данных.
- Подключившись на мастере к нужной бд создадим публикацию:
CREATE PUBLICATION db_pub FOR ALL TABLES;
- На реплике создадим подписку
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');