CREATE SUBSCRIPTION#
CREATE SUBSCRIPTION
CREATE SUBSCRIPTION — определить новую подписку
Синтаксис
CREATE SUBSCRIPTIONsubscription_name
CONNECTION 'conninfo
' PUBLICATIONpublication_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.