Базы данных и таблица

Сначала установим уровень журнала 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