Postgresql: создайте подписку с create_slot = false, если слот существует

#postgresql #database-replication

#postgresql #репликация базы данных

Вопрос:

У меня есть несколько контейнеров с логическими репликами баз данных Postgresql, работающих на ECS / Fargate. И я хотел спросить, знает ли кто-нибудь, есть ли возможность создать подобную подписку (очень псевдокод):

 IF REPLICATION SLOT my_subscription EXISTS:
    CREATE SUBSCRIPTION my_subscription CONNECTION [...]
    WITH (create_slot=false);
ELSE:
    CREATE SUBSCRIPTION my_subscription CONNECTION [...]
    WITH (create_slot=true);
 

Это было бы очень полезно для запуска и / или перезапуска контейнеров БД.

РЕДАКТИРОВАТЬ: подписка находится в init.sql контейнеров Docker, так что подписка создается при запуске каждого контейнера.

Комментарии:

1. Просто попробуйте один, а когда он завершится неудачей, попробуйте другой.

2. @LaurenzAlbe Ну, да, это было бы возможно, если бы это были управляемые вручную базы данных, но, как я уже писал, они работают на Fargate, что означает, что мне нужно отредактировать init.sql, создать новый образ, пометить и нажать его … или создать все подписки вручную… должно быть лучшее решение 🙂

3. Что вы используете для запуска сценария SQL. psql ?

4. @LaurenzAlbe Я использую официальный образ postgres12 Docker[1] и, да, я думаю, что psql используется для запуска сценария инициализации. [1] hub.docker.com/_/postgres

Ответ №1:

Вы могли бы использовать DO инструкцию и перехватить ошибку:

 DO
$BEGIN
   CREATE SUBSCRIPTION my_subscription ...;
EXCEPTION WHEN duplicate_object THEN
   CREATE SUBSCRIPTION my_subscription ...
      WITH (create_slot = false, slot_name = 'log_slot');
END;$;
 

Комментарии:

1. Круто! Спасибо большое! Я быстро проверяю это

2. Итак, проблема в том, что в основной базе данных есть только pg_replication_slots. На реплике его пустой стол.

3. Нет никакого способа узнать с помощью запроса в режиме ожидания, есть ли слот репликации. Почему бы вам не использовать DO заявление?

4. Хорошо, это работает отлично 🙂 Спасибо большое. Я не подумал об этом, так как я не слишком хорошо знаком с обработкой исключений в postgres.