×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

3.14.2. Подписка

3.14.2.1. Управление слотами репликации
3.14.2.2. Примеры: Настройка логической репликации
3.14.2.3. Примеры: отложенное создание слота репликации

Подписка является принимающей стороной механизма логической репликации. Узел, на котором определена подписка, называется подписчиком. Подписка определяет соединение с другой базой данных и набор публикаций (одну или несколько), на которые необходимо подписаться.

База данных подписчика функционирует так же, как и любой другой экземпляр PostgreSQL, и может выступать в роли издателя для других баз данных путем определения собственных публикаций.

Узел-подписчик при необходимости может иметь несколько подписок. Между одной парой «издатель-подписчик» можно определить несколько подписок; в этом случае необходимо обеспечить отсутствие пересечений между объектами публикаций, на которые оформляются подписки.

Каждая подписка получает изменения через один слот репликации (см. Раздел 3.11.2.6). Для начальной синхронизации данных существующих таблиц могут потребоваться дополнительные слоты репликации, которые будут удалены по завершении синхронизации данных.

Подписка логической репликации может выступать в качестве резервного сервера для синхронной репликации (см. Раздел 3.11.2.8). Именем резервного сервера по умолчанию является имя подписки. Альтернативное имя может быть указано как application_name в параметрах подключения подписки.

Подписки выгружаются с помощью pg_dump если текущий пользователь является суперпользователем. В противном случае выводится предупреждение, и подписки пропускаются, так как пользователи, не являющиеся суперпользователями, не могут прочитать всю информацию о подписках из pg_subscription системного каталога.

Подписка добавляется с помощью команды CREATE SUBSCRIPTION и может быть остановлена или возобновлена в любое время с помощью команды ALTER SUBSCRIPTION и удалена с помощью команды DROP SUBSCRIPTION.

При удалении и повторном создании подписки информация о синхронизации теряется. Это означает, что впоследствии данные необходимо синхронизировать повторно.

Определения схем не реплицируются, и опубликованные таблицы должны существовать на стороне подписчика. Целевыми объектами репликации могут быть только обычные таблицы. Например, репликация в представление не поддерживается.

Сопоставление таблиц между издателем и подписчиком выполняется по полному имени таблицы. Репликация в таблицы с иными именами на стороне подписчика не поддерживается.

Столбцы таблицы также сопоставляются по имени. Порядок столбцов в таблице подписчика не обязательно должен совпадать с порядком на издателе. Типы данных столбцов не обязательно должны совпадать, если текстовое представление данных может быть преобразовано в целевой тип. Например, допускается репликация из столбца типа integer в столбец типа bigint. Целевая таблица может также содержать дополнительные столбцы, отсутствующие в публикуемой таблице. Любые подобные столбцы будут заполнены значением по умолчанию, указанным в определении целевой таблицы. Однако логическая репликация в бинарном формате имеет больше ограничений. Подробности приведены в описании бинарного параметра для CREATE SUBSCRIPTION for details.

3.14.2.1. Управление слотами репликации #

Как отмечалось ранее, каждая (активная) подписка получает изменения через слот репликации на удаленной стороне (стороне публикации).

Дополнительные слоты синхронизации таблиц обычно являются временными; они создаются внутренними механизмами для выполнения начальной синхронизации таблиц и автоматически удаляются, когда в них отпадает необходимость. Эти слоты синхронизации таблиц имеют генерируемые имена: «pg_%u_sync_%u_%llu» (параметры: подписка oid, таблица relid, системный идентификатор sysid)

Обычно удаленный слот репликации создается автоматически при создании подписки с помощью CREATE SUBSCRIPTION , и он автоматически удаляется при удалении подписки с помощью DROP SUBSCRIPTION. Однако в некоторых ситуациях может быть полезно или необходимо управлять подпиской и базовым слотом репликации по отдельности. Ниже приведены некоторые сценарии:

  • При создании подписки слот репликации уже существует. В этом случае подписка может быть создана с использованием параметра create_slot = false для связывания с существующим слотом.

  • При создании подписки удаленный хост недоступен или находится в неопределенном состоянии. В этом случае подписка может быть создана с использованием параметра параметра connect = false В этом случае обращение к удаленному хосту производиться не будет. Именно этот механизм pg_dump используется. В такой ситуации удаленный слот репликации необходимо создать вручную перед активацией подписки.

  • При удалении подписки слот репликации должен быть сохранен. Это может быть полезно в случаях, когда база данных подписчика переносится на другой хост и активируется на нем. В этой ситуации следует разорвать связь между слотом и подпиской с помощью ALTER SUBSCRIPTION до выполнения операции удаления подписки.

  • При удалении подписки удаленный хост может быть недоступен. В этом случае необходимо отсоединить слот от подписки с помощью ALTER SUBSCRIPTION перед выполнением удаления самой подписки. Если экземпляр удаленной базы данных более не существует, никакие дальнейшие действия не требуются. Однако если экземпляр удаленной базы данных просто недоступен, слот репликации (и любые оставшиеся слоты синхронизации таблиц) необходимо удалить вручную; в противном случае они продолжат резервировать сегменты WAL, что может привести к переполнению диска. Подобные ситуации подлежат тщательному анализу.

3.14.2.2. Примеры: Настройка логической репликации #

Создание тестовых таблиц на стороне Издателя.

test_pub=# CREATE TABLE t1(a int, b text, PRIMARY KEY(a));
CREATE TABLE
test_pub=# CREATE TABLE t2(c int, d text, PRIMARY KEY(c));
CREATE TABLE
test_pub=# CREATE TABLE t3(e int, f text, PRIMARY KEY(e));
CREATE TABLE

Создание таких же таблиц на стороне Подписчика.

test_sub=# CREATE TABLE t1(a int, b text, PRIMARY KEY(a));
CREATE TABLE
test_sub=# CREATE TABLE t2(c int, d text, PRIMARY KEY(c));
CREATE TABLE
test_sub=# CREATE TABLE t3(e int, f text, PRIMARY KEY(e));
CREATE TABLE

Вставка данных в таблицы на стороне Издателя.

test_pub=# INSERT INTO t1 VALUES (1, 'one'), (2, 'two'), (3, 'three');
INSERT 0 3
test_pub=# INSERT INTO t2 VALUES (1, 'A'), (2, 'B'), (3, 'C');
INSERT 0 3
test_pub=# INSERT INTO t3 VALUES (1, 'i'), (2, 'ii'), (3, 'iii');
INSERT 0 3

Создайте публикации для таблиц. Публикации pub2 и pub3a запрещают некоторые «публикация» операции. Публикация pub3b имеет фильтр строк (см. Раздел 3.14.4).

test_pub=# CREATE PUBLICATION pub1 FOR TABLE t1;
CREATE PUBLICATION
test_pub=# CREATE PUBLICATION pub2 FOR TABLE t2 WITH (publish = 'truncate');
CREATE PUBLICATION
test_pub=# CREATE PUBLICATION pub3a FOR TABLE t3 WITH (publish = 'truncate');
CREATE PUBLICATION
test_pub=# CREATE PUBLICATION pub3b FOR TABLE t3 WHERE (e > 5);
CREATE PUBLICATION

Создайте подписки для данных публикаций. Подписка sub3 оформляется на обе публикации pub3a и pub3b. Все подписки по умолчанию копируют исходные данные.

test_sub=# CREATE SUBSCRIPTION sub1
test_sub-# CONNECTION 'host=localhost dbname=test_pub application_name=sub1'
test_sub-# PUBLICATION pub1;
CREATE SUBSCRIPTION
test_sub=# CREATE SUBSCRIPTION sub2
test_sub-# CONNECTION 'host=localhost dbname=test_pub application_name=sub2'
test_sub-# PUBLICATION pub2;
CREATE SUBSCRIPTION
test_sub=# CREATE SUBSCRIPTION sub3
test_sub-# CONNECTION 'host=localhost dbname=test_pub application_name=sub3'
test_sub-# PUBLICATION pub3a, pub3b;
CREATE SUBSCRIPTION

Следует отметить, что начальные данные таблицы копируются независимо от «публикация» операции публикации.

test_sub=# SELECT * FROM t1;
 a |   b
---+-------
 1 | one
 2 | two
 3 | three
(3 строки)

test_sub=# SELECT * FROM t2;
 c | d
---+---
 1 | A
 2 | B
 3 | C
(3 строки)

Более того, так как при начальном копировании данных игнорируется «публикация» операция, и поскольку публикация pub3a не имеет фильтра строк, это означает, что скопированная таблица t3 содержит все строки, даже если они не соответствуют фильтру строк публикации pub3b.

test_sub=# SELECT * FROM t3;
 e |  f
---+-----
 1 | i
 2 | ii
 3 | iii
(3 строки)

Добавление дополнительных данных в таблицы на стороне издателя.

test_pub=# INSERT INTO t1 VALUES (4, 'four'), (5, 'five'), (6, 'six');
INSERT 0 3
test_pub=# INSERT INTO t2 VALUES (4, 'D'), (5, 'E'), (6, 'F');
INSERT 0 3
test_pub=# INSERT INTO t3 VALUES (4, 'iv'), (5, 'v'), (6, 'vi');
INSERT 0 3

Теперь данные на стороне издателя выглядят следующим образом:

test_pub=# SELECT * FROM t1;
 a |   b
---+-------
 1 | one
 2 | two
 3 | three
 4 | four
 5 | five
 6 | six
(6 rows)

test_pub=# SELECT * FROM t2;
 c | d
---+---
 1 | A
 2 | B
 3 | C
 4 | D
 5 | E
 6 | F
(6 rows)

test_pub=# SELECT * FROM t3;
 e |  f
---+-----
 1 | i
 2 | ii
 3 | iii
 4 | iv
 5 | v
 6 | vi
(6 rows)

Следует отметить, что в процессе обычной репликации используются соответствующие «публикация» операции. Это означает, что публикации pub2 и pub3a не будут реплицировать INSERT. Кроме того, публикация pub3b будет реплицировать только те данные, которые соответствуют фильтру строк pub3b. Теперь данные на стороне подписчика выглядят следующим образом:

test_sub=# SELECT * FROM t1;
 a |   b
---+-------
 1 | one
 2 | two
 3 | three
 4 | four
 5 | five
 6 | six
(6 rows)

test_sub=# SELECT * FROM t2;
 c | d
---+---
 1 | A
 2 | B
 3 | C
(3 rows)

test_sub=# SELECT * FROM t3;
 e |  f
---+-----
 1 | i
 2 | ii
 3 | iii
 6 | vi
(4 rows)

3.14.2.3. Примеры: отложенное создание слота репликации #

Существуют определенные случаи (например, Раздел 3.14.2.1) когда, если удаленный слот репликации не был создан автоматически, требуется создать его вручную до активации подписки. Процедура создания слота и активации подписки приведена в следующих примерах. В этих примерах указывается стандартный плагин вывода логического декодирования (pgoutput), который используется встроенным механизмом логической репликации.

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

test_pub=# CREATE PUBLICATION pub1 FOR ALL TABLES;
CREATE PUBLICATION

Пример 1: Когда в параметрах подписки указано параметра

  • Создание подписки.

    test_sub=# CREATE SUBSCRIPTION sub1
    test_sub-# CONNECTION 'host=localhost dbname=test_pub'
    test_sub-# PUBLICATION pub1
    test_sub-# WITH (connect=false);
    WARNING:  subscription was created, but is not connected
    HINT:  To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription.
    CREATE SUBSCRIPTION
    
  • На стороне издателя вручную создается слот репликации. Поскольку имя не было указано при CREATE SUBSCRIPTION, имя создаваемого слота совпадает с именем подписки, например, "sub1".

    test_pub=# SELECT * FROM pg_create_logical_replication_slot('sub1', 'pgoutput');
     slot_name |    lsn
    -----------+-----------
     sub1      | 0/19404D0
    (1 row)
    
  • На стороне подписчика завершите активацию подписки. После этого начнется репликация pub1 таблиц.

    test_sub=# ALTER SUBSCRIPTION sub1 ENABLE;
    ALTER SUBSCRIPTION
    test_sub=# ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;
    ALTER SUBSCRIPTION
    

Пример 2: В случае, когда в подписке указано параметра, но также определен slot_name параметр.

  • Создание подписки.

    test_sub=# CREATE SUBSCRIPTION sub1
    test_sub-# CONNECTION 'host=localhost dbname=test_pub'
    test_sub-# PUBLICATION pub1
    test_sub-# WITH (connect=false, slot_name='myslot');
    WARNING:  subscription was created, but is not connected
    HINT:  To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription.
    CREATE SUBSCRIPTION
    
  • На стороне издателя вручную создайте слот репликации с тем же именем, которое было указано при CREATE SUBSCRIPTION, например, "myslot".

    test_pub=# SELECT * FROM pg_create_logical_replication_slot('myslot', 'pgoutput');
     slot_name |    lsn
    -----------+-----------
     myslot    | 0/19059A0
    (1 строка)
    
  • На стороне подписчика остальные этапы активации подписки аналогичны описанным ранее.

    test_sub=# ALTER SUBSCRIPTION sub1 ENABLE;
    ALTER SUBSCRIPTION
    test_sub=# ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;
    ALTER SUBSCRIPTION
    

Пример 3: Случай, когда в подписке указан параметр slot_name = NONE

  • Создание подписки. При использовании slot_name = NONE также требуются параметры enabled = falseи create_slot = false create_slot = false.

    test_sub=# CREATE SUBSCRIPTION sub1
    test_sub-# CONNECTION 'host=localhost dbname=test_pub'
    test_sub-# PUBLICATION pub1
    test_sub-# WITH (slot_name=NONE, enabled=false, create_slot=false);
    CREATE SUBSCRIPTION
    
  • На стороне издателя необходимо вручную создать слот с произвольным именем, например, "myslot".

    test_pub=# SELECT * FROM pg_create_logical_replication_slot('myslot', 'pgoutput');
     slot_name |    lsn
    -----------+-----------
     myslot    | 0/1905930
    (1 строка)
    
  • На стороне подписчика свяжите подписку с именем только что создана.

    test_sub=# ALTER SUBSCRIPTION sub1 SET (slot_name='myslot');
    ALTER SUBSCRIPTION
    
  • Остальные шаги по активации подписки не отличаются от описанных ранее.

    test_sub=# ALTER SUBSCRIPTION sub1 ENABLE;
    ALTER SUBSCRIPTION
    test_sub=# ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;
    ALTER SUBSCRIPTION
    

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению