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


Создание и применение исходного моментального снимка

В этом разделе описывается создание и применение начального snapshot в SQL Server 2014 с помощью SQL Server Management Studio, Transact-SQL или объектов RMO. Публикации слиянием, использующие параметризованные фильтры, требуют моментальных снимков, состоящих из двух частей. Дополнительные сведения см. в статье Создание моментального снимка для публикации слиянием с параметризованными фильтрами.

В этом разделе

Использование среды SQL Server Management Studio

По умолчанию, если выполняется агент SQL Server, агент моментальных снимков создает моментальный снимок сразу после того, как создана публикация с помощью мастера создания публикаций. Затем по умолчанию агент распространителя (для репликации моментальных снимков и репликации транзакций) или агент слияния (для подписок на публикацию слиянием) применяет моментальный снимок ко всем подпискам. Моментальный снимок также можно создать с помощью среды SQL Server Management Studio и монитора репликации. Сведения о запуске монитора репликации см. в этой статье.

Создание моментального снимка в среде Management Studio

  1. Подключитесь к издателю в среде Среда Management Studio, а затем раскройте узел сервера.

  2. Раскройте папку Репликация , а затем папку Локальные публикации .

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

  4. В диалоговом окне Просмотр состояния агент моментальных снимков — <публикация> нажмите кнопку Пуск.

Когда агент моментальных снимков закончит создание моментального снимка, на экране появится сообщение: «[100%] Сформирован моментальный снимок 17 статей».

Создание моментального снимка в мониторе репликации

  1. В мониторе репликации раскройте группу издателей на левой панели, а затем раскройте нужного издателя.

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

  3. Чтобы просмотреть состояние агента моментальных снимков, перейдите на вкладку Агенты . Для получения дополнительных сведений щелкните правой кнопкой мыши агент моментальных снимков в сетке и выберите Просмотреть сведения.

Применение моментального снимка

  1. После создания моментальный снимок применяется при синхронизации подписки с помощью агента распространителя или агента слияния:

    • Если агент настроен для постоянной работы (выбор по умолчанию для репликации транзакций), моментальный снимок применяется автоматически после того, как он был создан.

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

    • Если агент настроен для работы по запросу, моментальный снимок применяется при следующем запуске агента.

    Дополнительные сведения о синхронизации подписок см. в разделах Synchronize a Push Subscription и Synchronize a Pull Subscription.

Использование Transact-SQL

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

Важно!

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

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

  1. Создайте моментальный снимок, публикацию слиянием или публикацию транзакций. Дополнительные сведения см. в разделе Create a Publication.

  2. Выполните sp_addpublication_snapshot (Transact-SQL). Укажите @publication и следующие параметры:

    • @job_login — указывает учетные данные для проверки подлинности Windows, под которыми запускается агент моментальных снимков на распространителе.

    • **, @job_password**который является паролем для предоставленных учетных данных Windows.

    • (Необязательно) Значение 0 для @publisher_security_mode, будет ли агент использовать проверку подлинности SQL Server при подключении к издателю. В этом случае для @publisher_login и @publisher_password также необходимо указать сведения для входа SQL Server authentication.

    • (Необязательно) Расписание синхронизации для задания агента моментальных снимков. Дополнительные сведения см. в статье Specify Synchronization Schedules.

    Важно!

    Если издатель настраивается с удаленным распространителем, то значения, передаваемые для всех аргументов, включая job_login и job_password, передаются распространителю в формате обычного (незашифрованного) текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в статье Включение шифрования соединений в компоненте Database Engine (диспетчер конфигурации SQL Server).

  3. Добавьте статьи к публикации. Дополнительные сведения см. в статье определить статью.

  4. На издателе в базе данных публикации выполните sp_startpublication_snapshot (Transact-SQL), указав значение @publication из шага 1.

Запуск агента моментальных снимков для формирования исходного моментального снимка

  1. Создайте моментальный снимок, публикацию слиянием или публикацию транзакций. Дополнительные сведения см. в разделе Create a Publication.

  2. Добавьте статьи к публикации. Дополнительные сведения см. в статье определить статью.

  3. Из командной строки или из пакетного файла запустите агент слияния репликации , вызвав программу snapshot.exeсо следующими параметрами командной строки.

    • -Publication

    • -Publisher

    • -Distributor

    • -PublisherDB

    • -ReplicationType

    При использовании проверки подлинности SQL Server необходимо также указать следующие аргументы.

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

Примеры (Transact-SQL)

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

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. 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".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2012'; --publication database
SET @publication = N'AdvWorksCustomerTran'; -- transactional publication name
SET @login = $(Login);
SET @password = $(Password);

USE [AdventureWorks]

-- Enable transactional and snapshot replication on the publication database.
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish',
  @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
  @job_login = @login, 
  @job_password = @password,
  -- Explicitly specify the security mode used when connecting to the Publisher.
  @publisher_security_mode = 1;

-- Create new transactional publication, using the defaults. 
USE [AdventureWorks2012]
EXEC sp_addpublication 
  @publication = @publication, 
  @description = N'transactional publication';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

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

-- 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".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2012'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname=N'merge publish',
  @value = N'true';

-- Create new merge publication, using the defaults. 
USE [AdventureWorks]
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication.';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

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

Примечание

Пример разбит на строки для удобства чтения. В пакетном файле команды необходимо вводить в одной строке.

@ECHO OFF
SET InstanceName=%computername%
REM<snippetstartmergesnapshot_10>
REM -- Declare variables
SET Publisher=%InstanceName%
SET PublicationDB=AdventureWorks2012 
SET Publication=AdvWorksSalesOrdersMerge 

REM --Start the Snapshot Agent to generate the snapshot for AdvWorksSalesOrdersMerge.
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %Publication% 
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB% 
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1 
REM</snippetstartmergesnapshot_10>

PAUSE

При помощи объектов RMO

После создания публикации агент моментальных снимков создает моментальный снимок. Создание моментального снимка и прямой доступ из управляемого кода к функциям агента репликации могут производиться программным путем с помощью объектов RMO. Какие именно объекты при этом применяются, зависит от типа репликации. Агент моментальных снимков может быть запущен как синхронно с помощью объекта SnapshotGenerationAgent , так и в асинхронном режиме из задания агента. После создания исходного моментального снимка он передается на сервер подписчика и применяется при первом сеансе синхронизации подписки. Когда данные в существующем моментальном снимке устарели, соответствующий ему агент должен быть запущен повторно. Дополнительные сведения см. в статье Обслуживание публикаций.

Важно!

По возможности предлагайте пользователям вводить учетные данные системы безопасности во время выполнения приложения. Если необходимо хранить учетные данные, используйте службы шифрования , предоставляемые платформой Microsoft Windows .NET Framework.

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

  1. Создайте соединение с издателем с помощью класса ServerConnection .

  2. Создайте экземпляр класса TransPublication. Задайте для публикации свойства Name и DatabaseName , а также установите созданное на шаге 1 соединение ConnectionContext в качестве значения для свойства.

  3. Вызовите метод LoadProperties , чтобы загрузить оставшиеся свойства объекта. Если этот метод возвращает false, то либо на шаге 2 были неверно определены свойства публикации, либо публикация не существует.

  4. Если значение SnapshotAgentExists равно false, то для создания задания агента моментальных снимков для этой публикации вызовите метод CreateSnapshotAgent.

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

  6. Если параметр SnapshotAvailable имеет значение true, моментальный снимок доступен для подписчиков (необязательно).

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

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

    • Publisher — имя издателя.

    • PublisherDatabase — имя базы данных публикации.

    • Publication — имя публикации.

    • Distributor — имя распространителя.

    • PublisherSecurityMode — значение параметра Integrated , чтобы использовать проверку подлинности Windows для соединения с издателем, или значение Standard и значения параметров PublisherLogin и PublisherPassword , чтобы использовать проверку подлинности SQL Server для соединения с издателем. Рекомендуется использовать проверку подлинности Windows.

    • DistributorSecurityMode — значение параметра Integrated , чтобы использовать проверку подлинности Windows для соединения с распространителем, или значение Standard и значения параметров DistributorLogin и DistributorPassword , чтобы использовать проверку подлинности SQL Server для соединения с распространителем. Рекомендуется использовать проверку подлинности Windows.

  2. Укажите значение Transactional или Snapshot в параметре ReplicationType.

  3. Вызовите метод GenerateSnapshot .

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

  1. Создайте соединение с издателем с помощью класса ServerConnection .

  2. Создайте экземпляр класса MergePublication. Задайте для публикации свойства Name и DatabaseName , а также установите созданное на шаге 1 соединение ConnectionContext в качестве значения для свойства.

  3. Вызовите метод LoadProperties , чтобы загрузить оставшиеся свойства объекта. Если этот метод возвращает false, то либо на шаге 2 были неверно определены свойства публикации, либо публикация не существует.

  4. Если значение SnapshotAgentExists равно false, то для создания задания агента моментальных снимков для этой публикации вызовите метод CreateSnapshotAgent.

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

  6. Если параметр SnapshotAvailable имеет значение true, моментальный снимок доступен для подписчиков (необязательно).

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

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

    • Publisher — имя издателя.

    • PublisherDatabase — имя базы данных публикации.

    • Publication — имя публикации.

    • Distributor — имя распространителя.

    • PublisherSecurityMode — значение параметра Integrated , чтобы использовать проверку подлинности Windows для соединения с издателем, или значение Standard и значения параметров PublisherLogin и PublisherPassword , чтобы использовать проверку подлинности SQL Server для соединения с издателем. Рекомендуется использовать проверку подлинности Windows.

    • DistributorSecurityMode — значение параметра Integrated , чтобы использовать проверку подлинности Windows для соединения с распространителем, или значение Standard и значения параметров DistributorLogin и DistributorPassword , чтобы использовать проверку подлинности SQL Server для соединения с распространителем. Рекомендуется использовать проверку подлинности Windows.

  2. Укажите значение Merge в параметре ReplicationType.

  3. Вызовите метод GenerateSnapshot .

Примеры (объекты RMO)

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

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
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.Transactional;

    // 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 = "AdvWorksProductTran"
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.Transactional

    ' 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

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

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2012";
string publisherName = publisherInstance;

TransPublication publication;

// Create a connection to the Publisher using Windows Authentication.
ServerConnection conn;
conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Set the required properties for an existing publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    if (publication.LoadProperties())
    {
        // Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication does not exist.", publicationName));
    }
}
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);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2012"
Dim publisherName As String = publisherInstance

Dim publication As TransPublication

' Create a connection to the Publisher using Windows Authentication.
Dim conn As ServerConnection
conn = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Set the required properties for an existing publication.
    publication = New TransPublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    If publication.LoadProperties() Then
        ' Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob()
    Else
        Throw New ApplicationException(String.Format( _
         "The {0} publication does not exist.", publicationName))
    End If
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)
Finally
    conn.Disconnect()
End Try

См. также:

Create a Publication
Создание подписки по запросу
Создание принудительной подписки
Указание расписаний синхронизации
Создание и применение моментального снимка
Инициализация подписки с помощью моментального снимка
Основные понятия объектов RMO
Рекомендации по защите репликации
Replication System Stored Procedures Concepts
Использование программы sqlcmd с переменными скрипта