postgresql логическая репликация не работает после добавления новой таблицы в публикацию - PullRequest
0 голосов
/ 05 марта 2020

Я новичок в postgresql логической репликации. Я провел тестирование, после того как я добавил новую таблицу в публикацию, я обнаружил, что репликация не работает, пока я не создал заново подписку, я уверен, что это не лучшая практика для повторного создания подписки, пожалуйста, посоветуйте, как сделать подписчик применяет транзакции для новой таблицы?

Тестирование, как показано ниже:

  1. Создание первой таблицы на первичной стороне и стороне репликации:

    create table rep_test (a int primary key, b int);
    
  2. Создание публикации на первичной стороне:

    CREATE PUBLICATION rep_test_pub FOR table public.rep_test;
    
  3. Создание подписки на стороне репликации:

    CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket user=XXX password=XXX' PUBLICATION rep_test_pub WITH (copy_data = false);
    
  4. Проверка репликации Репликация работает. Первичная сторона:

    insert into rep_test values (1, 1); insert into rep_test values (2, 1);
    

    Репликация:

    select * from rep_test;
    
    *---*---*
    | a | b |
    *---*---*
    | 1 | 1 |
    | 2 | 1 |
    *---*---*
    
  5. Создание новой таблицы как на первичной стороне, так и на стороне репликации

    create table rep_test (a int primary key, b text);
    
  6. Добавить новую таблицу в публикацию на первичной стороне

    alter publication rep_test_pub add table public.rep_test2;
    
  7. Проверить репликацию, репликация не работает. Основной:

    insert into rep_test values (3, 1); insert into rep_test2 values (1,'text');
    

Репликация:

    select * from rep_test;

    *---*---*
    | a | b |
    *---*---*
    | 1 | 1 |
    | 2 | 1 |
    | 3 | 1 |
    *---*---*

    select * from rep_test2;

Примечание. Нет данных в rep_test2, репликация не реплицируется rep_test2.

Перезагрузка репликации postgres, репликация по-прежнему не работает.

Удаление и повторное создание подписки, репликация работает.

Основной:

truncate table rep_test; truncate table rep_test2;

Репликация:

drop subscription rep_test_sub;
CREATE SUBSCRIPTION rep_test_sub CONNECTION 'host=XXX port=5432 dbname=rocket user=XXX password=XXX' PUBLICATION rep_test_pub WITH (copy_data = false);

Основной:

insert into rep_test values (1, 1); insert into rep_test2 values (1, 'text');

Репликация:

select * from rep_test;select * from rep_test2;

*---*---*
| a | b |
*---*---*
| 1 | 1 |
*---*---*
(1 row)

*---*-----*
| a | b   | 
*---*-----*
| 1 | text|
*---*-----*
(1 row)

Репликация работает после повторного создания подписки.

Не могли бы вы сообщить, есть ли другой способ заставить подписчика применять транзакции к новой таблице?

Кстати, моя версия:

PostgreSQL 12.2 для x86_64-p c - linux -gnu, скомпилировано с помощью g cc (G CC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-разрядная

Спасибо

1 Ответ

1 голос
/ 05 марта 2020

Новая таблица не реплицируется, пока вы не выполните REFRE SH ПУБЛИКАЦИЯ для подписки.

https://www.postgresql.org/docs/current/sql-altersubscription.html

REFRE SH ПУБЛИКАЦИЯ Получить недостающую информацию таблицы от издателя. Это запустит репликацию таблиц, которые были добавлены в подписанные публикации с момента последнего вызова REFRESH PUBLICATION или после CREATE SUBSCRIPTION.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...