CREATE SUBSCRIPTION
CREATE SUBSCRIPTION — создать подписку
Синтаксис
CREATE SUBSCRIPTIONимя_подписки
CONNECTION 'строка_подключения
' PUBLICATIONимя_публикации
[, ...] [ WITH (параметр_подписки
[=значение
] [, ... ] ) ]
Описание
CREATE SUBSCRIPTION
создаёт подписку для текущей базы данных. Имя подписки должно отличаться от имён других существующих подписок в текущей базе.
Подписка представляет собой реплицирующее подключение к публикующему серверу. Поэтому данная команда не только добавляет определения подписки в локальные каталоги, но также создаёт слот репликации на удалённом сервере.
В момент фиксации транзакции, в рамках которой выполняется эта команда, будет запущен рабочий процесс логической репликации.
Дополнительные сведения о подписках и логической репликации в целом можно найти в Разделе 29.2 и Главе 29.
Параметры
имя_подписки
Имя новой подписки.
CONNECTION '
строка_подключения
'Строка подключения к публикующему серверу. Подробности описаны в Подразделе 33.1.1.
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
)Определяет, будут ли для данной подписки передаваться изменения ещё выполняющихся транзакций. По умолчанию каждая транзакция сначала целиком декодируется на стороне публикации, и только затем передаются подписчику как единое целое.
Замечания
Подробнее о том, как организовать управление доступом подписчиков к публикующему серверу, рассказывается в Разделе 29.7.
При создании слота репликации (поведение по умолчанию) 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
является расширением Postgres Pro.