Помилка duplicate key value violates unique constraint при реплікації даних з операційної у аналітичну базу даних

Відтворення помилки:

  • Зробити зміну структури таблиці в моделі даних, наприклад додати колонку. При цьому таблиця повинна вже містити дані у БД;

  • Розгорнути зміну;

  • Після розгортання реплікація з аналітичною базою перестає працювати. У лош файлах аналітичної бази можна побачити наступну помилку для історичної _hst таблиці тієї таблиці в якій була змінена структура.

    Приклад відповіді:

    2024-09-26 13:45:32.264 UTC [8319] LOG: logical replication table synchronization worker for subscription "operational_sub", table "entity_build_acts_hst" has started
    2024-09-26 13:45:32.440 UTC [8319] ERROR: duplicate key value violates unique constraint "ui_entity_build_acts_hst"
    2024-09-26 13:45:32.440 UTC [8319] DETAIL: Key (entity_id, ddm_created_at)=(200b478f-326e-4a3b-804e-782e907ecbb8, 2024-09-12 18:42:05.289627+00) already exists.

Рішення:

  • Після розгортання регламенту та появи помилок увійти у базу даних registry на под аналітичної бази даних та видалити всі дані з історичної _hst (приклад з лог файлів - entity_build_acts_hst) таблиці яка вказана в помилці:

    psql
    \c registry
    DELETE FROM entity_build_acts_hst;
  • Помилки зникнуть та почнеться реплікація;

  • Через деякий час в таблиці з якої видалили дані, вони знову зʼявляться.

Причини:

При зміні структури таблиці на операційній та аналітичній базах даних, наявна hst таблиця перейменовуються та переноситься в схему архів. Потім створюється нова hst таблиця зі зміненою структурою. В ній копіюються останні історичні дані із таблиці перенесеної в архів. В решті решт вмикається реплікація новоствореної hst таблиці. Оскільки дані були вже скопійовані на аналітичній базі даних та реплікація намагається зробити те ж саме с тими ж самими даними виникає конфлікт.