powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Репликация в таблицу с данными
7 сообщений из 7, страница 1 из 1
Репликация в таблицу с данными
    #39940229
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 2 абсолютно одинаковые по структуре таблицы
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE public.test
(
    id serial4,
    title varchar(50),
    CONSTRAINT pk_test PRIMARY KEY (id)
)



Данные тоже почти одни и те же. Я настроил репликацию из одной таблицы в другую. Но она не работает.
Весь лог заполнен записями вида:
Код: plsql
1.
Key (id)=(1) already exists.


Почему репликация пытается вставить в целевую таблицу [видимо] все строки из таблицы источника вместо того, чтобы попытаться ее обновить?

Репликацию настраивал так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
--source
CREATE PUBLICATION pub_test FOR TABLE 
public.test;

SELECT pg_create_logical_replication_slot('test_rep_slot', 'pgoutput');

--target
CREATE SUBSCRIPTION sub_test
CONNECTION 'host=localhost dbname=source_db user=postgres password=***' 
PUBLICATION pub_test  with(create_slot=false, slot_name='test_rep_slot'); 

--проставил в настройках сервера wal_level = logical
...
Рейтинг: 0 / 0
Репликация в таблицу с данными
    #39940251
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович
Почему репликация пытается вставить в целевую таблицу [видимо] все строки из таблицы источника вместо того, чтобы попытаться ее обновить?

А почему должны обновлять?
...
Рейтинг: 0 / 0
Репликация в таблицу с данными
    #39940257
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если целевую таблицу очистить, а потом запустить репликацию, то целевая заполниться данными
и при изменении источника(любом) будет соответствующим образом меняться подписчик(по умолчанию используя для этого PK).

Можно ли добиться такого поведения(синхронизации) сразу в том случае, если в целевой таблице изначально есть данные?
...
Рейтинг: 0 / 0
Репликация в таблицу с данными
    #39940259
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович,
Код: sql
1.
CREATE SUBSCRIPTION sub_test ... WITH (copy_data = false);
...
Рейтинг: 0 / 0
Репликация в таблицу с данными
    #39940267
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов
Шамиль Фаридович,
Код: sql
1.
CREATE SUBSCRIPTION sub_test ... WITH (copy_data = false);


Перечитал вопрос.
WITH (copy_data = false) поможет только в случае, если данные уже синхронизированы на момент создания подписки.
Если данные отличаются, то либо вручную синхронизировать, либо очищать целевую таблицу и "заливать" с нуля.
...
Рейтинг: 0 / 0
Репликация в таблицу с данными
    #39940277
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович
Если целевую таблицу очистить, а потом запустить репликацию, то целевая заполниться данными
и при изменении источника(любом) будет соответствующим образом меняться подписчик(по умолчанию используя для этого PK).

Вы это проверили?
- подписчик на своей стороне делает insert
- источник делает insert в таблицу
- подписчик реплицирует этот insert
...
Рейтинг: 0 / 0
Репликация в таблицу с данными
    #39940413
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов,
Код: sql
1.
copy_data = false


Спасибо, как раз то, что было нужно
+ немного вручную синхронизировать

Код: plsql
1.
2.
3.
- подписчик на своей стороне делает insert
- источник делает insert в таблицу
- подписчик реплицирует этот insert


Именно такой сценарий не проверял, но в моей задаче он невозможен.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Репликация в таблицу с данными
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]