31.1. Публикация #
Публикация может быть определена на любом ведущем сервере физической репликации. Сервер, на котором определяется публикация, называется публикующим. Публикация — это набор изменений, выделяемых в таблице или в группе таблиц (он также может называться набором репликации). Публикация существует только в одной базе данных.
Публикации отличаются от схем и они никак не влияют на доступ к таблице. Если требуется, каждую таблицу можно включить в несколько публикаций. В настоящее время публикации могут содержать только таблицы, при этом они могут содержать все таблицы в схеме. Объекты в них нужно добавлять явным образом, если только публикация не создана для всех таблиц (с указанием ALL TABLES).
Публикации могут ограничивать набор публикуемых изменений, выбирая любое сочетание операций из INSERT, UPDATE, DELETE и TRUNCATE, подобно тому как для разных типов событий могут срабатывать триггеры. По умолчанию реплицируются все типы операций. Эти ограничения публикаций распространяются только на операции DML, они не влияют на копирование при начальной синхронизации данных. (Фильтры строк не работают для операции TRUNCATE. См. Раздел 31.3).
Чтобы можно было реплицировать операции UPDATE и DELETE, в публикуемой таблице должен быть настроен репликационный идентификатор, чтобы идентифицировать соответствующие строки для изменения или удаления на стороне подписчика. По умолчанию это первичный ключ, если он создан. Также репликационным идентификатором можно назначить другой уникальный индекс (с некоторыми дополнительными условиями). Если в таблице нет подходящего ключа, в качестве репликационного идентификатора можно задать FULL, что будет означать, что ключом будет вся строка. Если выбран репликационный идентификатор FULL, для поиска строк на стороне подписчика могут использоваться индексы. Подходящими индексами будут нечастичные индексы-B-деревья, самое левое поле которых является столбцом (а не выражением), ссылающимся на столбец опубликованной таблицы. Эти ограничения на свойства неуникальных индексов соответствуют некоторым ограничениям, которые применяются к первичным ключам. Если нет подходящих индексов, поиск на стороне подписчика может быть очень неэффективным, поэтому репликационный идентификатор FULL следует использовать только в крайнем случае, если нет другого решения. Если на стороне публикации выбран репликационный идентификатор, отличный от FULL, то идентификатор, состоящий из того же или меньшего количества столбцов, также должен быть определён на стороне подписчика. Подробнее о назначении репликационного идентификатора рассказывается в REPLICA IDENTITY. Если в публикацию, в которой реплицируются операции UPDATE и DELETE, добавляется таблица без репликационного идентификатора, то последующие команды UPDATE и DELETE на стороне публикации вызовут ошибку. Команды INSERT могут выполняться вне зависимости от такого идентификатора.
У каждой публикации может быть множество подписчиков.
Публикация создаётся командой CREATE PUBLICATION и может быть впоследствии изменена или удалена с помощью соответствующих команд.
В публикации можно динамически добавлять или удалять отдельные таблицы, используя команду ALTER PUBLICATION. Операции ADD TABLE и DROP TABLE являются транзакционными, так что репликация таблицы будет начата или закончена с определённым снимком только после фиксации транзакции.
31.1. Publication #
A publication can be defined on any physical replication primary. The node where a publication is defined is referred to as publisher. A publication is a set of changes generated from a table or a group of tables, and might also be described as a change set or replication set. Each publication exists in only one database.
Publications are different from schemas and do not affect how the table is accessed. Each table can be added to multiple publications if needed. Publications may currently only contain tables and all tables in schema. Objects must be added explicitly, except when a publication is created for ALL TABLES.
Publications can choose to limit the changes they produce to any combination of INSERT, UPDATE, DELETE, and TRUNCATE, similar to how triggers are fired by particular event types. By default, all operation types are replicated. These publication specifications apply only for DML operations; they do not affect the initial data synchronization copy. (Row filters have no effect for TRUNCATE. See Section 31.3).
A published table must have a replica identity configured in order to be able to replicate UPDATE and DELETE operations, so that appropriate rows to update or delete can be identified on the subscriber side. By default, this is the primary key, if there is one. Another unique index (with certain additional requirements) can also be set to be the replica identity. If the table does not have any suitable key, then it can be set to replica identity FULL, which means the entire row becomes the key. When replica identity FULL is specified, indexes can be used on the subscriber side for searching the rows. Candidate indexes must be btree, non-partial, and the leftmost index field must be a column (not an expression) that references the published table column. These restrictions on the non-unique index properties adhere to some of the restrictions that are enforced for primary keys. If there are no such suitable indexes, the search on the subscriber side can be very inefficient, therefore replica identity FULL should only be used as a fallback if no other solution is possible. If a replica identity other than FULL is set on the publisher side, a replica identity comprising the same or fewer columns must also be set on the subscriber side. See REPLICA IDENTITY for details on how to set the replica identity. If a table without a replica identity is added to a publication that replicates UPDATE or DELETE operations then subsequent UPDATE or DELETE operations will cause an error on the publisher. INSERT operations can proceed regardless of any replica identity.
Every publication can have multiple subscribers.
A publication is created using the CREATE PUBLICATION command and may later be altered or dropped using corresponding commands.
The individual tables can be added and removed dynamically using ALTER PUBLICATION. Both the ADD TABLE and DROP TABLE operations are transactional; so the table will start or stop replicating at the correct snapshot once the transaction has committed.