Как изменить статус подписки с тиражирования на репликацию
Я пытаюсь реплицировать базу данных 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}');
В течение нескольких минут данные в обеих таблицах синхронизируются.