Сначала установим уровень журнала logical.
student$ psql -U postgres -c "ALTER SYSTEM SET wal_level = logical"
ALTER SYSTEM
student$ sudo pg_ctlcluster 10 alpha restart
Базы данных:
student$ psql
α=> CREATE DATABASE replica_logical_1;
CREATE DATABASE
α=> CREATE DATABASE replica_logical_2;
CREATE DATABASE
Таблица в первой базе:
α=> \c replica_logical_1
You are now connected to database "replica_logical_1" as user "student".
α=> CREATE TABLE test(id serial PRIMARY KEY, descr text);
CREATE TABLE
α=> INSERT INTO test(descr) VALUES ('Раз'), ('Два'), ('Три');
INSERT 0 3
Воспользоваться логической резервной копией особенно удобно, когда таблиц много.
student$ pg_dump --schema-only replica_logical_1 | psql -d replica_logical_2
SET SET SET SET SET set_config ------------ (1 row) SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql SET SET CREATE TABLE ALTER TABLE CREATE SEQUENCE ALTER TABLE ALTER SEQUENCE ALTER TABLE ALTER TABLE
Переносить данные с помощью pg_dump не имеет смысла, поскольку в процессе переноса таблицы могут измениться.
student$ psql -d replica_logical_2
α=> \d test;
Table "public.test" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+---------------------------------- id | integer | | not null | nextval('test_id_seq'::regclass) descr | text | | | Indexes: "test_pkey" PRIMARY KEY, btree (id)
Публикация:
α=> CREATE PUBLICATION test_pub FOR TABLE test;
CREATE PUBLICATION
Поскольку репликация будет настроена на одном и том же сервере, вначале вручную создаем слот логической репликации.
α=> SELECT pg_create_logical_replication_slot('testslot','pgoutput');
pg_create_logical_replication_slot ------------------------------------ (testslot,0/1E05955C) (1 row)
И затем создаем подписку:
α=> \c - postgres
You are now connected to database "replica_logical_2" as user "postgres".
α=> CREATE SUBSCRIPTION test_sub CONNECTION 'user=student dbname=replica_logical_1' PUBLICATION test_pub WITH (create_slot = false, slot_name = testslot);
CREATE SUBSCRIPTION
α=> INSERT INTO test(descr) VALUES ('Четыре');
INSERT 0 1
α=> SELECT * FROM test;
id | descr ----+-------- 1 | Раз 2 | Два 3 | Три 4 | Четыре (4 rows)
α=> DROP SUBSCRIPTION test_sub;
NOTICE: dropped replication slot "testslot" on publisher DROP SUBSCRIPTION