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

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