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, которые реплицируются с первичной.
Если вам нужно вставить как основной, так и резервный, вам нужно убедиться, что первичные ключи не конфликтуют, например, вставив только четные идентификаторы в один и нечетные идентификаторы в другой.