Поделиться через


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

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

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

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

  • 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 ):

    • Триггеры вставки, триггеры обновления и триггеры удаления добавляются в опубликованные таблицы для отслеживания изменений. Триггеры именуются в форме 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 для папки моментального снимка; и использует ли публикация параметризованные фильтры. В этих примерах предполагается, что папка моментальных снимков расположена: \\<MyComputer>\<MyFolder>

  • Если в публикации используется UNC, первая часть пути: \\<MyComputer>\<MyFolder>\unc\. Если оно использует FTP, это \\<MyComputer>\<MyFolder>\ftp\.

  • Если публикация использует UNC и не использует параметризованные фильтры, путь будет\\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>

  • Если публикация использует UNC и параметризованные фильтры, расположение определяется на основе пути к папке моментального снимка и параметризованных критериев фильтрации строк для публикации. Например, если статья фильтруется с помощью функции HOST_NAME(), и если значение HOST_NAME() для раздела — это SalesLaptop, то путь к снимку состояния для этого раздела — \\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>\SalesLaptop_12, где 12 — это внутренний идентификатор, используемый для раздела.

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

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

Таблица Описание
MSdynamicsnapshotjobs Содержит информацию о заданиях по созданию снимков для публикаций с параметризованными фильтрами.
MSdynamicsnapshotviews Отслеживает все временные представления моментальных снимков, созданные агентом моментальных снимков. Он используется системой для очистки представлений в случае неожиданного завершения работы агента SQL Server или агента моментальных снимков.
MSmerge_altsyncpartners Отслеживает связь между текущими партнерами синхронизации для издателя.
MSmerge_articlehistory Отслеживает изменения, внесенные в статьи во время сеанса синхронизации агента слияния, с одной строкой для каждой статьи, в которую были внесены изменения.
MSmerge_conflicts_info Отслеживает конфликты, возникающие при синхронизации подписки на публикацию, использующую слияние.
MSmerge_contents Содержит одну строку для каждой строки, измененной в текущей базе данных после публикации. Эта таблица используется процессом слияния для определения измененных строк.
MSmerge_current_partition_mappings Содержит одну строку для каждой секции, к которой принадлежит данная измененная строка.
MSmerge_dynamic_snapshots Отслеживает расположение моментального снимка для каждой секции, определенной для публикации слиянием.
MSmerge_errorlineage Содержит строки, которые были удалены на подписчике, но их удаление не передается издателю.
MSmerge_generation_partition_mappings Отслеживает, содержит ли данное поколение любые изменения, относящиеся к заданному разделу.
MSmerge_genhistory Содержит одну строку для каждого поколения. Поколение — это коллекция изменений, которые доставляются издателю или подписчику. Поколения закрываются при каждом запуске агента слияния; последующие изменения в базе данных добавляются в одно или несколько открытых поколений.
MSmerge_history Содержит строки истории с подробными описаниями результатов предыдущих сеансов заданий агента слияния.
MSmerge_identity_range Отслеживает числовые диапазоны, назначенные идентификационным столбцам для подписок на публикации, для которых репликация автоматически управляет назначениями диапазонов.
MSmerge_metadataaction_request Содержит одну строку для каждого требуемого компенсирующего действия. Компенсирующее действие используется для отката изменения на одном узле, если изменение завершилось ошибкой на другом узле.
MSmerge_partition_groups Содержит одну строку для каждой предварительно вычисляемой секции в данной базе данных.
MSmerge_past_partition_mappings Содержит одну строку для каждого раздела, к которому заданная измененная строка раньше принадлежала, но больше не принадлежит.
MSmerge_replinfo Содержит одну строку для каждой подписки. Эта таблица отслеживает внутренние сведения о отправленных и полученных поколениях.
MSmerge_sessions Содержит исторические строки с результатами предыдущих сессий задания агента слияния.
MSmerge_settingshistory Содержит журнал изменений, внесенных в свойства статьи и публикации, с одной строкой для каждого изменения.
MSmerge_tombstone Содержит сведения об удаленных строках и позволяет распространять информацию об удалениям другим подписчикам.
MSrepl_errors Содержит подробные сведения о сбоях агента.
sysmergearticles Содержит одну строку для каждой статьи слияния.
sysmergepartitioninfo Содержит сведения о секциях для каждой статьи с одной строкой для каждой статьи.
sysmergepartitioninfoview Содержит сведения о партицировании для табличных статей.
sysmergepublications Содержит одну строку для каждой публикации слияния.
sysmergeschemaarticles Отслеживает объекты, включающиеся в схему, такие как хранимые процедуры.
sysmergeschemachange Содержит сведения о опубликованных статьях, созданных агентом моментальных снимков.
sysmergesubscriptions Содержит одну строку для каждого подписчика.
sysmergesubsetfilters Содержит сведения о фильтре соединения для секционированных статей.

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

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