Как репликация слиянием инициализирует публикации и подписки

Репликация слиянием должна инициализировать издатель и подписчик, прежде чем они смогут обмениваться данными между собой. Этот раздел содержит сведения о последовательности инициализации.

Инициализация публикации

В следующем списке перечисляются шаги инициализации для публикации, выполняемые при запуске каждой из упомянутых хранимых процедур или после завершения работы мастера создания публикаций. Процесс инициализации продолжается после того, как впервые для публикации будет запущен агент моментальных снимков.

  • sp_replicationdboption

    • База данных публикации помечается для репликации. Удалить базу данных невозможно, пока не удалена репликация.

    • К базе данных публикации добавляются системные таблицы (кроме случая, когда в базе данных уже есть публикация слиянием). Полный список системных таблиц см. в подразделе «Системные таблицы, создаваемые в базах данных публикации и подписки» этого раздела.

  • sp_addmergepublication

    • Записи для публикации добавляются к системным таблицам.
  • sp_addpublication_snapshot

    • К системе агента SQL Server добавляется задание агента моментальных снимков. Имя задания вводится в следующем виде: <Publisher>-<PublicationDatabase>-<Publication>-<Integer>.
  • sp_addmergearticle

    • Каждый реплицируемый объект помечается для репликации. Объект не может быть удален, пока соответствующая статья не будет удалена из всех публикаций.

    • Записи для каждой статьи добавляются к системным таблицам.

Остальная часть инициализации базы данных публикации происходит при первоначальном запуске агента моментальных снимков для публикации (при последующих запусках агента моментальных снимков база данных публикации повторно не инициализируется). При применении мастера создания публикаций исходный моментальный снимок создается по умолчанию после завершения работы мастера. При применении хранимых процедур следует запустить задание агента или запустить непосредственно агент. Дополнительные сведения о запуске агентов см. в разделе Как запустить и остановить агент репликации (среда SQL Server Management Studio) и Основные понятия об исполняемых объектах агента репликации.

При первоначальном запуске агента моментальных снимков для публикации:

  • К каждой публикуемой таблице добавляется столбец с именем rowguid, кроме случаев, когда в таблице уже есть столбец данных типа uniqueidentifier с установленным свойством ROWGUIDCOL (в таком случае используется этот столбец). Столбец rowguid используется для уникальной идентификации каждой строки в каждой публикуемой таблице. Если таблица удаляется из публикации, столбец rowguid удаляется; если существующий столбец был использован для слежения, столбец не удаляется.

  • Для каждой публикуемой таблицы в базе данных публикации создаются следующие объекты (все они создаются в схеме dbo):

    • К публикуемым таблицам для отслеживания изменений добавляются триггеры Insert, Update и Delete. Триггерам присваиваются имена в следующем виде: MSmerge_ins_<GUID>, MSmerge_upd_<GUID> и MSmerge_del_<GUID>. Значение идентификатора GUID формируется на основе записи для статьи в системной таблице sysmergearticles.

    • Создаются хранимые процедуры для обработки вставок, обновлений и удалений в публикуемых таблицах и для выполнения некоторых других операций, связанных с репликацией.

    • Создаются представления для управления вставками, обновлениями, удалениями и фильтрацией.

    • Создаются таблицы конфликтов для хранения сведений о конфликтах. Таблицы конфликтов соответствуют схеме публикуемых таблиц: для каждой публикуемой таблицы составляется сценарий, который затем используется для создания таблицы конфликтов в базе данных публикации. Таблицам конфликтов присваиваются имена в следующем виде: dbo.MSmerge_conflict_<Publication>_<Article>.

При каждом запуске агента моментальных снимков для каждой статьи в базе данных публикации создаются следующие типы файлов (с соответствующими им расширениями):

  • схема (SCH);

  • ограничения и индексы (DRI);

  • триггеры (TRG);

  • данные системной таблицы (SYS);

  • таблицы конфликтов (CFT).

  • Данные (BCP) — не создаются для публикаций с параметризованными фильтрами.

    Если в публикации не используются никакие параметризованные фильтры, моментальный снимок содержит данные для публикуемых таблиц в наборе BCP-файлов. Если в публикации используются параметризованные фильтры (что типично для публикаций слиянием), исходный моментальный снимок не содержит каких-либо данных. Данные передаются с помощью моментального снимка для секции подписчика, как описано в разделе «Инициализация подписки».

Инициализация подписки

Каждая подписка инициализируется, когда для подписки выполняется агент слияния, копирующий исходный моментальный снимок в базу данных подписки. Кроме схемы и данных реплицируемых объектов моментальный снимок содержит системные таблицы, представления, триггеры и хранимые процедуры, существующие в базе данных публикации (в базу данных подписки также копируются одна или две дополнительные системные таблицы). Полный список системных таблиц см. в подразделе «Системные таблицы, создаваемые в базах данных публикации и подписки» этого раздела. В случае повторной инициализации подписки все реплицированные объекты и объекты системы репликации перезаписываются.

Если ни одна из таблиц в базе данных публикации не использует параметризованных фильтров, один и тот же моментальный снимок публикации копируется на каждый подписчик. Если используется один или несколько параметризованных фильтров, способ инициализации каждой подписки подчиняется следующим логическим правилам:

  • Если расположение моментального снимка передается агенту слияния из командной строки:

    • применить моментальный снимок из этого расположения.
  • Иначе, если моментальный снимок был сформирован заранее:

    • получить расположение моментального снимка из таблицы MSmerge_dynamic_snapshots базы данных публикации и применить моментальный снимок из этого расположения.
  • Иначе, если публикация разрешает подписчикам запускать создание моментальных снимков:

    • применить этот моментальный снимок к подписчику, если моментальный снимок уже был создан для другого подписчика с той же секцией.

    • Иначе, создать и применить моментальный снимок к подписчику.

  • Иначе, инициализировать подписчика, применяя инструкции SELECT к таблицам в публикации. Такой подход значительно медленнее, чем использование моментального снимка для секции подписчика.

Если передача моментального снимка прерывается в любой точке, она автоматически возобновляется без повторной передачи файлов, которые уже были переданы полностью. Единицей доставки для агента моментальных снимков является BCP-файл каждой статьи публикации, поэтому файлы, которые доставлены частично, должны повторно доставляться в полном объеме. Однако возобновление моментального снимка может значительно снизить объем передаваемых данных и гарантировать своевременную доставку моментального снимка, даже если соединение ненадежно. Дополнительные сведения о создании моментальных снимков см. в разделе Моментальные снимки для публикаций слиянием с параметризованными фильтрами.

Расположение моментальных снимков

На расположение моментальных снимков влияют следующие условия: путь стандартной или альтернативной папки моментальных снимков; использует ли публикация в качестве папки моментальных снимков UNC-путь или общий ресурс FTP; использует ли публикация параметризованные фильтры. В этих примерах предполагается, что папка моментальных снимков находится по следующему адресу: \\<Компьютер>\<Папка>\:

  • Если публикация использует UNC, первая часть пути выглядит как: \\<Компьютер>\<Папка>\unc\. Если она использует FTP, то: \\<Компьютер>\<Папка>\ftp\.

  • Если публикация использует UNC и не использует параметризованные фильтры, путь выглядит как: \\<Компьютер>\<Папка>\unc\<Издатель><БД_издателя><publication>

  • Если публикация использует UNC и параметризованные фильтры, расположение основывается на пути к папке моментальных снимков и критериях параметризованного фильтра строк для публикации. Например, если статья фильтруется с помощью функции HOST_NAME() и значение функции HOST_NAME() для секции равно «SalesLaptop», путь к моментальному снимку для этой секции будет иметь следующий вид: \\<Компьютер>\<Папка>\unc\<Издатель><БД_издателя><публикация>\ SalesLaptop_12\, где 12 — внутренний идентификатор секции.

Системные таблицы, создаваемые в базах данных публикации и подписки

В базе данных публикации и в каждой базе данных подписки создаются следующие таблицы.

Таблица

Описание

MSdynamicsnapshotjobs (Transact-SQL)

Содержит сведения о заданиях моментального снимка для публикаций с параметризованными фильтрами.

MSdynamicsnapshotviews (Transact-SQL)

Отслеживает все временные представления моментальных снимков, созданные агентом моментальных снимков. Она используется системой для очистки представлений в случае аварийного завершения работы агента SQL Server или агента моментальных снимков.

MSmerge_altsyncpartners (Transact-SQL)

Отслеживает, в каком качестве текущий участник по синхронизации выступает для издателя.

MSmerge_articlehistory (Transact-SQL)

Отслеживает изменения, внесенные в статьи во время сеанса синхронизации агента слияния, и содержит по одной строке для каждой статьи, в которую были внесены изменения.

MSmerge_conflicts_info (Transact-SQL)

Отслеживает конфликты, возникшие в ходе синхронизации подписки на публикацию слиянием.

MSmerge_contents (Transact-SQL)

Содержит одну строку для каждой строки, измененной в текущей базе данных со времени ее публикации. Данная таблица используется процессом слияния для определения изменившихся строк.

MSmerge_current_partition_mappings

Содержит по одной строке для каждой секции, к которой принадлежит данная измененная строка.

Таблица MSmerge_dynamic_snapshots (Transact-SQL)

Отслеживает местонахождение моментального снимка для каждой секции, определенной для публикации слиянием.

MSmerge_errorlineage (Transact-SQL)

Содержит строки, которые были удалены на подписчике, но удаление которых не было распространено на издателя.

MSmerge_generation_partition_mappings (Transact-SQL)

Отслеживает, содержит ли данное поколение какие-либо изменения, значимые для данной секции.

MSmerge_genhistory (Transact-SQL)

Содержит одну строку для каждого поколения. Поколение — это коллекция изменений, доставляемых издателю или подписчику. Поколения закрываются при каждом запуске агента слияния; последующие изменения в базе данных добавляются к одному или нескольким открытым поколениям.

MSmerge_history (Transact-SQL)

Содержит строки журнала с подробными описаниями результатов предыдущих сеансов заданий агента слияния.

MSmerge_identity_range (Transact-SQL)

Отслеживает числовые диапазоны, присвоенные столбцам идентификаторов для подписок на публикации, для которых присвоение диапазонов автоматически управляется системой репликации.

MSmerge_metadataaction_request (Transact-SQL)

Содержит по одной строке для каждого компенсирующего действия. Компенсирующее действие выполняется, чтобы откатить изменение на одном узле, если это изменение завершилось неудачей на другом узле.

MSmerge_partition_groups (Transact-SQL)

Содержит по одной строке для каждой предварительно вычисляемой секции в данной базе данных.

MSmerge_past_partition_mappings (Transact-SQL)

Содержит по одной строке для каждой секции, к которой принадлежала, но более не принадлежит данная измененная строка.

MSmerge_replinfo (Transact-SQL)

Содержит по одной строке для каждой подписки. Эта таблица отслеживает внутренние сведения об отосланных и полученных поколениях.

MSmerge_sessions (Transact-SQL)

Содержит строки журнала с результатами предыдущих сеансов заданий агента слияния.

MSmerge_settingshistory (Transact-SQL)

Содержит журнал изменений, внесенных в свойства статьи и публикации, по одной строке для каждого внесенного изменения.

MSmerge_tombstone (Transact-SQL)

Содержит сведения об удаленных строках и позволяет распространять удаления другим подписчикам.

MSrepl_errors (Transact-SQL)

Содержит подробные сведения о любых сбоях агентов.

sysmergearticles (Transact-SQL)

Содержит по одной строке для каждой статьи публикаций слиянием.

sysmergepartitioninfo (Transact-SQL)

Содержит сведения о секциях для каждой статьи, по одной строке для статьи.

sysmergepartitioninfoview (Transact-SQL)

Содержит сведения о секционировании для статей таблиц.

sysmergepublications (Transact-SQL)

Содержит по одной строке для каждой публикации слиянием.

sysmergeschemaarticles (Transact-SQL)

Отслеживает статьи, содержащие только схемы, например хранимые процедуры.

sysmergeschemachange (Transact-SQL)

Содержит сведения о публикуемых статьях, формируемые агентом моментальных снимков.

sysmergesubscriptions (Transact-SQL)

Содержит по одной строке для каждого подписчика.

sysmergesubsetfilters (Transact-SQL)

Содержит сведения о фильтрах соединения для секционированных статей.

Кроме того, в каждой базе данных подписки создается таблица MSsnapshotdeliveryprogress, а в каждой базе данных подписки, использующей подписку по запросу, — таблица MSsubscription_properties:

Таблица

Описание

MSsnapshotdeliveryprogress (Transact-SQL)

Отслеживает файлы, успешно доставленные подписчику при применении моментального снимка. Эти данные используются, чтобы возобновить доставку файлов в случае, если агенту слияния не удастся доставить все файлы в течение сеанса.

MSsubscription_properties (Transact-SQL)

Содержит сведения о параметрах, необходимые для выполнения агентов репликации на подписчике.