Как изменить статус подписки с тиражирования на репликацию

Я пытаюсь реплицировать базу данных postgresql от узла провайдера к узлу подписчика. Я следовал руководству от http://bonesmoses.org/2016/10/14/pg-phriday-perfectly-logical/ и создал узел провайдера и добавил таблицу в набор репликации и аналогично создан подписчик, чтобы подписаться на эту таблицу, и подписка работает нормально для этого. После этого я добавил еще несколько таблиц, которые являются частью другой базы данных, но в том же экземпляре postgres, и добавил эти таблицы в новый набор репликации, но для этого набора репликация не работает, и подписчик выходит из строя для этого набора. Как сделать эту подписку репликационной для наборов репликации, которые я добавил позже?

Ниже приведены команды, которые я запускал на узле провайдера:

Шаг 1: Запустите файл pg_dump для импорта команд DDL

psql -U postgres -d databasename1 < exportDDL.pgsql

Шаг 2: Создан узел провайдера

SELECT pglogical.create_node(
node_name := 'db_provider',
dsn := 'host=docker-container-ip port=5432 dbname=databasename1'

);

Шаг 3: Создано состояние репликации

SELECT pglogical.create_replication_set(
set_name := 'qrtz',
replicate_insert := TRUE, replicate_update := TRUE,
replicate_delete := TRUE, replicate_truncate := TRUE);

Шаг 4: Добавлены три таблицы в этот набор

SELECT pglogical.replication_set_add_table(
set_name := 'qrtz', relation := ‘qrtz_logs', 
synchronize_data := TRUE);

SELECT pglogical.replication_set_add_table(
set_name := 'qrtz', relation := ‘qrtz_errors', 
synchronize_data := TRUE);

SELECT pglogical.replication_set_add_table(
set_name := 'qrtz', relation := ‘qrtz_calendars', 
synchronize_data := TRUE);

Абонентский узел:

Шаг 1: Выполните команды DDL, используя файл pg_dump

psql -U postgres -d postgres < exportDDL.pgsql

Шаг 2: Создан абонентский узел

SELECT pglogical.create_node(
node_name := 'db_subscriber',
dsn := 'host=docker-container-ip port=5432 dbname=postgres');

Шаг 3: Создана подписка

SELECT pglogical.create_subscription(subscription_name := 'qrtz_data’,  
replication_sets := array['qrtz'],
 provider_dsn := 'host=provider-docker-container-ip port=5432 
 dbname=databasename1');

Шаг 4: проверен статус с помощью

Select * from pglogical.show_subscription_status

Он показал статус как вниз для подписки qrtz_data

2 ответа

Отключение означает, что подписка не удалась: обычно возникает какая-то проблема. Проверьте журналы Postgres на наличие ошибок. После устранения ошибок заново создайте подписку, отбросив и создав ее заново. Проверьте статус. Если снова не работает, проверьте журнал ошибок еще раз. Продолжайте итерацию, пока статус initializing а потом replicating,

Я попытался удалить подписку и создать ее заново, но статус начинался сно стал снова.

Первопричина

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

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

Примечание. Если у вас есть статус подписки и источник/цель не синхронизированы, запустите только команду, указанную в #additional примечании, и не нужно применять разрешение.

Разрешение

Если статус вашей подпискиdown

  • Удалить расширение pgologic
  • Снова создайте конфигурацию pgologic для баз данных издателя и подписчика.

Дополнительное примечание

На последнем шаге подписка будет восстановлена.Штраф штата за новые записи, но задержка все еще может быть.

Итак, чтобы убедиться, что исходная и целевая таблицы синхронизированы, выполните следующую команду:

      SELECT pglogical.alter_subscription_resynchronize_table('${SUBSCRIPTION_NAME}', '${SCHEMA_NAME}.${TABLE_NAME}');

В течение нескольких минут данные в обеих таблицах синхронизируются.

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