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