CREATE SUBSCRIPTION
CREATE SUBSCRIPTION — определить новую подписку
Синтаксис
CREATE SUBSCRIPTION имя_подписки
CONNECTION 'строка_подключения'
PUBLICATION имя_публикации [, ...]
[ WITH ( параметр_подписки [= значение] [, ... ] ) ]
Описание
Команда CREATE SUBSCRIPTION добавляет новую подписку логической репликации.
Пользователь, создающий подписку, становится ее владельцем. Имя подписки должно
отличаться от имени любой существующей подписки в текущей базе данных.
Подписка представляет собой подключение репликации к публикатору. Таким образом, обычно эта команда не только добавляет определения в локальные каталоги, но и создает слот репликации на публикаторе.
При фиксации транзакции, в которой выполняется эта команда, будет запущен рабочий процесс логической репликации, который будет реплицировать данные для новой подписки (если эта подписка изначально не находится в отключенном состоянии).
Чтобы иметь возможность создавать подписки, нужно иметь права роли pg_create_subscription, а также права CREATE в текущей базе данных.
Дополнительную информацию о подписках и логической репликации в целом см. в разделе Подписка и главе Логическая репликация соответственно.
Параметры
имя_подписки
Имя новой подписки.
CONNECTION 'строка_подключения'
Строка подключения к публикатору. Дополнительную информацию см. в подразделе Строки подключения.
PUBLICATION имя_публикации
Имена публикаций на публикаторе, на которые производится подписка.
WITH ( параметр_подписки [= значение] [, ... ] )
В этом предложении указываются необязательные параметры для подписки.
Следующие параметры управляют тем, что происходит во время создания подписки:
-
connect (boolean)
Определяет, должна ли командаCREATE SUBSCRIPTIONвообще подключаться к публикатору. Значение по умолчанию — true. Значение false меняет значения параметров enabled, create_slot и copy_data на false. (Сочетать значение false в параметре connect со значением true в параметрах create_slot, enabled или copy_data невозможно.)
Так как при значении false для этого параметра соединение не устанавливается, подписка на таблицы не производится. Чтобы запустить репликацию, нужно вручную создать слот репликации, включить подписку и обновить ее. Примеры см. в подразделе Примеры: Отложенное создание слота репликации. -
create_slot (boolean)
Определяет, должна ли команда создать слот репликации на публикаторе. Значение по умолчанию равно true.
При значении false вам нужно самим каким-либо иным способом создать слот на публикаторе. Примеры см. в подразделе Примеры: Отложенное создание слота репликации. -
enabled (boolean)
Определяет, следует ли активировать репликацию подписки, или ее нужно только установить, но пока не запускать. Значение по умолчанию — true.
- slot_name (string)
Имя используемого слота репликации на публикаторе. По умолчанию в качестве имени слота используется имя подписки.
Если в slot_name указать NONE, с подпиской не будет связан никакой слот репликации. В таких подписках также должны быть установлены значения false для параметров enabled и create_slot. Используйте этот вариант, если собираетесь создать слот репликации позже вручную. Примеры см. в подразделе Примеры: Отложенное создание слота репликации.
Следующие параметры управляют поведением репликации подписки после ее создания:
- binary (boolean)
Определяет, будет ли данная подписка запрашивать у публикатора передачу данных в двоичном (а не текстовом) формате. Значение по умолчанию — false. При любом копировании данных для начальной синхронизации таблиц (см. copy_data) используется тот же формат. Двоичный формать может обрабатываться быстрее текстового, но он хуже портируется между машинными архитектурами и версиями QHB. Двоичный формат крайне типоспецифичен; например, он не позволит копировать данные из столбца smallint в столбец integer, хотя в текстовом формате это бы получилось. Даже когда этот параметр включен, в двоичном формате передаются только те типы данных, у которых имеются функции двоичного получения и отправки. Обратите внимание, что для начальной синхронизации требуется, чтобы у всех типов данных имелись функции двоичного получения и отправки, в противном случае синхронизация не удастся (более подробную информацию о функциях отправки/получения см. на справочной странице команды CREATE TYPE).
При репликации между серверами разных версий может получиться так, что у публикатора есть функция двоичной отправки для некоторого типа данных, но у подписчика нет функции двоичного получения для этого типа. В таком случае передача данных будет невозможна, и параметр binary использовать нельзя.
Если версия публикатора ниже QHB 1.5.3, то для любой начальной синхронизации таблиц будет использоваться текстовый формат, даже если binary = true.
- copy_data (boolean)
Определяет, должны ли копироваться существующие данные в публикациях, на которые выполняется подписка, сразу после запуска репликации. Значение по умолчанию — true.
Если публикация содержит предложения WHERE, это повлияет на то, какие именно данные будут копироваться. Подробную информацию см. в Примечаниях ниже.
Подробную информацию о том, как copy_data = true может взаимодействовать с исходным параметром, см. в Примечаниях.
- streaming (enum)
Определяет, должна ли быть включена для этой подписки потоковая передача изменений еще выполняющихся транзакций. Значение по умолчанию — off (выключен), т. е. все транзакции целиком декодируются на публикаторе и только потом передаются подписчику как единое целое.
При значении on (включен), поступающие изменения записываются во временные файлы, а затем применяются только после фиксации транзакции на публикаторе и получения ее результатов подписчиком.
При значении parallel поступающие изменения применяются напрямую посредством одного из параллельных рабочих процессов применения (если таковой имеется). Если нет свободного параллельного рабочего процесса применения изменений для обработки транзакций в потоке, изменения записываются во временные файлы и применяются после фиксации транзакции. Обратите внимание, что если в параллельном рабочем процессе применения происходит ошибка, LSN завершения удаленной транзакции может не записаться в журнал сервера.
- synchronous_commit (enum)
Значение этого параметра переопределяет значение параметра synchronous_commit для рабочих процессов, применяющих изменения данной подписки. Значение по умолчанию — off (выключен).
Использование значения off безопасно для логической репликации: если подписчик потеряет транзакции из-за отсутствия синхронизации, данные будут повторно отправлены с публикатора.
При выполнении синхронной логической репликации может потребоваться другое значение. Рабочие процессы логической репликации передают на публикатор позиции записанных и сброшенных на диск данных, и при использовании синхронной репликации тот будет ожидать фактического сохранения. Следовательно, значение off параметра synchronous_commit для подписчика при использовании подписки для синхронной репликации может увеличить задержку выполненияCOMMITна публикаторе. При таком сценарии может быть выгодно установить для synchronous_commit значение local или выше.
- two_phase (boolean)
Определяет, включается ли двухфазная фиксация для этой подписки. Значение по умолчанию — false.
Когда включена двухфазная фиксация, подготовленные транзакции передаются подписчику во времяPREPARE TRANSACTIONи тоже обрабатываются на подписчике как двухфазные транзакции. В противном случае подготовленные транзакции передаются подписчику только после фиксации, а затем немедленно обрабатываются подписчиком.
Реализация двухфазной фиксации требует, чтобы репликация успешно завершила начальную фазу синхронизации таблиц. Поэтому даже когда параметр two_phase для подписки включен, внутреннее состояние двухфазной фиксации временно останется «в ожидании», пока не завершится фаза инициализации. Фактическое состояние двухфазной фиксации можно узнать из столбца subtwophasestate системного каталога pg_subscription.
- disable_on_error (boolean)
Определяет, должна ли подписка автоматически выключаться, если рабочие процессы подписки обнаружат какие-либо ошибки во время репликации данных с публикатора. Значение по умолчанию — false.
- password_required (boolean)
Если установлено значение true, подключения к публикатору, создаваемые в результате этой подписки, должны использовать аутентификацию по паролю, и пароль должен указываться как часть строки подключения. Этот параметр игнорируется, если подпиской владеет суперпользователь. Значение по умолчанию — true. Только суперпользователи могут установить значение false.
- run_as_owner (boolean)
При значении true все действия репликации выполняются от имени владельца подписки. При значении false рабочие процессы репликации будут выполнять действия с каждой таблицей от имени владельца этой таблицы. Вторая конфигурация в целом гораздо более безопасна, см. раздел Безопасность. Значение по умолчанию — false.
- origin (string)
Определяет, будет ли подписка запрашивать у публикатора отправку только изменений, не имеющих источника, или всех изменений независимо от источника. Установка для origin значения none означает, что подписка будет запрашивать у публикатора отправку только изменений, не имеющих источника. Установка для origin значения any означает, что публикатор отправляет изменения независимо от их источника. Значение по умолчанию — any.
Подробную информацию о том, как copy_data = true может взаимодействовать с параметром origin, см. в Примечаниях ниже.
При указании параметра типа boolean часть = значение можно опустить, что равнозначно указанию значения TRUE.
Примечания
Подробную информацию о настройке управления доступом подписок к публикатору см. в разделе Безопасность.
При создании слота репликации (поведение по умолчанию) команду CREATE SUBSCRIPTION
нельзя выполнить внутри блока транзакции.
Создание подписки, которая подключается к одному и тому же кластеру баз данных
(например, для репликации между базами данных в одном и том же кластере или для
репликации в одной и той же базе данных), будет успешным только в том случае, если
слот репликации не создается в рамках той же команды. В противном случае вызов
CREATE SUBSCRIPTION будет зависать. Чтобы выполнить эту работу, создайте слот
репликации отдельно (с помощью функции pg_create_logical_replication_slot с
именем плагина pgoutput) и создайте подписку параметром create_slot= false.
Примеры см. в подразделе Примеры: Отложенное создание слота репликации. Это
ограничение реализации, которое может быть снято в будущих выпусках.
Если для какой-либо таблицы в публикации имеется предложение WHERE, строки, для которых выражение вычисляется в false или null, опубликованы не будут. Если подписка имеет несколько публикаций, в которых одна и та же таблица была опубликована с разными предложениями WHERE, строка будет опубликована, если она удовлетворяет любому из выражений (относящихся к этой операции публикации). В случае разных предложений WHERE, если в одной из публикаций нет предложения WHERE (относящегося к этой операции публикации) или публикация объявлена как FOR ALL TABLES или FOR TABLES IN SCHEMA, строки публикуются всегда, независимо от определения других выражений. Если на подписчике используется версия QHB ниже 1.5.3, то во время фазы начальной синхронизации все фильтры строк игнорируются. В этом случае пользователю стоит рассмотреть возможность удаления всех изначально скопированных данных, которые будут несовместимы с последующими фильтрами. Поскольку во время копирования существующих данных таблиц при начальной синхронизация данных параметр публикации publish не учитывается, могут быть скопированы некоторые строки, которые не были бы реплицированы с помощью операций DML. Примеры см. в подразделе Примеры: Настройка логической репликации.
Подписки с несколькими публикациями, в которых одна и та же таблица была опубликована с разными списками столбцов, не поддерживается.
Мы допускаем указание несуществующих публикаций, чтобы пользователи могли добавить их позже. Это означает, что в каталоге pg_subscription могут находиться несуществующие публикации.
При использовании для подписки сочетания параметров copy_data = true и origin = NONE данные для начальной синхронизации таблиц копируются напрямую с публикатора, то есть узнать истинный источник этих данных невозможно. Если у публикатора тоже есть подписки, копируемые данные таблиц могли быть получены из вышестоящего источника. такой сценарий выявляется, и для пользователя выводится сообщение уровня WARNING, но это предупреждение является всего лишь указанием на потенциальную проблему; пользователь должен самостоятельно провести необходимые проверки, чтобы убедиться в том, что у копируемых данных действительно желаемый источник (или нет)
Чтобы узнать, какие таблицы могут потенциально включать в себя данные из нелокального источника (из-за других подписок, созданных на публикаторе) попробуйте выполнить этот запрос SQL:
# замените <pub-names> ниже именами запрашиваемых подписок
SELECT DISTINCT PT.schemaname, PT.tablename
FROM pg_publication_tables PT
JOIN pg_class C ON (C.relname = PT.tablename)
JOIN pg_namespace N ON (N.nspname = PT.schemaname),
pg_subscription_rel PS
WHERE C.relnamespace = N.oid AND
(PS.srrelid = C.oid OR
C.oid IN (SELECT relid FROM pg_partition_ancestors(PS.srrelid) UNION
SELECT relid FROM pg_partition_tree(PS.srrelid))) AND
PT.pubname IN (<pub-names>);
Примеры
Создание подписки на удаленный сервер, который реплицирует таблицы в публикациях 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