CREATE SUBSCRIPTION
CREATE SUBSCRIPTION — определить новую подписку
Синтаксис
CREATE SUBSCRIPTION имя_подписки
CONNECTION 'строка_подключения'
PUBLICATION имя_публикации [, ...]
[ WITH ( параметр_подписки [= значение] [, ... ] ) ]
Описание
Команда CREATE SUBSCRIPTION
добавляет новую подписку для текущей базы данных.
Имя подписки должно отличаться от имени любой существующей подписки в базе данных.
Подписка представляет собой подключение репликации к публикующему серверу. Таким образом, эта команда не только добавляет определения в локальные каталоги, но и создает слот репликации на публикующем сервере.
При фиксации транзакции, в которой выполняется эта команда, будет запущен рабочий процесс логической репликации, который будет реплицировать данные для новой подписки.
Дополнительную информацию о подписках и логической репликации в целом см. в разделе Подписка и главе Логическая репликация соответственно.
Параметры
имя_подписки
Имя новой подписки.
CONNECTION 'строка_подключения'
Строка подключения к публикующему серверу. Дополнительную информацию см. в подразделе Строки подключения.
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)
Определяет, должна ли быть включена для этой подписки потоковая передача изменений еще выполняющихся транзакций. По умолчанию все транзакции целиком декодируются на публикующем сервере и только потом передаются подписчику как единое целое.
Примечания
Подробную информацию о настройке управления доступом подписчиков к публикующему серверу см. в разделе Безопасность.
При создании слота репликации (поведение по умолчанию) команду 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
является расширением QHB.
См. также
ALTER SUBSCRIPTION
, DROP SUBSCRIPTION
, CREATE PUBLICATION
, ALTER PUBLICATION