CREATE SUBSCRIPTION — создание новой подписки
CREATE SUBSCRIPTIONsubscription_nameCONNECTION 'conninfo' PUBLICATIONpublication_name[, ...] [ WITH (subscription_parameter[=option] [, ... ] ) ]
CREATE SUBSCRIPTION добавляет новую подписку логической репликации. Пользователь, создающий подписку, становится владельцем данной подписки. Имя подписки не должно совпадать с именами уже существующих подписок в текущей базе данных.
Подписка представляет собой соединение репликации с издателем. Таким образом, помимо добавления определений в локальные каталоги, эта команда обычно создает слот репликации на стороне издателя.
Рабочий процесс логической репликации для передачи данных в рамках новой подписки будет запущен в момент фиксации транзакции, в которой выполняется данная команда (если только подписка не была создана в отключенном состоянии).
Для создания подписки необходимо обладать привилегиями pg_create_subscription , а также иметь право
CREATE права доступа в текущей базе данных.
Дополнительная информация о подписках и логической репликации в целом доступна в Раздел 3.14.2 и Глава 3.14.
subscription_name #Имя новой подписки.
CONNECTION 'conninfo' #Строка libpq подключения, определяющая способ подключения к базе данных издателя. Подробности см. в Раздел 4.1.1.1.
PUBLICATION publication_name [, ...] #Имена публикаций на издателе, на которые оформляется подписка.
WITH ( subscription_parameter [= option] [, ... ] ) #Данное предложение определяет необязательные параметры подписки.
Следующие параметры управляют процессом создания подписки:
connect (boolean) #
Определяет, должна ли CREATE SUBSCRIPTION
команда вообще подключаться к издателю. По умолчанию
является true. Установка этого параметра в значение
false принудительно установит значения
create_slot, enabled и
copy_data в false.
(Нельзя сочетать установку connect
в false с
установкой create_slot, enabled,
или copy_data в true.)
Так как при установке этого параметра в
falseсоединение не устанавливается, подписка на таблицы не выполняется. Чтобы инициировать
репликацию, необходимо вручную создать слот репликации, включить
переключение при отказе, если это необходимо, включить подписку и обновить
подписку. См.
Раздел 3.14.2.3
для примеров.
create_slot (boolean) #
Определяет, должна ли команда создать слот репликации на
стороне издателя. По умолчанию — true.
Если установлено значение false, вы несете ответственность за
создание слота на издателе другим способом. См.
Раздел 3.14.2.3
для примеров.
enabled (boolean) #
Определяет, должна ли подписка активно выполнять репликацию
или она должна быть просто создана, но еще не запущена. По умолчанию
является true.
slot_name (строка) #Имя используемого слота репликации на издателе. По умолчанию в качестве имени слота используется имя подписки.
Установка значения slot_name в NONE
означает, что с данной подпиской не будет связан ни один слот
репликации. Для таких подписок параметры
enabled и create_slot должны быть установлены в
false. Используйте этот параметр при последующем ручном создании
слота репликации. См.
Раздел 3.14.2.3
для примеров.
При установке slot_name в допустимое имя и
create_slot в значение false,
переключение при отказе значение свойства именованного слота может
отличаться от соответствующего переключение при отказе параметра,
указанного в подписке. Всегда обеспечивайте соответствие свойства слота
переключение при отказе аналогичному параметру
подписки и наоборот. В противном случае слот на издателе может
функционировать иначе, чем определено параметрами подписки: например,
слот на издателе может синхронизироваться с
резервными серверами, даже если параметр подписки переключение при отказе
отключен, или же синхронизация может быть недоступна, даже если
подписки переключение при отказе параметр включен.
Следующие параметры управляют поведением репликации подписки после её создания:
binary (boolean) #
Определяет, будет ли подписка запрашивать у издателя отправку
данных в двоичном формате (в отличие от текстового). По умолчанию —
false. Любое копирование при начальной синхронизации таблиц
(см. copy_data) также использует тот же формат. Двоичный
формат может быть быстрее текстового, но он менее переносим
между архитектурами машин и Digital Q.DataBase
версиями. Двоичный формат строго привязан к типам данных; например, он
не позволит выполнять копирование из столбца smallint в столбец
integer столбец, хотя это нормально работало бы в текстовом
формате. Даже если этот параметр включен, только типы данных, имеющие двоичные
функции отправки и приема, будут передаваться в двоичном виде. Обратите внимание, что
начальная синхронизация требует, чтобы все типы данных имели двоичные
функции отправки и приема, иначе синхронизация завершится ошибкой
(см. CREATE TYPE (подробнее о функциях отправки/приема
functions).
При выполнении межверсионной репликации может случиться так, что
издатель имеет функцию двоичной отправки для некоторого типа данных, а
подписчик не имеет функции двоичного приема для этого типа. В
таком случае передача данных завершится ошибкой, и
этот binary параметр использовать нельзя.
Если издатель имеет Digital Q.DataBase версию
ниже 16, любая начальная синхронизация таблиц будет использовать текстовый формат,
даже если binary = true.
copy_data (boolean) #
Определяет, следует ли копировать существующие данные публикаций
на которые оформляется подписка при запуске репликации.
Значение по умолчанию — true.
Если публикации содержат WHERE предложения, это
повлияет на объем копируемых данных. Подробности приведены в
Notes for details.
См. Notes , чтобы узнать, как
copy_data = true взаимодействует с параметром
origin parameter.
streaming (enum) #
Определяет, следует ли включить потоковую передачу выполняющихся транзакций
для этой подписки. Значение по умолчанию — off,
означает, что все транзакции полностью декодируются на издателе и только
затем отправляются подписчику целиком.
Если установлено значение on, входящие изменения записываются во
временные файлы и применяются только после того, как транзакция будет
зафиксирована на издателе и получена подписчиком.
Если установлено значение parallel, входящие изменения напрямую
применяются одним из параллельных рабочих процессов применения, если они доступны. Если ни один
параллельный рабочий процесс применения не свободен для обработки потоковых транзакций, то
изменения записываются во временные файлы и применяются после того, как
транзакция будет зафиксирована. Обратите внимание, что в случае ошибки в параллельном рабочем процессе
применения, конечный LSN удаленной транзакции
может не отобразиться в журнале сервера.
synchronous_commit (enum) #
Значение этого параметра переопределяет
synchronous_commit настройка внутри этого
процессов-исполнителей (apply worker) подписки. Значение по умолчанию
является off.
Это безопасно использовать off для логической репликации:
Если подписчик теряет транзакции из-за отсутствия
синхронизации, данные будут повторно отправлены издателем.
Другая настройка может быть целесообразной при выполнении синхронной
логической репликации. Рабочие процессы логической репликации сообщают издателю о
позициях записей и сбросов (flushes), и при использовании
синхронной репликации издатель будет ожидать фактического
сброса на диск. Это означает, что установка
synchronous_commit для подписчика в значение
off когда подписка используется для
синхронной репликации, может увеличить задержку выполнения
COMMIT на издателе. В данном сценарии это
может быть целесообразно установить synchronous_commit
в локальный или выше.
two_phase (boolean) #
Определяет, включена ли двухфазная фиксация для этой подписки.
Значение по умолчанию — false.
Когда двухфазная фиксация включена, подготовленные транзакции отправляются
подписчику в момент выполнения PREPARE
TRANSACTION, и также обрабатываются как двухфазные
транзакции на стороне подписчика. В противном случае подготовленные
транзакции отправляются подписчику только при фиксации и
затем немедленно обрабатываются подписчиком.
Реализация двухфазной фиксации требует, чтобы репликация
успешно завершила фазу начальной синхронизации таблиц
. Поэтому, даже если этот режим two_phase включен для
подписки, внутреннее состояние двухфазной фиксации остается
временно «pending» до тех пор, пока фаза инициализации не
завершится. См. столбец subtwophasestate
в pg_subscription
, чтобы узнать фактическое состояние двухфазной фиксации.
disable_on_error (boolean) #
Определяет, должна ли подписка автоматически отключаться
при обнаружении любых ошибок рабочими процессами подписки во время
репликации с издателя. Значение по умолчанию —
false.
password_required (boolean) #
Если установлено значение true, подключения к издателю, устанавливаемые
в результате создания этой подписки, должны использовать аутентификацию по паролю,
который должен быть указан в строке
подключения. Этот параметр игнорируется, если владельцем подписки является
суперпользователь. Значение по умолчанию — true. Только суперпользователи
могут устанавливать это значение в false.
run_as_owner (boolean) #
Если установлено значение true, все действия репликации выполняются от имени
владельца. Если значение — false, рабочие процессы репликации будут выполнять действия над каждой
таблицей от имени владельца этой таблицы. Последний вариант конфигурации
как правило, гораздо более безопасен; подробности см. в
Раздел 3.14.10.
Значение по умолчанию — false.
origin (строка) #
Указывает, будет ли подписка запрашивать у издателя отправку только
тех изменений, которые не имеют источника, или отправку всех изменений независимо от
источника. Установка значения origin в none
означает, что подписка будет запрашивать у издателя отправку только тех
изменений, которые не имеют источника. Установка значения origin
в any означает, что издатель отправляет изменения
независимо от их источника. Значение по умолчанию — any.
См. Notes , чтобы узнать, как
copy_data = true взаимодействует с параметром
origin parameter.
переключение при отказе (boolean) #
Указывает, разрешена ли синхронизация слотов репликации, связанных с подпиской,
с резервными серверами для того, чтобы логическую
репликацию можно было возобновить с нового основного сервера после переключения при отказе.
Значение по умолчанию — false.
При указании параметра типа boolean, the
= option
часть может быть опущена, что эквивалентно указанию TRUE.
См. Раздел 3.14.10 для получения подробной информации о настройке контроля доступа между экземплярами подписки и публикации.
При создании слота репликации (поведение по умолчанию) CREATE
SUBSCRIPTION не может быть выполнена внутри блока транзакции.
Создание подписки с подключением к тому же кластеру баз данных (например, для репликации между базами данных в одном кластере или внутри одной базы данных) будет успешным только в том случае, если слот репликации не создается той же командой. В противном случае CREATE
SUBSCRIPTION вызов зависнет. Чтобы это заработало, создайте слот репликации отдельно (используя функцию pg_create_logical_replication_slot с именем плагина pgoutput) и создайте подписку, используя параметр create_slot = false. См.
Раздел 3.14.2.3
примеры. Это ограничение реализации, которое может быть снято в будущих выпусках.
Если какая-либо таблица в публикации содержит WHERE предложение, строки, для которых expression
принимает значение false или null, не будут опубликованы. Если подписка включает несколько публикаций, в которых одна и та же таблица опубликована с различными WHERE предложениями WHERE, строка будет опубликована, если выполняется любое из выражений (относящихся к данной операции публикации). В случае различных WHERE предложений, если одна из публикаций не имеет WHERE предложения WHERE (относящегося к данной операции публикации) или если публикация определена как
FOR ALL TABLES
или FOR TABLES IN SCHEMA, строки всегда публикуются независимо от определения других выражений. Если подписчик — это Digital Q.DataBase
версию ниже 15, то любая фильтрация строк игнорируется на этапе начальной синхронизации данных. В этом случае пользователю, возможно, следует рассмотреть возможность удаления всех первоначально скопированных данных, которые были бы несовместимы с последующей фильтрацией. Поскольку начальная синхронизация данных не учитывает параметр публикации
publish
при копировании существующих данных таблиц, могут быть скопированы строки, которые не были бы реплицированы с помощью DML. См.
Раздел 3.14.2.2 для ознакомления с примерами.
Подписки, включающие несколько публикаций, в которых одна и та же таблица опубликована с разными списками столбцов, не поддерживаются.
Допускается указание несуществующих публикаций, чтобы пользователи могли добавить их позже. Это означает, что
pg_subscription
может содержать несуществующие публикации.
При использовании комбинации параметров подписки
copy_data = true и origin = NONE,
данные таблицы для начальной синхронизации копируются напрямую от издателя; это означает,
что определить истинный источник этих данных невозможно. Если у издателя также есть подписки, то скопированные данные таблицы могли поступить из более ранних узлов в цепочке. Такой сценарий обнаруживается, и пользователю выводится WARNING, однако это лишь предупреждение о потенциальной проблеме; пользователь несет ответственность за проведение необходимых проверок, чтобы гарантировать, что источники скопированных данных действительно соответствуют требуемым.
Чтобы определить таблицы, которые потенциально могут содержать данные из нелокальных источников (из-за других подписок, созданных на издателе), выполните следующий SQL-запрос:
# заменитениже именами ваших публикаций, для которых выполняется запрос SELECT DISTINCT PT.schemaname, PT.tablename FROM pg_publication_tables PT, pg_subscription_rel PS JOIN pg_class C ON (C.oid = PS.srrelid) JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE N.nspname = PT.schemaname AND C.relname = PT.tablename AND PT.pubname IN ( );
Создание подписки на удаленный сервер для репликации таблиц в публикациях mypublication и
insert_only и немедленно начинает репликацию при фиксации (commit):
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 является Digital Q.DataBase
расширением.