Мультинаправленная репликация в схеме "звезда" (постановка)
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) |
||
| (не показаны 4 промежуточные версии 1 участника) | |||
| Строка 6: | Строка 6: | ||
# Структура таблиц, участвующих в репликации, может отличаться на разных базах. При условии, что при переносе изменений будет сохраняться целостность данных. | # Структура таблиц, участвующих в репликации, может отличаться на разных базах. При условии, что при переносе изменений будет сохраняться целостность данных. | ||
# Каждая база данных имеет свой уникальный идентификатор -- DBID. | # Каждая база данных имеет свой уникальный идентификатор -- DBID. | ||
| − | # Для каждой таблицы, участвующей в репликации, создается таблица для хранения версий записей. | + | # Для каждой таблицы T, участвующей в репликации, создается таблица T<sup>'</sup> для хранения версий записей. |
| + | # Таблица T<sup>'</sup> содержит все поля из таблицы T. Но, ограничения и индексы не создаются. | ||
| + | # В таблице T<sup>'</sup> создается поле-первичный ключ modid -- идентификатор модификации. modid -- целое число, увеличивающееся от более ранних изменений к более поздним. modid является первичным ключем и одновременно внешним ключем на таблицу лога. При логировании операции удаления в таблице модификаций заполняются только поля modid и идентификатор записи. | ||
| + | # Изменения, сделанные в рамках одной транзакции, переносятся на удаленную базу данных как единое целое (при репликации сохраняется атомарность изменений). | ||
| + | # При перемещении за пределы базы данных записи идентифицируются глобальным РУИДом, уникальным для всех БД, участвующих в репликации. | ||
| + | # Все изменения фиксируются в таблице лога с помощью триггеров AFTER на таблицах, участвующих в схеме репликации. | ||
| + | |||
| + | <syntaxhighlight lang="SQL"> | ||
| + | CREATE TABLE gd_repl_log ( | ||
| + | id dintkey, -- сюда направлена ссылка из таблицы с модификациями | ||
| + | ts dtimestamp_notnull, | ||
| + | relname drelationname, | ||
| + | op CHAR(1) NOT NULL, -- I, U, D | ||
| + | trid dintkey, -- идентификатор транзакции | ||
| + | dbid dintkey, -- идентификатор базы данных, где были произведены изменения | ||
| + | |||
| + | CONSTRAINT gd_pk_repl_log PRIMARY KEY (id) | ||
| + | ); | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | ====Пример==== | ||
Текущая версия на 19:32, 3 января 2017
- Репликация на уровне таблиц реляционной базы данных.
- В репликации участвует одна главная база данных (master) и неограниченное количество удаленных баз данных (remote).
- Обмен между удаленными базами данных происходит через главную (топология "звезда").
- На каждой базе данных может быть свой набор таблиц, участвующих в репликации. При условии, что при переносе изменений будет сохраняться целостность данных.
- Структура таблиц, участвующих в репликации, может отличаться на разных базах. При условии, что при переносе изменений будет сохраняться целостность данных.
- Каждая база данных имеет свой уникальный идентификатор -- DBID.
- Для каждой таблицы T, участвующей в репликации, создается таблица T' для хранения версий записей.
- Таблица T' содержит все поля из таблицы T. Но, ограничения и индексы не создаются.
- В таблице T' создается поле-первичный ключ modid -- идентификатор модификации. modid -- целое число, увеличивающееся от более ранних изменений к более поздним. modid является первичным ключем и одновременно внешним ключем на таблицу лога. При логировании операции удаления в таблице модификаций заполняются только поля modid и идентификатор записи.
- Изменения, сделанные в рамках одной транзакции, переносятся на удаленную базу данных как единое целое (при репликации сохраняется атомарность изменений).
- При перемещении за пределы базы данных записи идентифицируются глобальным РУИДом, уникальным для всех БД, участвующих в репликации.
- Все изменения фиксируются в таблице лога с помощью триггеров AFTER на таблицах, участвующих в схеме репликации.
CREATE TABLE gd_repl_log ( id dintkey, -- сюда направлена ссылка из таблицы с модификациями ts dtimestamp_notnull, relname drelationname, op CHAR(1) NOT NULL, -- I, U, D trid dintkey, -- идентификатор транзакции dbid dintkey, -- идентификатор базы данных, где были произведены изменения CONSTRAINT gd_pk_repl_log PRIMARY KEY (id) );