CREATE SUBSCRIPTION

CREATE SUBSCRIPTION — определить новую подписку


Синтаксис

CREATE SUBSCRIPTION имя_подписки
    CONNECTION 'строка_подключения'
    PUBLICATION имя_публикации [, ...]
    [ WITH ( параметр_подписки [= значение] [, ... ] ) ]

Описание

Команда CREATE SUBSCRIPTION добавляет новую подписку для текущей базы данных. Имя подписки должно отличаться от имени любой существующей подписки в базе данных.

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

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

Дополнительную информацию о подписках и логической репликации в целом см. в разделе Подписка и главе Логическая репликация соответственно.


Параметры

имя_подписки

Имя новой подписки.

CONNECTION 'строка_подключения'

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

PUBLICATION имя_публикации

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

WITH ( параметр_подписки [= значение] [, ... ] )

В этом предложении указываются необязательные параметры для подписки. Поддерживаются следующие параметры:

  • copy_data (boolean)
    Определяет, должны ли копироваться существующие данные в публикациях, на которые выполняется подписка, сразу после запуска репликации. Значение по умолчанию равно true.

  • create_slot (boolean)
    Определяет, должна ли команда создать слот репликации на публикующем сервере. Значение по умолчанию равно true.

  • enabled (boolean)
    Определяет, следует ли активировать репликацию подписки или ее нужно только установить, но пока не запускать. Значение по умолчанию равно true.

  • slot_name (string)
    Имя используемого слота репликации. Поведение по умолчанию заключается в использовании имени подписки в качестве имени слота.

    Когда значение slot_name задается как NONE, с подпиской не будет связан никакой слот репликации. Это можно использовать, если слот репликации будет создан позже вручную. В таких подписках также должны быть установлены значения false для параметров enabled и create_slot.

  • synchronous_commit (enum)
    Значение этого параметра переопределяет значение параметра synchronous_commit для рабочих процессов, применяющих изменения данной подписки. Значение по умолчанию равно off (выключен).

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

    При выполнении синхронной логической репликации может потребоваться другое значение. Рабочие процессы логической репликации передают на публикующий сервер позиции записанных и сброшенных на диск данных, и при использовании синхронной репликации тот будет ожидать фактического сохранения. Следовательно, значение off параметра synchronous_commit для подписчика при использовании подписки для синхронной репликации может увеличить задержку выполнения COMMIT на публикующем сервере. При таком сценарии может быть выгодно установить для synchronous_commit значение local или выше.

  • binary (boolean)
    Определяет, будет ли данная подписка запрашивать у публикующего сервера передачу данных в двоичном (а не текстовом) формате. Значение по умолчанию равно false. Даже когда этот параметр включен, в двоичном формате передаются только те типы данных, у которых имеются функции двоичного получения и отправки.

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

  • connect (boolean)
    Определяет, должна ли CREATE SUBSCRIPTION вообще подключаться к публикующему серверу. При установке для этого параметра значения false значения по умолчанию параметров enabled, create_slot и copy_data также сменятся на false.

    Не допускается совмещение значения false для параметра connect и значения true для параметров enabled,create_slot или copy_data.

    Так как при значении false для этого параметра соединение не устанавливается, подписка на таблицы не производится, и поэтому после включения подписки ничего реплицироваться не будет. Чтобы запустить подписку на таблицы, нужно выполнить команду ALTER SUBSCRIPTION ... REFRESH PUBLICATION.

  • streaming (boolean)
    Определяет, должна ли быть включена для этой подписки потоковая передача изменений еще выполняющихся транзакций. По умолчанию все транзакции целиком декодируются на публикующем сервере и только потом передаются подписчику как единое целое.


Примечания

Подробную информацию о настройке управления доступом подписчиков к публикующему серверу см. в разделе Безопасность.

При создании слота репликации (поведение по умолчанию) команду CREATE SUBSCRIPTION нельзя выполнить внутри блока транзакции.

Создание подписки, которая подключается к одному и тому же кластеру баз данных (например, для репликации между базами данных в одном и том же кластере или для репликации в одной и той же базе данных), будет успешным только в том случае, если слот репликации не создается в рамках той же команды. В противном случае вызов CREATE SUBSCRIPTION будет зависать. Чтобы выполнить эту работу, создайте слот репликации отдельно (с помощью функции pg_create_logical_replication_slot с именем плагина pgoutput) и создайте подписку с помощью параметра create_slot = false. Это ограничение реализации, которое может быть снято в будущих выпусках.


Примеры

Создание подписки на удаленный сервер, который реплицирует таблицы в публикациях mypublication и insert_only с немедленным запуском репликации при фиксации транзакции:

CREATE SUBSCRIPTION mysub
         CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb'
        PUBLICATION mypublication, insert_only;

Создание подписки на удаленный сервер, который реплицирует таблицы в публикацию insert_only с отложенным запуском репликации.

CREATE SUBSCRIPTION mysub
         CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb'
        PUBLICATION insert_only
               WITH (enabled = false);

Совместимость

Команда CREATE SUBSCRIPTION является расширением QHB.


См. также

ALTER SUBSCRIPTION, DROP SUBSCRIPTION, CREATE PUBLICATION, ALTER PUBLICATION