Создание моментального снимка для публикации слиянием с параметризованными фильтрами
В данном разделе описывается процесс создания моментального снимка для публикации слиянием с параметризованными фильтрами в SQL Server 2012 с помощью среды Среда SQL Server Management Studio, Transact-SQL или объектов RMO.
В этом разделе
Перед началом работы выполните следующие действия.
Рекомендации
Для создания моментального снимка для публикации слиянием с параметризованными фильтрами используется:
Среда SQL Server Management Studio
Transact-SQL
объекты RMO;
Перед началом
Рекомендации
При создании моментальных снимков для публикации слиянием с помощью параметризованных фильтров необходимо сначала создать стандартный моментальный снимок (схему), который будет содержать все опубликованные данные и метаданные подписчика для подписки. Дополнительные сведения см. в разделе Создание и применение исходного моментального снимка. После создания моментального снимка схемы можно создать моментальный снимок, содержащий секцию опубликованных данных для конкретного подписчика.
Если при фильтрации одной или нескольких статей публикации получаются неперекрывающиеся секции, которые являются уникальными для каждой подписки, метаданные очищаются при каждом запуске агента слияния. Это означает, что срок действия секционированного моментального снимка истекает быстрее. Если этот параметр выбран, рекомендуется рассмотреть возможность разрешения создания и отправки моментальных снимков подписчикам. Дополнительные сведения о параметрах фильтрации см. в подразделе «Установка параметров секций» раздела Моментальные снимки для публикаций слиянием с параметризованными фильтрами.
[Top]
Использование среды SQL Server Management Studio
Для формирования моментальных снимков секций перейдите на страницу Секции данных диалогового окна Свойства публикации — <публикация>. Дополнительные сведения о доступе к этому диалоговому окну см. в разделе Просмотр и изменение свойств публикации. Подписчикам можно разрешить инициировать создание и доставку или только создание моментальных снимков.
Перед созданием моментальных снимков для одной или нескольких секций необходимо следующее.
Создать публикацию слиянием при помощи мастера создания публикаций и указать один или несколько параметризованных фильтров строк на странице Добавление фильтра окна мастера. Дополнительные сведения см. в разделе Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.
Создайте моментальный снимок схемы для публикации. По умолчанию создание моментального снимка схемы происходит по завершении выполнения мастера создания публикаций; создание моментального снимка схемы также возможно из среды Среда SQL Server Management Studio.
Создание моментального снимка схемы
Подключитесь к издателю в Среда Management Studio, затем разверните узел сервера.
Раскройте папку Репликация, а затем — папку Публикации.
Щелкните правой кнопкой мыши публикацию, для который нужно создать моментальный снимок, а затем выберите Просмотреть состояние агента моментальных снимков.
В диалоговом окне Просмотр состояния агента моментальных снимков — <публикация> нажмите кнопку Пуск.
Когда агент моментальных снимков закончит создание моментального снимка, на экране появится сообщение: «[100%] Сформирован моментальный снимок 17 статей».
Предоставление разрешения подписчикам запускать создание и доставку моментальных снимков
На странице Секции данных диалогового окна Свойства публикации — <публикация> выберите Автоматически определять секцию и при необходимости создавать моментальный снимок при попытке синхронизации от нового подписчика.
Нажмите кнопку ОК.
Создание и обновление моментальных снимков
На странице Секции данных диалогового окна Свойства публикации — <публикация> нажмите кнопку Добавить.
Введите значение HOST_NAME() или значение SUSER_SNAME(), относящееся к секции, для которой нужно создать моментальный снимок.
При необходимости укажите расписание, по которому будут обновляться моментальные снимки.
Установите флажок Запланировать запуск агента моментальных снимков для этой секции в следующее время.
Примите расписание по умолчанию для обновления моментальных снимков или нажмите кнопку Изменить, чтобы указать собственное расписание.
Нажмите кнопку ОК, чтобы вернуться в диалоговое окно Свойства публикации — <публикация>.
Выберите секцию в сетке свойств, затем щелкните Создать выбранные моментальные снимки.
Нажмите кнопку ОК.
[Top]
Использование Transact-SQL
С помощью хранимых процедур и агента моментальных снимков можно выполнить следующие действия:
разрешить подписчикам запрашивать создание моментального снимка и его применение при первоначальной синхронизации;
предварительно создавать моментальные снимки для каждой секции;
создать вручную моментальный снимок для каждого подписчика.
Примечание по безопасности По возможности предлагайте пользователям вводить учетные данные безопасности во время выполнения приложения. При необходимости хранения учетных данных в файле скрипта этот файл следует защитить от несанкционированного доступа.
Создание публикации, которая позволяет подписчикам инициировать формирование и доставку моментальных снимков
В базе данных публикации на издателе, выполните процедуру изменения задержки и проверки соединений для репликации транзакций (sp_addmergepublication (Transact-SQL)). Укажите значения следующих параметров:
имя публикации в качестве значения параметра @publication;
значение true параметра @allow_subscriber_initiated_snapshot, позволяющее подписчикам запускать процесс создания моментального снимка;
допустимое число параллельно выполняемых процессов динамических моментальных снимков в качестве значения параметра @max_concurrent_dynamic_snapshots (необязательно). Если выполняется максимальное число процессов и подписчик пытается создать моментальный снимок, то процесс помещается в очередь. По умолчанию число параллельных процессов не ограничено.
На подписчике выполните хранимую процедуру sp_addpublication_snapshot (Transact-SQL). В качестве значения параметра @publication укажите имя публикации, которое использовалось в шаге 1, а также учетные данные Microsoft Windows, под которыми выполняется Агент моментальных снимков репликации, — в качестве значений параметров @job_login и @password. Если агент при соединении с издателем будет использовать проверку подлинности SQL Server, то необходимо также указать значение 0 для параметра @publisher_security_mode и данные входа Microsoft SQL Server в параметрах @publisher_login и @publisher_password. Будет создано задание агента моментальных снимков для публикации. Дополнительные сведения о формировании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Создание и применение исходного моментального снимка.
Примечание по безопасности Если издатель настраивается с удаленным распространителем, то значения, передаваемые для всех аргументов, включая job_login и job_password, передаются распространителю в формате обычного (незашифрованного) текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в разделе Включение шифрования соединений в ядре СУБД (диспетчер конфигурации SQL Server).
Выполните процедуру sp_addmergearticle (Transact-SQL), чтобы добавить статьи в публикацию. Эту хранимую процедуру необходимо выполнить один раз для каждой статьи в публикации. При использовании параметризованных фильтров необходимо указать параметризованный фильтр строк для одной или нескольких статей, использующих параметр @subset_filterclause. Дополнительные сведения см. в разделе Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.
Если другие статьи будут фильтроваться на основании параметризованного фильтра строк, выполните процедуру sp_addmergefilter (Transact-SQL), чтобы определить между статьями соединение или связь логических записей. Эту хранимую процедуру необходимо выполнить один раз для каждой определяемой связи. Дополнительные сведения см. в разделе Определение и изменение фильтра соединения между статьями публикации слиянием.
Если агент слияния запрашивает инициализацию подписчика моментальным снимком, то автоматически создается моментальный снимок для секции запрашивающей подписки.
Создание публикации и предварительное создание или автоматическое обновление моментальных снимков
Чтобы создать публикацию, выполните хранимую процедуру sp_addmergepublication (Transact-SQL). Дополнительные сведения см. в разделе Создание публикации.
На подписчике выполните хранимую процедуру sp_addpublication_snapshot (Transact-SQL). Укажите имя публикации, использовавшееся на шаге 1, в параметре @publication, а учетные данные Windows, с которыми работает агент моментальных снимков, — в параметрах @job_login и @password. Если агент при соединении с издателем будет использовать проверку подлинности SQL Server, то необходимо также указать значение 0 для параметра @publisher_security_mode и данные входа SQL Server в параметрах @publisher_login и @publisher_password. Будет создано задание агента моментальных снимков для публикации. Дополнительные сведения о формировании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Создание и применение исходного моментального снимка.
Примечание по безопасности Если издатель настраивается с удаленным распространителем, то значения, передаваемые для всех аргументов, включая job_login и job_password, передаются распространителю в формате обычного (незашифрованного) текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в разделе Включение шифрования соединений в ядре СУБД (диспетчер конфигурации SQL Server).
Выполните процедуру sp_addmergearticle (Transact-SQL), чтобы добавить статьи в публикацию. Эту хранимую процедуру необходимо выполнить один раз для каждой статьи в публикации. При использовании параметризованных фильтров необходимо указать параметризованный фильтр строк для одной статьи, использующей параметр @subset_filterclause. Дополнительные сведения см. в разделе Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.
Если другие статьи будут фильтроваться на основании параметризованного фильтра строк, выполните процедуру sp_addmergefilter (Transact-SQL), чтобы определить между статьями соединение или связь логических записей. Эту хранимую процедуру необходимо выполнить один раз для каждой определяемой связи. Дополнительные сведения см. в разделе Определение и изменение фильтра соединения между статьями публикации слиянием.
На издателе в базе данных публикации выполните хранимую процедуру sp_helpmergepublication (Transact-SQL), указав в параметре @publication значение из шага 1. Запомните значение параметра snapshot_jobid в результирующем наборе.
Преобразуйте значение параметра snapshot_jobid, полученное в шаге 5, в тип uniqueidentifier.
На издателе в базе данных msdb выполните хранимую процедуру sp_start_job (Transact-SQL), при этом присвойте преобразованное значение, полученное в шаге 6, параметру @job_id.
В базе данных публикации на издателе выполните процедуру изменения задержки и проверки соединений для репликации транзакций (sp_addmergepartition (Transact-SQL)). Укажите имя публикации из шага 1 в качестве значения параметра @publication, а также значение, определяющее секцию, в качестве значения параметра @suser_sname, если в предложении фильтра используется функция SUSER_SNAME (Transact-SQL), либо @host_name, если в предложении фильтра используется функция HOST_NAME (Transact-SQL).
На издателе в базе данных публикации выполните хранимую процедуру Хранимая процедура sp_adddynamicsnapshot_job (Transact-SQL). Укажите имя публикации из шага 1 в качестве значения параметра @publication, значение параметра @suser_sname или @host_name из шага 8, а также расписание для этого задания. Будет создано задание, создающее параметризованный моментальный снимок для указанной секции. Дополнительные сведения см. в разделе Указание расписаний синхронизации.
Примечание Это задание выполняется в той же учетной записи Windows, что и задание исходного моментального снимка в шаге 2. Чтобы удалить задание параметризованного моментального снимка и связанную с ним секцию данных, выполните хранимую процедуру sp_dropdynamicsnapshot_job (Transact-SQL).
На издателе в базе данных публикации выполните хранимую процедуру sp_helpmergepartition (Transact-SQL), при этом укажите значение параметра @publication из шага 1 и значение параметра @suser_sname или @host_name из шага 8. Запомните значение параметра dynamic_snapshot_jobid в результирующем наборе.
На распространителе в базе данных msdb выполните хранимую процедуру sp_start_job (Transact-SQL); при этом присвойте значение, полученное в шаге 9, параметру @job_id. Будет запущено задание параметризованного моментального снимка для данной секции.
Чтобы создать секционированный снимок для каждой подписки, повторите шаги 8–11.
Создание публикации и моментальных снимков для каждой секции вручную
Чтобы создать публикацию, выполните хранимую процедуру sp_addmergepublication (Transact-SQL). Дополнительные сведения см. в разделе Создание публикации.
На подписчике выполните хранимую процедуру sp_addpublication_snapshot (Transact-SQL). Укажите имя публикации, использовавшееся на шаге 1, в параметре @publication, а учетные данные Windows, с которыми работает агент моментальных снимков, — в параметрах @job_login и @password. Если агент при соединении с издателем будет использовать проверку подлинности SQL Server, то необходимо также указать значение 0 для параметра @publisher_security_mode и данные входа SQL Server в параметрах @publisher_login и @publisher_password. Будет создано задание агента моментальных снимков для публикации. Дополнительные сведения о формировании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Создание и применение исходного моментального снимка.
Примечание по безопасности Если издатель настраивается с удаленным распространителем, то значения, передаваемые для всех аргументов, включая job_login и job_password, передаются распространителю в формате обычного (незашифрованного) текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в разделе Включение шифрования соединений в ядре СУБД (диспетчер конфигурации SQL Server).
Выполните процедуру sp_addmergearticle (Transact-SQL), чтобы добавить статьи в публикацию. Эту хранимую процедуру необходимо выполнить один раз для каждой статьи в публикации. При использовании параметризованных фильтров необходимо указать параметризованный фильтр строк хотя бы для одной статьи, использующей параметр @subset_filterclause. Дополнительные сведения см. в разделе Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.
Если другие статьи будут фильтроваться на основании параметризованного фильтра строк, выполните процедуру sp_addmergefilter (Transact-SQL), чтобы определить между статьями соединение или связь логических записей. Эту хранимую процедуру необходимо выполнить один раз для каждой определяемой связи. Дополнительные сведения см. в разделе Определение и изменение фильтра соединения между статьями публикации слиянием.
Чтобы создать стандартную схему моментального снимка и другие файлы, запустите задание моментального снимка или агент моментальных снимков репликации из командной строки. Дополнительные сведения см. в разделе Создание и применение исходного моментального снимка.
Запустите агент моментальных снимков репликации из командной строки еще раз, чтобы создать файлы массового копирования (BCP-файл); при этом укажите расположение секционированного снимка в качестве значения параметра -DynamicSnapshotLocation, а также одно или оба приведенные ниже свойства, определяющие секцию:
-DynamicFilterHostName, если используется HOST_NAME (Transact-SQL);
-DynamicFilterLogin, если используется SUSER_SNAME (Transact-SQL).
Чтобы создать секционированный снимок для каждой подписки, повторите шаг 6.
Чтобы применить исходный секционированный снимок на подписчиках, запустите агент слияния для каждой подписки; при этом укажите следующие свойства:
-Hostname — значение, с помощью которого определяется секция, если реальное значение параметра HOST_NAME переопределяется;
-DynamicSnapshotLocation — расположение динамического моментального снимка для этой секции.
Примечание |
---|
Дополнительные сведения о программировании агентов репликации см. в разделе Основные понятия исполняемых файлов агента репликации. |
Примеры (Transact-SQL)
В этом примере создается публикация слиянием с параметризованными фильтрами, где подписчики запускают процесс создания моментальных снимков. Значения для параметров @job_login и @job_password передаются с использованием переменных сценария.
-- To avoid storing the login and password in the script file, the value
-- is passed into SQLCMD as a scripting variable. For information about
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks2012';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks2012];
-- Enable AdventureWorks2012 for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks2012.',
@allow_subscriber_initiated_snapshot = N'true',
@publication_compatibility_level = N'90RTM';
-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(login),
@job_password = $(password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains salesperson information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time
-- the subscription is synchronized.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';
EXEC sp_startpublication_snapshot
@publication = @publication;
GO
В этом примере публикация создается с помощью параметризованного фильтра, где для каждого подписчика с помощью хранимой процедуры sp_addmergepartition определена своя секция, а также путем выполнения хранимой процедуры sp_adddynamicsnapshot_job, передающей сведения о секционировании, создано фильтруемое задание моментального снимка. Значения для параметров @job_login и @job_password передаются с использованием переменных сценария.
-- To avoid storing the login and password in the script file, the value
-- is passed into SQLCMD as a scripting variable. For information about
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks2012';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks2012];
-- Enable AdventureWorks2012 for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks2012.',
@allow_subscriber_initiated_snapshot = N'false';
-- Create a new snapshot job for the publication, using the
-- default schedule. Pass credentials at runtime using
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(Login),
@job_password = $(password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains customer information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
-- Start the snapshot agent job.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';
EXEC sp_startpublication_snapshot
@publication = @publication;
GO
PRINT '*** Waiting for the initial snapshot.';
GO
-- Create a temporary table to store the filtered data snapshot
-- job information.
CREATE TABLE #temp (id int,
job_name sysname,
job_id uniqueidentifier,
dynamic_filter_login sysname NULL,
dynamic_filter_hostname sysname NULL,
dynamic_snapshot_location nvarchar(255),
frequency_type int,
frequency_interval int,
frequency_subday_type int,
frequency_subday_interval int,
frequency_relative_interval int,
frequency_recurrence_factor int,
active_start_date int,
active_end_date int,
active_start_time int,
active_end_time int
)
-- Create each snapshot for a partition
-- The initial snapshot must already be generated.
DECLARE @publication AS sysname;
DECLARE @jobname AS sysname
DECLARE @hostname AS sysname
SET @publication = N'AdvWorksSalesPersonMerge';
SET @hostname = N'adventure-works\Fernando';
WHILE NOT EXISTS(SELECT * FROM sysmergepublications
WHERE [name] = @publication
AND snapshot_ready = 1)
BEGIN
WAITFOR DELAY '00:00:05'
END
-- Create a data partition by overriding HOST_NAME().
EXEC sp_addmergepartition
@publication = @publication,
@host_name = @hostname;
-- Create the filtered data snapshot job, and use the returned
-- information to start the job.
EXEC sp_adddynamicsnapshot_job
@publication = @publication,
@host_name = @hostname;
INSERT INTO #temp (id, job_name, job_id, dynamic_filter_login,
dynamic_filter_hostname, dynamic_snapshot_location,
frequency_type, frequency_interval, frequency_subday_type,
frequency_subday_interval, frequency_relative_interval,
frequency_recurrence_factor, active_start_date, active_end_date,
active_start_time,active_end_time)
EXEC sp_helpdynamicsnapshot_job;
SELECT @jobname = (SELECT DISTINCT job_name FROM #temp WHERE dynamic_filter_hostname = @hostname);
EXEC msdb..sp_start_job @job_name = @jobname;
DROP TABLE #temp;
GO
В этом примере публикация создается с помощью параметризованного фильтра, где путем передачи сведений о секционировании для подписчика должна создаваться своя секция данных и фильтруемое задание моментального снимка. Подписчик передает сведения о секционировании с помощью параметров командной строки, если агенты репликации запускаются вручную. В этом примере предполагается, что также уже создана подписка на публикацию.
-- To avoid storing the login and password in the script file, the value
-- is passed into SQLCMD as a scripting variable. For information about
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks2012';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks2012];
-- Enable AdventureWorks2012 for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks2012.',
@allow_subscriber_initiated_snapshot = N'false';
-- Create a new snapshot job for the publication, using the
-- default schedule. Pass credentials at runtime using
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(Login),
@job_password = $(Password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains customer information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
REM Line breaks are added to improve readability.
REM In a batch file, commands must be made in a single line.
REM Run the Snapshot agent from the command line to generate the standard snapshot
REM schema and other files.
SET DistPub=%computername%
SET PubDB=AdventureWorks2012
SET PubName=AdvWorksSalesPersonMerge
"C:\Program Files\Microsoft SQL Server\110\COM\SNAPSHOT.EXE" -Publication %PubName%
-Publisher %DistPub% -Distributor %DistPub% -PublisherDB %PubDB% -ReplicationType 2
-OutputVerboseLevel 1 -DistributorSecurityMode 1
PAUSE
REM Run the Snapshot agent from the command line, this time to generate
REM the bulk copy (.bcp) data for each Subscriber partition.
SET DistPub=%computername%
SET PubDB=AdventureWorks2012
SET PubName=AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando
MD %SnapshotDir%
"C:\Program Files\Microsoft SQL Server\110\COM\SNAPSHOT.EXE" -Publication %PubName%
-Publisher %DistPub% -Distributor %DistPub% -PublisherDB %PubDB% -ReplicationType 2
-OutputVerboseLevel 1 -DistributorSecurityMode 1 -DynamicFilterHostName "adventure-works\Fernando"
-DynamicSnapshotLocation %SnapshotDir%
PAUSE
REM Run the Merge Agent for each subscription to apply the partitioned
REM snapshot for each Subscriber.
SET Publisher = %computername%
SET Subscriber = %computername%
SET PubDB = AdventureWorks2012
SET SubDB = AdventureWorks2012Replica
SET PubName = AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando
"C:\Program Files\Microsoft SQL Server\110\COM\REPLMERG.EXE" -Publisher %Publisher%
-Subscriber %Subscriber% -Distributor %Publisher% -PublisherDB %PubDB%
-SubscriberDB %SubDB% -Publication %PubName% -PublisherSecurityMode 1 -OutputVerboseLevel 3
-Output -SubscriberSecurityMode 1 -SubscriptionType 3 -DistributorSecurityMode 1
-Hostname "adventure-works\Fernando" -DynamicSnapshotLocation %SnapshotDir%
PAUSE
[Top]
При помощи объектов RMO
Для программного создания секционированных снимков можно использовать объекты RMO следующими способами.
Разрешите подписчикам запрашивать создание моментального снимка и его применение при первоначальной синхронизации.
Создайте предварительно моментальные снимки для каждой секции.
Создайте моментальный снимок вручную для каждого подписчика при помощи агента моментальных снимков.
Примечание |
---|
Если фильтрация статьи приводит к образованию неперекрывающихся секций, уникальных для каждой подписки (если указано значение NonOverlappingSingleSubscription для PartitionOption при создании статьи публикации слиянием), метаданные очищаются при запуске агента слияния. Это означает, что срок действия секционированного снимка истекает быстрее. Если выбран этот режим, рекомендуется рассмотреть возможность разрешения подписчикам создания моментальных снимков. Дополнительные сведения см. в подразделе «Использование соответствующих параметров фильтрации» раздела Параметризованные фильтры строк. |
Примечание по безопасности |
---|
По возможности предлагайте пользователям вводить учетные данные системы безопасности во время выполнения. Если необходимо хранить учетные данные, используйте службы шифрования, предоставляемые платформой Microsoft Windows .NET Framework. |
Создание публикации, которая позволяет подписчикам инициировать формирование и доставку моментальных снимков
Создайте соединение с издателем с помощью класса ServerConnection.
Создайте экземпляр класса ReplicationDatabase для базы данных публикации, установите в качестве значения свойства ConnectionContext экземпляр ServerConnection, созданный на шаге 1, и вызовите метод LoadProperties. Если LoadProperties возвращает значение false, убедитесь, что база данных существует.
Если свойству EnabledMergePublishing присвоено значение false, укажите значение true и вызовите CommitPropertyChanges.
Создайте экземпляр класса MergePublication и укажите для него следующие свойства.
Соединение ServerConnection, созданное на шаге 1, в качестве значения свойства ConnectionContext.
Имя опубликованной базы данных в свойстве DatabaseName.
Имя публикации в качестве значения свойства Name.
Максимальное количество заданий динамических моментальных снимков, которые должны быть выполнены MaxConcurrentDynamicSnapshots. Поскольку инициированные подписчиком запросы на моментальные снимки могут возникнуть в любое время, это свойство ограничивает количество заданий агента моментальных снимков, которые могут выполняться одновременно, когда несколько подписчиков запрашивают секционированные снимки в одно и то же время. Если выполняется максимальное количество заданий, дополнительные запросы на секционированные моментальные снимки помещаются в очередь, пока одно из выполняющихся заданий не будет завершено.
Используйте побитовый логический оператор «ИЛИ» (| в Visual C# и Or в Visual Basic) для добавления значения AllowSubscriberInitiatedSnapshot в Attributes.
Поля Login и Password свойства SnapshotGenerationAgentProcessSecurity содержат учетные данные учетной записи Microsoft Windows, от имени которой выполняются задания агента моментальных снимков.
Примечание Рекомендуется указывать свойство SnapshotGenerationAgentProcessSecurity, если публикация создается членом предопределенной роли сервера sysadmin. Дополнительные сведения см. в разделе Модель безопасности агента репликации.
Чтобы создать публикацию, вызовите метод Create.
Примечание по безопасности При настройке издателя с удаленным распространителем значения, передаваемые для всех свойств, включая SnapshotGenerationAgentProcessSecurity, отправляются распространителю в виде обычного текста. Следует зашифровать соединение между издателем и его удаленным распространителем перед вызовом метода Create. Дополнительные сведения см. в разделе Включение шифрования соединений в ядре СУБД (диспетчер конфигурации SQL Server).
Чтобы добавить статьи к публикации, используйте свойство MergeArticle. Укажите свойство FilterClause хотя бы для одной статьи, определяющей параметризованный фильтр. (Необязательно) Создайте объекты MergeJoinFilter, определяющие фильтры соединения между статьями. Дополнительные сведения см. в разделе Определение статьи.
Если для свойства SnapshotAgentExists указано значение false, вызовите CreateSnapshotAgent, чтобы создать исходное задание агента моментального снимка для этой публикации.
Вызовите метод StartSnapshotGenerationAgentJob объекта MergePublication, созданного в шаге 4. Запустится задание агента по созданию исходного моментального снимка. Дополнительные сведения о формировании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Создание и применение исходного моментального снимка.
(Необязательно) Проверьте, указано ли значение true для свойства SnapshotAvailable, чтобы определить, когда исходный моментальный снимок будет готов к использованию.
Когда агент слияния для подписчика подключается в первый раз, секционированный моментальный снимок создается автоматически.
Создание публикации и предварительное создание или автоматическое обновление моментальных снимков
Чтобы определить публикацию слиянием, используйте экземпляр класса MergePublication. Дополнительные сведения см. в разделе Создание публикации.
Чтобы добавить статьи к публикации, используйте свойство MergeArticle. Укажите свойство FilterClause хотя бы для одной статьи, определяющей параметризованный фильтр, и создайте любые объекты MergeJoinFilter, определяющие фильтры соединения между статьями. Дополнительные сведения см. в разделе Определение статьи.
Если значение SnapshotAgentExists равно false, то для создания задания агента моментальных снимков для этой публикации вызовите метод CreateSnapshotAgent.
Вызовите метод StartSnapshotGenerationAgentJob объекта MergePublication, созданного в шаге 1. Этот метод запускает задание агента по созданию исходного моментального снимка. Дополнительные сведения о создании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Создание и применение исходного моментального снимка.
Проверьте, указано ли значение true для свойства SnapshotAvailable, чтобы определить, когда исходный моментальный снимок будет готов к использованию.
Создайте экземпляр класса MergePartition и укажите критерии параметризованного фильтра для подписчика, используя одно или оба следующих свойства.
Если секция подписчика определена результатом функции SUSER_SNAME (Transact-SQL), используйте DynamicFilterLogin.
Если секция подписчика определена результатом функции HOST_NAME (Transact-SQL) или перегружающей ее функции, используйте DynamicFilterHostName.
Создайте экземпляр класса MergeDynamicSnapshotJob и укажите то же свойство, что и в шаге 6.
Используйте класс ReplicationAgentSchedule, чтобы определить расписание создания фильтрованных моментальных снимков для секции подписчика.
Используя экземпляр MergePublication из шага 1, вызовите метод AddMergePartition. Передайте объект MergePartition, созданный на шаге 6.
Используя экземпляр MergePublication из шага 1, вызовите метод AddMergeDynamicSnapshotJob. Передайте объект MergeDynamicSnapshotJob из шага 7 и объект ReplicationAgentSchedule из шага 8.
Вызовите метод EnumMergeDynamicSnapshotJobs и найдите объект MergeDynamicSnapshotJob для вновь добавленного задания секционированного моментального снимка в возвращенном массиве.
Получите свойство Name для этого задания.
Создайте соединение с распространителем с помощью класса ServerConnection.
Создайте экземпляр класса Server управляющих объектов SQL Server, передав объект ServerConnection из шага 13.
Создайте экземпляр класса Job, передав свойство JobServer объекта Server из шага 14 и имя задания из шага 12.
Вызовите метод Start, чтобы запустить задание секционированного моментального снимка.
Повторите шаги 6 — 16 для каждого подписчика.
Создание публикации и моментальных снимков для каждой секции вручную
Чтобы определить публикацию слиянием, используйте экземпляр класса MergePublication. Дополнительные сведения см. в разделе Создание публикации.
Чтобы добавить статьи в публикацию, используйте свойство MergeArticle. Укажите свойство FilterClause хотя бы для одной статьи, определяющей параметризованный фильтр, и создайте любые объекты MergeJoinFilter, определяющие фильтры соединения между статьями. Дополнительные сведения см. в разделе Определение статьи.
Создайте исходный моментальный снимок. Дополнительные сведения см. в разделе Создание и применение исходного моментального снимка.
Создайте экземпляр класса SnapshotGenerationAgent и укажите следующие необходимые свойства.
Publisher — имя издателя.
PublisherDatabase — имя базы данных публикации.
Publication — имя публикации.
Distributor — имя распространителя.
PublisherSecurityMode — значение Integrated для использования встроенной проверки подлинности Windows или значение Standard для использования проверки подлинности SQL Server.
DistributorSecurityMode — значение Integrated для использования встроенной проверки подлинности Windows или значение Standard для использования проверки подлинности SQL Server.
Укажите значение Merge в параметре ReplicationType.
Задайте одно или несколько следующих свойств, чтобы определить параметры секционирования.
Если секция подписчика определена результатом функции SUSER_SNAME (Transact-SQL), используйте DynamicFilterLogin.
Если секция подписчика определятся результатом функции HOST_NAME (Transact-SQL) или перегружающей ее функции, используйте DynamicFilterHostName.
Вызовите метод GenerateSnapshot.
Повторите шаги 4–7 для каждого подписчика.
Примеры (объекты RMO)
В этом примере создается публикация слиянием, позволяющая подписчикам запрашивать создание моментальных снимков.
// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2012";
ReplicationDatabase publicationDb;
MergePublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Enable the database for merge publication.
publicationDb = new ReplicationDatabase(publicationDbName, conn);
if (publicationDb.LoadProperties())
{
if (!publicationDb.EnabledMergePublishing)
{
publicationDb.EnabledMergePublishing = true;
}
}
else
{
// Do something here if the database does not exist.
throw new ApplicationException(String.Format(
"The {0} database does not exist on {1}.",
publicationDb, publisherName));
}
// Set the required properties for the merge publication.
publication = new MergePublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// Enable precomputed partitions.
publication.PartitionGroupsOption = PartitionGroupsOption.True;
// Specify the Windows account under which the Snapshot Agent job runs.
// This account will be used for the local connection to the
// Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;
// Explicitly set the security mode for the Publisher connection
// Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;
// Enable Subscribers to request snapshot generation and filtering.
publication.Attributes |= PublicationAttributes.AllowSubscriberInitiatedSnapshot;
publication.Attributes |= PublicationAttributes.DynamicFilters;
// Enable pull and push subscriptions.
publication.Attributes |= PublicationAttributes.AllowPull;
publication.Attributes |= PublicationAttributes.AllowPush;
if (!publication.IsExistingObject)
{
// Create the merge publication.
publication.Create();
// Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent();
}
else
{
throw new ApplicationException(String.Format(
"The {0} publication already exists.", publicationName));
}
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"The publication {0} could not be created.", publicationName), ex);
}
finally
{
conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2012"
Dim publicationDb As ReplicationDatabase
Dim publication As MergePublication
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Enable the database for merge publication.
publicationDb = New ReplicationDatabase(publicationDbName, conn)
If publicationDb.LoadProperties() Then
If Not publicationDb.EnabledMergePublishing Then
publicationDb.EnabledMergePublishing = True
End If
Else
' Do something here if the database does not exist.
Throw New ApplicationException(String.Format( _
"The {0} database does not exist on {1}.", _
publicationDb, publisherName))
End If
' Set the required properties for the merge publication.
publication = New MergePublication()
publication.ConnectionContext = conn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' Enable precomputed partitions.
publication.PartitionGroupsOption = PartitionGroupsOption.True
' Specify the Windows account under which the Snapshot Agent job runs.
' This account will be used for the local connection to the
' Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword
' Explicitly set the security mode for the Publisher connection
' Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True
' Enable Subscribers to request snapshot generation and filtering.
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowSubscriberInitiatedSnapshot
publication.Attributes = publication.Attributes Or _
PublicationAttributes.DynamicFilters
' Enable pull and push subscriptions
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowPull
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowPush
If Not publication.IsExistingObject Then
' Create the merge publication.
publication.Create()
' Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent()
Else
Throw New ApplicationException(String.Format( _
"The {0} publication already exists.", publicationName))
End If
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"The publication {0} could not be created.", publicationName), ex)
Finally
conn.Disconnect()
End Try
В этом примере вручную создается секция подписчика и фильтрованный моментальный снимок для публикации слиянием с параметризованными фильтрами строк.
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2012";
string distributorName = publisherInstance;
MergePublication publication;
MergePartition partition;
MergeDynamicSnapshotJob snapshotAgentJob;
ReplicationAgentSchedule schedule;
// Create a connection to the Publisher.
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create a connection to the Distributor to start the Snapshot Agent.
ServerConnection distributorConn = new ServerConnection(distributorName);
try
{
// Connect to the Publisher.
publisherConn.Connect();
// Set the required properties for the publication.
publication = new MergePublication();
publication.ConnectionContext = publisherConn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// If we can't get the properties for this merge publication,
// then throw an application exception.
if (publication.LoadProperties() || publication.SnapshotAvailable)
{
// Set a weekly schedule for the filtered data snapshot.
schedule = new ReplicationAgentSchedule();
schedule.FrequencyType = ScheduleFrequencyType.Weekly;
schedule.FrequencyRecurrenceFactor = 1;
schedule.FrequencyInterval = Convert.ToInt32(0x001);
// Set the value of Hostname that defines the data partition.
partition = new MergePartition();
partition.DynamicFilterHostName = hostname;
snapshotAgentJob = new MergeDynamicSnapshotJob();
snapshotAgentJob.DynamicFilterHostName = hostname;
// Create the partition for the publication with the defined schedule.
publication.AddMergePartition(partition);
publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule);
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication, " +
" or the initial snapshot has not been generated. " +
"Ensure that the publication {0} exists on {1} and " +
"that the Snapshot Agent has run successfully.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Do error handling here.
throw new ApplicationException(string.Format(
"The partition for '{0}' in the {1} publication could not be created.",
hostname, publicationName), ex);
}
finally
{
publisherConn.Disconnect();
if (distributorConn.IsOpen) distributorConn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2012"
Dim distributorName As String = publisherInstance
Dim publication As MergePublication
Dim partition As MergePartition
Dim snapshotAgentJob As MergeDynamicSnapshotJob
Dim schedule As ReplicationAgentSchedule
' Create a connection to the Publisher.
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create a connection to the Distributor to start the Snapshot Agent.
Dim distributorConn As ServerConnection = New ServerConnection(distributorName)
Try
' Connect to the Publisher.
publisherConn.Connect()
' Set the required properties for the publication.
publication = New MergePublication()
publication.ConnectionContext = publisherConn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' If we can't get the properties for this merge publication,
' then throw an application exception.
If (publication.LoadProperties() Or publication.SnapshotAvailable) Then
' Set a weekly schedule for the filtered data snapshot.
schedule = New ReplicationAgentSchedule()
schedule.FrequencyType = ScheduleFrequencyType.Weekly
schedule.FrequencyRecurrenceFactor = 1
schedule.FrequencyInterval = Convert.ToInt32("0x001", 16)
' Set the value of Hostname that defines the data partition.
partition = New MergePartition()
partition.DynamicFilterHostName = hostname
snapshotAgentJob = New MergeDynamicSnapshotJob()
snapshotAgentJob.DynamicFilterHostName = hostname
' Create the partition for the publication with the defined schedule.
publication.AddMergePartition(partition)
publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule)
Else
Throw New ApplicationException(String.Format( _
"Settings could not be retrieved for the publication, " + _
" or the initial snapshot has not been generated. " + _
"Ensure that the publication {0} exists on {1} and " + _
"that the Snapshot Agent has run successfully.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Do error handling here.
Throw New ApplicationException(String.Format( _
"The partition for '{0}' in the {1} publication could not be created.", _
hostname, publicationName), ex)
Finally
publisherConn.Disconnect()
If distributorConn.IsOpen Then
distributorConn.Disconnect()
End If
End Try
В этом примере вручную запускается агент моментальных снимков для создания фильтрованного моментального снимка данных для подписчика на публикацию слиянием с параметризованными фильтрами строк.
// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2012";
string publisherName = publisherInstance;
string distributorName = publisherInstance;
SnapshotGenerationAgent agent;
try
{
// Set the required properties for Snapshot Agent.
agent = new SnapshotGenerationAgent();
agent.Distributor = distributorName;
agent.DistributorSecurityMode = SecurityMode.Integrated;
agent.Publisher = publisherName;
agent.PublisherSecurityMode = SecurityMode.Integrated;
agent.Publication = publicationName;
agent.PublisherDatabase = publicationDbName;
agent.ReplicationType = ReplicationType.Merge;
// Specify the partition information to generate a
// filtered snapshot based on Hostname.
agent.DynamicFilterHostName = hostname;
// Start the agent synchronously.
agent.GenerateSnapshot();
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"A snapshot could not be generated for the {0} publication."
, publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2012"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance
Dim agent As SnapshotGenerationAgent
Try
' Set the required properties for Snapshot Agent.
agent = New SnapshotGenerationAgent()
agent.Distributor = distributorName
agent.DistributorSecurityMode = SecurityMode.Integrated
agent.Publisher = publisherName
agent.PublisherSecurityMode = SecurityMode.Integrated
agent.Publication = publicationName
agent.PublisherDatabase = publicationDbName
agent.ReplicationType = ReplicationType.Merge
' Specify the partition information to generate a
' filtered snapshot based on Hostname.
agent.DynamicFilterHostName = hostname
' Start the agent synchronously.
agent.GenerateSnapshot()
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"A snapshot could not be generated for the {0} publication." _
, publicationName), ex)
End Try
[Top]
См. также
Основные понятия
Параметризованные фильтры строк
Основные понятия системных хранимых процедур репликации
Моментальные снимки для публикаций слиянием с параметризованными фильтрами