Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
После инициализации публикации или подписки репликация типа "слияние" отслеживает и перечисляет все изменения данных в опубликованных таблицах. Изменения отслеживаются с помощью триггеров (которые репликация создает для каждой опубликованной таблицы) и системных таблиц в базах данных публикации и подписки. Эти таблицы системы репликации заполняются метаданными, указывающими, какие изменения следует распространять. Когда агент слияния запускается во время синхронизации, изменения определяются агентом, а затем применяются к издателю и подписчику по мере необходимости.
Отслеживание изменений
Репликация слиянием использует следующие триггеры и системные таблицы для отслеживания изменений для всех опубликованных таблиц:
-
MSmerge_ins_<GUID>: триггер вставки (значение GUID для этого триггера и других триггеров определяется на основеsysmergearticles) -
MSmerge_upd_<GUID>: триггер обновления -
MSmerge_del_<GUID>: триггер удаления MSmerge_contentsMSmerge_tombstoneMSmerge_genhistory
Репликация слиянием использует следующие дополнительные системные таблицы для отслеживания изменений в отфильтрованных таблицах.
MSmerge_partition_groupsMSmerge_current_partition_mappingsMSmerge_past_partition_mappings
Замечание
Системные таблицы используются всеми публикациями слияния и подписками в базе данных; например, если в базе данных публикаций имеется несколько публикаций, MSmerge_contents содержит строки из статей во всех публикациях.
Отслеживание изменений для нефильтрованных таблиц
Системные таблицы
Системные таблицы, используемые для нефильтрованных и отфильтрованных таблиц, содержат следующие метаданные:
MSmerge_contentsсодержит одну строку для каждой строки, вставленной или обновленной в опубликованную таблицу в базе данных.MSmerge_tombstoneсодержит одну строку для каждой строки, удаленной из опубликованной таблицы в базе данных.MSmerge_genhistoryсодержит одну строку для каждого поколения. Поколение — это коллекция изменений, которые доставляются издателю или подписчику. Поколения закрываются при каждом запуске агента слияния; последующие изменения в базе данных добавляются в одно или несколько открытых поколений.
Процесс отслеживания изменений
Следующий процесс отслеживания изменений используется для всех нефильтрованных таблиц:
При выполнении вставки или обновления в опубликованной таблице срабатывает триггер
MSmerge_ins_<GUID>илиMSmerge_upd_<GUID>, и строка вставляется в системную таблицуMSmerge_contents. СтолбецrowguidMSmerge_contentsсодержит GUID для вставленной или обновленной строки, что указывает на необходимость отправки этой соответствующей строки из пользовательской таблицы издателю или подписчикам при следующей повторной синхронизации. Если последующие обновления происходят в строке в пользовательской таблице, строкаMSmerge_contentsобновляется, чтобы отразить это состояние.При удалении в опубликованной таблице
MSmerge_del_<GUID>триггер срабатывает и строка вставляется в системную таблицуMSmerge_tombstone. СтолбецrowguidMSmerge_tombstoneсодержит GUID для удаленной строки, указывающий на то, что при следующей синхронизации должно быть отправлено удаление издателю или подписчикам для соответствующей удаленной строки в таблице пользователя. Если удаленная строка содержится вMSmerge_contents(так как она была вставлена или обновлена с момента последней синхронизации), строка удаляется изMSmerge_contents.
Отслеживание изменений для фильтруемых таблиц
Системные таблицы
Помимо системных таблиц, описанных в предыдущем разделе, три таблицы в базе данных публикации содержат метаданные для отслеживания изменений в фильтруемых таблицах:
MSmerge_partition_groupsсодержит одну строку для каждой секции, определенной в публикации. Секции могут быть:Определяется явным образом с помощью
sp_addmergepartitionили страницы секций данных диалогового окна "Свойства публикации".Создается автоматически при синхронизации подписчика, если для подписчика требуется раздел, в котором еще нет записи
MSmerge_partition_groups.
MSmerge_current_partition_mappingsсодержит одну строку для каждой уникальной комбинации строк вMSmerge_contentsиMSmerge_partition_groups. Например, если строка в пользовательской таблице принадлежит двум разделам, а строка обновляется, одна строка вставляется вMSmerge_contents, чтобы отразить обновление, а две строки вставляются вMSmerge_current_partition_mappings, чтобы указать, что обновленная строка принадлежит двум разделам.MSmerge_past_partition_mappingsсодержит одну строку для каждой строки, которая больше не принадлежит данной секции. Строка перемещается из раздела, если:Строка удаляется. Если строка удаляется из пользовательской таблицы, в
MSmerge_tombstoneвставляется строка и вMSmerge_past_partition_mappingsвставляется одна или несколько строк.Значение в столбце, используемом для фильтрации, изменилось. Например, если параметризованный фильтр основан на состоянии, в котором находится компания, и компания перемещается, строка для компании (и связанные строки в других таблицах) может выйти из раздела данных одного продавца в секцию для другого продавца. Если строка обновляется таким образом, что она больше не принадлежит разделу, строка вставляется или обновляется в
MSmerge_contents, и вMSmerge_past_partition_mappingsвставляется одна или несколько строк.
Замечание
Если используются неперекрывающиеся разделы с одной подпиской на раздел (значение 3 для параметра @partition_options из sp_addmergearticle), системные таблицы MSmerge_current_partition_mappings и MSmerge_past_partition_mappings не используются для отслеживания сопоставлений разделов строк, так как каждая строка принадлежит только одному разделу и может быть изменена только на одном участнике.
Процесс отслеживания изменений
Описанный ранее процесс (в разделе "Отслеживание изменений для нефильтрованных таблиц") для нефильтрованных таблиц также используется для отфильтрованных таблиц со следующими дополнениями:
При вставке данных в опубликованную таблицу, помимо обновления или вставки данных в
MSmerge_contents, для каждой секции, к которой принадлежит строка, вMSmerge_current_partition_mappingsдобавляется отображение сегмента.При обновлении опубликованной таблицы, помимо обновления или вставки данных в
MSmerge_contents, если для каждой секции, к которой относится строка, вMSmerge_current_partition_mappingsне существует сопоставления секций, то оно добавляется. Если обновление привело к перемещению строки из одной секции вMSmerge_current_partition_mappingsдругую, строка обновляется и добавляется вMSmerge_past_partition_mappings.При удалении в опубликованной таблице, дополнительно к строке, вставленной в
MSmerge_tombstone, строка удаляется изMSmerge_current_partition_mappingsи добавляется вMSmerge_past_partition_mappings.
Изменение перечисления
Системные таблицы и процедуры
При запуске агента слияния изменения перечисляются с помощью нескольких системных таблиц и хранимых процедур:
MSmerge_genhistoryсодержит одну строку для каждого поколения. Поколение — это коллекция изменений, которые доставляются издателю или подписчику. Поколения закрываются при каждом запуске агента слияния; последующие изменения в базе данных добавляются в одно или несколько открытых поколений.sysmergesubscriptionsсодержит сведения о подписках, включая запись последних поколений изменений, отправленных и полученных узлом. В базе данных публикации эта таблица содержит строку издателя и одну строку для каждого подписчика. В базе данных подписки эта таблица обычно содержит строку для подписчика и строку издателя.MSmerge_generation_partition_mappingsиспользуется только для отфильтрованных таблиц, записывая, содержит ли данное поколение какие-либо изменения, относящиеся к заданному разделу. Эта таблица в базе данных публикации содержит одну строку для каждого уникального сочетания строк вMSmerge_genhistoryиMSmerge_partition_groups.sp_MSmakegenerationзакрывает все открытые поколения в начале перечислительного процесса.sp_MSenumchangesперечисляет изменения для таблиц (в этом процессе также используются несколько связанных процедур, имена которых начинаются сsp_MSenumchanges).sp_MSgetmetadataопределяет, следует ли применять изменение с одного узла на другом узле в качестве вставки, обновления или удаления.
Процесс перечисления изменений
Во время перечисления изменений происходит следующий процесс:
Системная процедура
sp_MSmakegenerationвызывается:Для нефильтрованных и отфильтрованных таблиц эта процедура закрывает все открытые поколения, на которые ссылается
MSmerge_genhistory(если закрытые поколения имеют значение1или2в столбцеgenstatus).Для отфильтрованных таблиц эта процедура заполняет системную таблицу
MSmerge_generation_partition_mappings. Если поколение содержит одно или несколько изменений, относящихся к разделу, строка вставляется в системную таблицу. Если поколение не содержит никаких изменений, относящихся к данному разделу, строка не вставляется вMSmerge_generation_partition_mappings, а изменения не перечисляются для подписчиков, получающих этот раздел.
Вызываются хранимая процедура
sp_MSenumchangesи связанные процедуры. Эти процедуры перечисляют изменения, произошедшие с момента последней синхронизации:Процедуры сначала определяют поколение, с которого начинается перечисление, на основе столбцов
sentgen(отправленного последнего поколения) иrecgen(полученного последнего поколения) в таблицеsysmergesubscriptions.Например, при определении изменений для поколений, которые должны быть перечислены для данного подписчика, сравниваются
sentgenдля подписчика (хранящиеся в базе данных публикации) иrecgenдля подписчика (хранящегося в базе данных подписки). Если значения одинаковы (что означает, что последнее поколение, отправленное издателем, успешно получено подписчиком), изменения перечисляются начиная с следующего поколения.MSmerge_genhistoryЕсли значения не совпадают, используется меньшее из двух значений, чтобы гарантировать отправку всех необходимых изменений.Затем процедуры перечисляют изменения:
Для нефильтрованных таблиц перечисляются все изменения, содержащиеся в поколениях, следующих после поколения в
sentgenилиrecgen:MSmerge_genhistoryсоединяется сMSmerge_contents, аMSmerge_tombstoneопределяет, какие изменения необходимо отправить.Для отфильтрованных таблиц
MSmerge_generation_partition_mappingsприсоединяется к:MSmerge_current_partition_mappingsиMSmerge_contents; иMSmerge_past_partition_mappingsиMSmerge_tombstone, чтобы определить, какие изменения относятся к разделу, который получает подписчик.
Хранимая процедура
sp_MSgetmetadataвызывается, чтобы определить, следует ли применять изменение как вставку, обновление или удаление. На этом этапе выполняется обнаружение конфликтов и разрешение конфликтов; Дополнительные сведения см. в статье об обнаружении и разрешении конфликтов при репликации методом слияния.
Связанный контент
- Репликация слиянием
- MSmerge_contents (Transact-SQL)
- MSmerge_current_partition_mappings
- MSmerge_generation_partition_mappings (Transact-SQL)
- MSmerge_genhistory (Transact-SQL)
- MSmerge_partition_groups (Transact-SQL)
- MSmerge_past_partition_mappings (Transact-SQL)
- MSmerge_tombstone (Transact-SQL)
- sp_addmergearticle (Transact-SQL)
- sp_addmergepartition (Transact-SQL)
- sysmergearticles (Transact-SQL)
- sysmergesubscriptions (Transact-SQL)
- Объединение фильтров
- Параметризованные фильтры — параметризованные фильтры строк