CREATE SUBSCRIPTION
CREATE SUBSCRIPTION — создать подписку
Синтаксис
CREATE SUBSCRIPTIONимя_подпискиCONNECTION 'строка_подключения' PUBLICATIONимя_публикации[, ...] [ WITH (параметр_подписки[=значение] [, ... ] ) ]
Описание
CREATE SUBSCRIPTION создаёт подписку для текущей базы данных. Имя подписки должно отличаться от имён других существующих подписок в текущей базе.
Подписка представляет собой реплицирующее подключение к публикующему серверу. Поэтому данная команда не только добавляет определения подписки в локальные каталоги, но также создаёт слот репликации на удалённом сервере.
В момент фиксации транзакции, в рамках которой выполняется эта команда, будет запущен рабочий процесс логической репликации.
Дополнительные сведения о подписках и логической репликации в целом можно найти в Разделе 30.2 и Главе 30.
Параметры
имя_подпискиИмя новой подписки.
CONNECTION 'строка_подключения'Строка подключения к публикующему серверу. Подробности описаны в Подразделе 32.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или выше.connect(boolean)Определяет, нужно ли при выполнении
CREATE SUBSCRIPTIONподключаться к публикующему серверу. Если равняетсяfalse, значениями по умолчанию параметровenabled,create_slotиcopy_dataтоже будетfalse.Значение
falseпараметраconnectнесовместимо со значениемtrueпараметровenabled,create_slotиcopy_data.Так как со значением
falseсоединение не устанавливается, подписка на таблицы не оформляется, так что после включения подписки ничего не будет реплицироваться. Чтобы таблицы вошли в подписку, потребуется позже выполнитьALTER SUBSCRIPTION ... REFRESH PUBLICATION.
Замечания
Подробнее о том, как организовать управление доступом подписчиков к публикующему серверу, рассказывается в Разделе 30.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.