次の方法で共有


初期スナップショットの作成および適用

このトピックでは、SQL Server Management Studio、Transact-SQL、またはレプリケーション管理オブジェクト (RMO) を使用して、SQL Server 2014 で初期スナップショットを作成して適用する方法について説明します。 パラメーター化されたフィルターを使用するマージ パブリケーションでは、2 つの部分から成るスナップショットが必要です。 詳しくは、「 パラメーター化されたフィルターを使用したパブリケーションのスナップショットの作成」をご覧ください。

このトピックの内容

SQL Server Management Studio を使用する

SQL Server エージェントが実行されている場合、既定でパブリケーションの新規作成ウィザードでパブリケーションが作成された直後に、スナップショット エージェントによってスナップショットが生成されます。 既定では、スナップショットはディストリビューション エージェント (スナップショット レプリケーションおよびトランザクション レプリケーションの場合) またはマージ エージェント (マージ サブスクリプションの場合) によって、すべてのサブスクリプションに対して適用されます。 スナップショットは、 SQL Server Management Studio およびレプリケーション モニターを使用して生成することもできます。 レプリケーション モニターの起動の詳細については、「Start the Replication Monitor」 (レプリケーション モニターの開始) を参照してください。

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. スナップショット パブリケーション、トランザクション パブリケーション、またはマージ パブリケーションを作成します。 詳しくは、「 パブリケーションを作成」をご覧ください。

  2. sp_addpublication_snapshotの実行 (Transact-SQL)@publicationと次のパラメーターを指定します。

    • ディストリビューターで実行するスナップショット エージェントが使用するための Windows 認証の資格情報を @job_login に指定します。

    • **指定 @job_password**された Windows 資格情報のパスワードです。

    • (省略可能)エージェントがパブリッシャーに接続するときにSQL Server認証を使用する場合は、@publisher_security_modeの値は 0 です。 この場合は、@publisher_loginと@publisher_passwordのSQL Server認証ログイン情報も指定する必要があります。

    • (省略可) スナップショット エージェント ジョブの同期スケジュールを指定します。 詳細については、「 Specify Synchronization Schedules」を参照してください。

    重要

    リモート ディストリビューターを使用するパブリッシャーを構成する場合は、 job_login および job_passwordを含むすべてのパラメーターに指定された値がディストリビューターにプレーン テキストとして送信されます。 このストアド プロシージャを実行する前に、パブリッシャーとリモート ディストリビューターの間の接続を暗号化する必要があります。 詳細については、「データベース エンジンへの暗号化接続の有効化 (SQL Server 構成マネージャー)」を参照してください。

  3. パブリケーションにアーティクルを追加します。 詳しくは、「 アーティクルを定義」をご覧ください。

  4. パブリッシャー側のパブリケーション データベースで、手順 1 の@publicationの値を指定して、sp_startpublication_snapshot(Transact-SQL) を実行します。

スナップショット エージェントを実行して初期スナップショットを生成するには

  1. スナップショット パブリケーション、トランザクション パブリケーション、またはマージ パブリケーションを作成します。 詳しくは、「 パブリケーションを作成」をご覧ください。

  2. パブリケーションにアーティクルを追加します。 詳しくは、「 アーティクルを定義」をご覧ください。

  3. コマンド プロンプトまたはバッチ ファイルから、次のコマンド ライン引数を指定して snapshot.exe を実行し、 レプリケーション マージ エージェントを起動します。

    • -Publication

    • -Publisher

    • -Distributor

    • -PublisherDB

    • -ReplicationType

    SQL Server 認証を使用する場合は、次の引数も指定する必要があります。

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = \@publisher_security_mode

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = \@publisher_security_mode

例 (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

次のコマンド ライン引数は、スナップショット エージェントを起動して、マージ パブリケーション用のスナップショットを生成します。

注意

読みやすくするために、改行が追加されています。 バッチ ファイルの場合、コマンドは 1 行で入力する必要があります。

@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 オブジェクトを使用し、非同期的に開始する場合はエージェント ジョブを使用します。 初期スナップショットの生成後、サブスクリプションを最初に同期するときに、初期スナップショットをサブスクライバーに転送して適用することができます。 既存のスナップショットに最新の有効なデータが含まれていない場合は、エージェントを再実行する必要があります。 詳細については、「Maintain Publications」(パブリケーションの管理) を参照してください。

重要

可能であれば、実行時、ユーザーに対してセキュリティ資格情報の入力を要求します。 資格情報を保存する必要がある場合は、 Windows .NET Framework に用意されている 暗号化サービス Microsoft を使用します。

スナップショット エージェント ジョブを非同期的に開始して、スナップショット パブリケーションまたはトランザクション パブリケーションの初期スナップショットを生成するには

  1. ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。

  2. TransPublication クラスのインスタンスを作成します。 パブリケーションの Name プロパティおよび DatabaseName プロパティを設定し、 ConnectionContext プロパティに手順 1. で作成した接続を設定します。

  3. LoadProperties メソッドを呼び出して、オブジェクトの残りのプロパティを読み込みます。 このメソッドが false を返す場合、手順 2. でパブリケーション プロパティを不適切に設定したか、パブリケーションが存在していません。

  4. SnapshotAgentExists の値が false の場合は、CreateSnapshotAgent を呼び出して、このパブリケーション用のスナップショット エージェント ジョブを作成します。

  5. StartSnapshotGenerationAgentJob メソッドを呼び出して、このパブリケーションのスナップショットを生成するエージェント ジョブを開始します。

  6. (省略可) SnapshotAvailable の値が true である場合は、スナップショットをサブスクライバーに使用できます。

スナップショット エージェント ジョブを同期的に実行して、スナップショット パブリケーションまたはトランザクション パブリケーションの初期スナップショットを生成するには

  1. SnapshotGenerationAgent クラスのインスタンスを作成し、次の必須プロパティを設定します。

  2. TransactionalSnapshot または ReplicationTypeを設定します。

  3. GenerateSnapshot メソッドを呼び出します。

スナップショット エージェント ジョブを非同期的に開始して、マージ パブリケーションの初期スナップショットを生成するには

  1. ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。

  2. MergePublication クラスのインスタンスを作成します。 パブリケーションの Name プロパティおよび DatabaseName プロパティを設定し、 ConnectionContext プロパティに手順 1. で作成した接続を設定します。

  3. LoadProperties メソッドを呼び出して、オブジェクトの残りのプロパティを読み込みます。 このメソッドが false を返す場合、手順 2. でパブリケーション プロパティを不適切に設定したか、パブリケーションが存在していません。

  4. SnapshotAgentExists の値が false の場合は、CreateSnapshotAgent を呼び出して、このパブリケーション用のスナップショット エージェント ジョブを作成します。

  5. StartSnapshotGenerationAgentJob メソッドを呼び出して、このパブリケーションのスナップショットを生成するエージェント ジョブを開始します。

  6. (省略可) SnapshotAvailable の値が true である場合は、スナップショットをサブスクライバーに使用できます。

スナップショット エージェントを同期的に実行して、マージ パブリケーションの初期スナップショットを生成するには

  1. SnapshotGenerationAgent クラスのインスタンスを作成し、次の必須プロパティを設定します。

  2. MergeReplicationTypeを設定します。

  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 Pull Subscription
プッシュ サブスクリプションを作成する
同期スケジュールの指定
スナップショットの作成および適用
スナップショットを使用したサブスクリプションの初期化
レプリケーション管理オブジェクトの概念
レプリケーション セキュリティの推奨事項
Replication System Stored Procedures Concepts
sqlcmd でのスクリプト変数の使用