Я новичок в postgresql логической репликации. Я провел тестирование, после того как я добавил новую таблицу в публикацию, я обнаружил, что репликация не работает, пока я не создал заново подписку, я уверен, что это не лучшая практика для повторного создания подписки, пожалуйста, посоветуйте, как сделать подписчик применяет транзакции для новой таблицы?
Тестирование, как показано ниже:
Создание первой таблицы на первичной стороне и стороне репликации:
create table rep_test (a int primary key, b int);
Создание публикации на первичной стороне:
CREATE PUBLICATION rep_test_pub FOR table public.rep_test;
Создание подписки на стороне репликации:
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_test values (2, 1);
Репликация:
select * from rep_test;
*---*---*
| a | b |
*---*---*
| 1 | 1 |
| 2 | 1 |
*---*---*
Создание новой таблицы как на первичной стороне, так и на стороне репликации
create table rep_test (a int primary key, b text);
Добавить новую таблицу в публикацию на первичной стороне
alter publication rep_test_pub add table public.rep_test2;
Проверить репликацию, репликация не работает. Основной:
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-разрядная
Спасибо