PostgreSQL 10 логическая репликация: двойные записи или конфликт первичного ключа

Я построил master -> slave setup с PostgreSQL 10 для синхронизации данных из некоторых конкретных таблиц с ведомой машиной, которая является публичной системой. В течение всего времени я сталкиваюсь со странным поведением: некоторые таблицы вообще не синхронизируются.

Просматривая журнал PostgreSQL, я сталкиваюсь с этими сообщениями об ошибках:

2018-06-07 15:28:30.163 CEST [4134] LOG:  worker process: logical replication worker for subscription 18249 sync 17956 (PID 6706) exited with exit code 1

2018-06-07 15:28:30.183 CEST [6707] ERROR:  duplicate key value violates unique constraint "producttext_pk"

2018-06-07 15:28:30.183 CEST [6707] DETAIL:  Key (id)=(100) already exists.

2018-06-07 15:28:30.183 CEST [6707] CONTEXT:  COPY producttext, line 1

Для дальнейшего анализа я удалил первичный ключ в этой таблице на ведомом компьютере, и в этом случае ошибка больше не возникает, НО теперь я получаю повторяющиеся записи в таблице.

Единственный способ предотвратить повторяющиеся записи - это иметь первичный ключ на месте, но тогда синхронизация не будет работать, пока она зацикливается ровно на четырех таблицах, не переходя к остальным.

Я уже проверил роли и владельца, и они установлены правильно. Как уже говорилось, без первичного ключа все синхронизируется, не выдает ошибок, а создает повторяющиеся записи.

Могу ли я что-то пропустить в этот момент? Большое спасибо.

1 ответ

Вы пропустили, что вы не можете вставить строки в таблицу в режиме ожидания, которые могут конфликтовать с fows, которые реплицируются с первичной.

Если вам нужно вставить как основной, так и резервный, вам нужно убедиться, что первичные ключи не конфликтуют, например, вставив только четные идентификаторы в один и нечетные идентификаторы в другой.

Другие вопросы по тегам