CREATE SUBSCRIPTION#

CREATE SUBSCRIPTION

CREATE SUBSCRIPTION

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

Синтаксис

CREATE SUBSCRIPTION subscription_name
    CONNECTION 'conninfo'
    PUBLICATION publication_name [, ...]
    [ WITH ( subscription_parameter [= value] [, ... ] ) ]

Описание

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

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

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

Дополнительная информация о подписках и логической репликации в целом доступна по ссылкам Раздел 30.2 и Глава 30.

Параметры

subscription_name

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

CONNECTION 'conninfo'

Строка подключения libpq, определяющая, как подключиться к базе данных издателя. Подробности см. в разделе Раздел 32.1.1.

PUBLICATION publication_name [, ...]

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

WITH ( subscription_parameter [= value] [, ... ] )

Это предложение определяет необязательные параметры для подписки.

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

connect (boolean)

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

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

create_slot (boolean)

Определяет, должна ли команда создавать слот репликации на издателе. По умолчанию true. Если установлено значение false, вы должны самостоятельно создать слот издателя другим способом.

enabled (boolean)

Определяет, должна ли подписка активно тиражировать или просто быть настроенной, но пока не запущенной. По умолчанию true.

slot_name (string)

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

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

Следующие параметры управляют поведением репликации подписки после ее создания:

binary (boolean)

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

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

copy_data (boolean)

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

Если публикации содержат предложения WHERE, это повлияет на то, какие данные будут скопированы. См. Notes для получения подробной информации.

streaming (boolean)

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

synchronous_commit (enum)

Значение этого параметра переопределяет настройку synchronous_commit в рамках процессов рабочего процесса применения этой подписки. Значение по умолчанию - off.

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

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

two_phase (boolean)

Определяет, включен ли двухфазный коммит для этой подписки. По умолчанию false.

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

Реализация двухфазного коммита требует успешного завершения фазы синхронизации исходной таблицы репликации. Таким образом, даже когда two_phase включен для подписки, внутреннее состояние двухфазного коммита остается временно ожидающим, пока не завершится фаза инициализации. Смотрите столбец subtwophasestate в pg_subscription, чтобы узнать фактическое состояние двухфазного коммита.

disable_on_error (boolean)

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

origin (string)

Определяет, будет ли подписка запрашивать у издателя только изменения без указания их происхождения или отправлять изменения независимо от их происхождения. Установка значения origin в none означает, что подписка будет запрашивать у издателя только отправку изменений без указания их происхождения. Установка значения origin в any означает, что издатель отправляет изменения независимо от их происхождения. По умолчанию используется значение any.

Примечания

См. Раздел 30.9 для получения подробной информации о настройке контроля доступа между подпиской и экземпляром публикации.

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

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

Если в любой таблице публикации есть предложение WHERE, строки, для которых expression вычисляется как false или null, не будут опубликованы. Если подписка имеет несколько публикаций, в которых та же таблица была опубликована с разными предложениями WHERE, строка будет опубликована, если любое из выражений (относящихся к этой операции публикации) удовлетворяется. В случае разных предложений WHERE, если одна из публикаций не имеет предложения WHERE (относящегося к этой операции публикации) или публикация объявлена как FOR ALL TABLES или FOR TABLES IN SCHEMA, строки всегда публикуются независимо от определения других выражений. Если подписчик - это версия Tantor SE до 15, то любая фильтрация строк игнорируется во время начальной синхронизации данных. В этом случае пользователь может захотеть удалить любые начально скопированные данные, которые будут несовместимы с последующей фильтрацией. Поскольку начальная синхронизация данных не учитывает параметр публикации publish при копировании существующих данных таблицы, некоторые строки могут быть скопированы, которые не будут тиражироваться с использованием DML. См. Раздел 30.2.2 для примеров.

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

Мы позволяем указывать несуществующие публикации, чтобы пользователи могли добавить их позже. Это означает, что pg_subscription может иметь несуществующие публикации.

Примеры

Создать подписку на удаленный сервер, который реплицирует таблицы в публикациях 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 - это расширение Tantor SE.