CREATE SUBSCRIPTION
Эта страница переведена при помощи нейросети GigaChat.
CREATE SUBSCRIPTION - создание новой подписки.
Синтасис
CREATE SUBSCRIPTION subscription_name
CONNECTION 'conninfo'
PUBLICATION publication_name [, ...]
[ WITH ( subscription_parameter [= value] [, ... ] ) ]
Описание
CREATE SUBSCRIPTION используется для создания новой подписки логической репликации. Имя подписки должно быть уникальным в рамках текущей базы данных.
Подписка представляет собой реплицирующее подключение к публикующему серверу. Поэтому, помимо создания записей в локальных системных каталогах, обычно также создается слот репликации на удаленном сервере.
После выполнения команды (если подписка не была изначально отключена) запускается рабочий процесс логической репликации, который начинает передавать данные.
Дополнительные сведения о подписках и логической репликации можно найти в разделе «Подписка» и главе [«Логическая репликация»] официальной документации.
Параметры
subscription_name
Задает имя новой подписки, которая должна быть создана.
CONNECTION conninfo
Задает строку подключения формата libpq, определяющая, как подключаться к базе данных публикации.
PUBLICATION publication_name [, ...]
Задает список публикаций, на которые оформляется подписка.
WITH ( subscription_parameter [= value] [, ... ] )
Определяет опциональные параметры для подписки.
Следующие параметры определяют поведение при создании подписки:
connect (boolean)
: Указывает, должна ли команда CREATE SUBSCRIPTION подключаться к публикующему серверу. По умолчанию имеет значение true. При установке значения false параметры create_slot, enabled и copy_data также принудительно устанавливаются в значении false. Нельзя одновременно указать connect = false и установить значения true для create_slot, enabled или copy_data.
Так как при значении false подключение не устанавливается, таблицы не подписываются. Поэтому после включения подписки данные реплицироваться не будут. Необходимо будет выполнить ALTER SUBSCRIPTION ... REFRESH PUBLICATION, чтобы оформить подписку на таблицы.
create_slot (boolean)
: Указывает, должна ли команда создать слот репликации на стороне публикующего сервера. По умолчанию имеет значение true. Если установлено значение false, ответственность за создание слота ложится на администратора.
enabled (boolean)
: Указывает, должна ли подписка сразу начинать репликацию, или она только настраивается без запуска. По умолчанию имеет значение true.
slot_name (string)
: Задает имя слота репликации на стороне публикующего сервера. По умолчанию используется имя подписки.
Установка значения NONE означает отсутствие ассоциированного слота. В этом случае также необходимо установить enabled = false и create_slot = false.
Следующие параметры определяют поведение репликации после создания подписки:
binary (boolean)
: Указывает, будет ли подписка запрашивать у публикующего сервера передачу данных в двоичном формате (вместо текстового). По умолчанию имеет значение false. Даже если параметр включен, только те типы данных, для которых реализованы функции двоичной передачи и приема, будут передаваться в двоичном виде.
При репликации между разными версиями PostgreSQL может случиться так, что у публикующего сервера есть функция отправки в бинарном формате для определенного типа, а у подписчика отсутствует соответствующая функция приема. В таком случае передача данных завершится с ошибкой, и параметр binary использовать нельзя.
copy_data (boolean)
: Указывает, нужно ли копировать существующие данные из публикаций при запуске репликации. По умолчанию имеет значение true.
Если в публикациях присутствуют условия WHERE, они будут влиять на то, какие данные копируются. Смотрите раздел Примечания для получения подробной информации.
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.
Примечания
Смотрите раздел «Безопасность» для получения информации о настройке контроля доступа между экземплярами подписки и публикации.
Если при создании создается слот репликации (что является поведением по умолчанию), команда CREATE SUBSCRIPTION не может выполняться внутри блока транзакции.
Создание подписки, которая подключается к тому же кластеру базы данных (например, для репликации между базами в одном кластере или в рамках одной базы), возможно только если слот репликации не создается в той же команде. В противном случае выполнение CREATE SUBSCRIPTION будет зависать. Чтобы это обойти, следует создать слот репликации отдельно (с помощью функции pg_create_logical_replication_slot с указанием плагина pgoutput), а затем создать подписку с параметром create_slot = false. Это ограничение реализации, которое может быть снято в будущих версиях.
Если какая-либо таблица в публикации имеет условие WHERE, строки, для которых выражение возвращает false или null, не будут публиковаться. Если подписка включает несколько публикаций, в которых одна и та же таблица публикуется с разными условиями WHERE, строка будет публиковаться, если удовлетворяет хотя бы одному из этих выражений. В случае, если одна из публикаций не содержит условия WHERE (или задана как FOR ALL TABLES либо FOR TABLES IN SCHEMA), строки публикуются всегда, независимо от условий в других публикациях.
Если подписчик использует версию PostgreSQL ниже 15, фильтрация строк игнорируется во время начальной синхронизации данных. В этом случае рекомендуется удалить данные, которые были скопированы, но не соответствуют условиям фильтрации. Поскольку начальная синхронизация не учитывает параметр publish публикации, некоторые строки могут быть скопированы, несмотря на то, что они не подлежат репликации в обычном режиме. Смотрите раздел «Примеры» главы «Логическая репликация» для примеров.
Подписки, включающие несколько публикаций, в которых одна и та же таблица публикуется с разными списками столбцов, не поддерживаются.
Допускается указание несуществующих публикаций, чтобы добавить их позже. Это означает, что 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 является расширением PostgreSQL.
Смотрите также
ALTER SUBSCRIPTION, DROP SUBSCRIPTION, CREATE PUBLICATION, ALTER PUBLICATION