Відновлення реплікації таблиць бази даних

Якщо виявлена проблема з реплікацією даних в analytical-instance, яка може виражатися через помилки по типу:

  1. Помилок дублікації в лог файлах репліки (под analytical-instance):

    ERROR: duplicate key value violates unique constraint
    Key already exists.
    та ін.
  2. Помилок worker:

    LOG: background worker "logical replication worker" (PID 275744) exited with exit code 1
  3. Заповнення диска (Storage → PersistentVolumeClaims → analytical-instance).

Перевірити статус репліки можна на под operational-instance за допомогою наступної команди:

psql
\c registry
select * from pg_replication_slots;

Має бути один запис з полем active зі значенням true та заповненим полем active_pid.

Якщо є декілька записів з полями false, то це може означати, що репліка не працює як очікується та не всі таблиці з публікації реплікації копіюються.

tables repair 1

Процес з відновлення реплікації таблиць:

  1. На analytical-instance виконати наступні команди, щоб подивитися, які таблиці не реплікуються:

    psql
    \c registry
    select srrelid::regclass from pg_subscription_rel where srsubstate<>'r';
  2. Таблиці із п-1 потрібно видалити із публікації на operational-instance:

    alter publication analytical_pub drop table table_name;
  3. На analytical-instance виконати оновлення публікації та зробити truncate для очищення таблиць на репліці:

    alter subscription operational_sub refresh publication;
    TRUNCATE table_name;

    Опціонально: У разі якщо спостерігається наступна помилка:

    tables repair 2

    Видаляти з публікації пов’язану таблицю в operational-instance (пункт 2) та повторюємо пункт 3 для цієї таблиці. При появі нових пов’язаних таблиць - повторити ще раз.

  4. На operational-instance додати таблиці із п-1 (та пункту 3 - у разі появи згаданої помилки) до публікації:

    alter publication analytical_pub add table table_name;
  5. На analytical-instance виконати оновлення публікації:

    alter subscription operational_sub refresh publication;
  6. Для перевірки того, що репліка працює правильно, виконати команди на operational-instance:

    select * from pg_replication_slots;

    Має бути один запис з полем active зі значенням true та заповненим полем active_pid.

  7. Перевірка на analytical-instance:

    select count(*) from pg_subscription_rel where srsubstate<>'r';

    Очікуване значення - 0