次の方法で共有


初期スナップショットを作成して適用する

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

このトピックについて

SQL Server Management Studio の使用

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

Management Studio でスナップショットを作成するには

  1. Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。

  2. [レプリケーション] フォルダーを展開し、[ローカル パブリケーション] フォルダーを展開します。

  3. スナップショットを作成するパブリケーションを右クリックし、[スナップショット エージェントの状態の表示] をクリックします。

  4. [ スナップショット エージェントの状態の表示 - <発行> ] ダイアログ ボックスで、[ 開始] をクリックします。

スナップショット エージェントがスナップショットの生成を完了すると、"[100%] 17 個のアーティクルのスナップショットが生成されました" などのメッセージが表示されます。

レプリケーション モニターでスナップショットを作成するには

  1. レプリケーション モニターで、左側のウィンドウでパブリッシャー グループを展開し、パブリッシャーを展開します。

  2. スナップショットを生成するパブリケーションを右クリックし、[スナップショットの 生成] をクリックします。

  3. スナップショット エージェントの状態を表示するには、[ エージェント ] タブをクリックします。詳細については、グリッドでスナップショット エージェントを右クリックし、[ 詳細の表示] をクリックします。

スナップショットを適用するには

  1. スナップショットが生成された後、サブスクリプションをディストリビューション エージェントまたはマージ エージェントと同期することによって適用されます。

    • エージェントが継続的に実行されるように設定されている場合 (トランザクション レプリケーションの既定値)、スナップショットは生成後に自動的に適用されます。

    • エージェントがスケジュールに従って実行されるように設定されている場合、スナップショットは次回エージェントの実行がスケジュールされるときに適用されます。

    • エージェントがオンデマンドで実行されるように設定されている場合は、次回エージェントを実行するときに適用されます。

    サブスクリプションの同期の詳細については、「 プッシュ サブスクリプションの同期プル サブスクリプションの同期」を参照してください。

Transact-SQL の使用

初期スナップショットは、スナップショット エージェント ジョブを作成して実行するか、バッチ ファイルからスナップショット エージェント実行可能ファイルを実行することによって、プログラムによって作成できます。 初期スナップショットが生成されると、サブスクリプションが最初に同期されるときにサブスクライバーに転送され、サブスクライバーで適用されます。 コマンド プロンプトまたはバッチ ファイルからスナップショット エージェントを実行する場合は、既存のスナップショットが無効になったときに必ずエージェントを再実行する必要があります。

重要

可能な場合は、実行時にセキュリティ資格情報の入力をユーザーに求めます。 スクリプト ファイルに資格情報を格納する必要がある場合は、未承認のアクセスを防ぐためにファイルをセキュリティで保護する必要があります。

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

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

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

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

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

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

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

    重要

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

  3. パブリケーションにアーティクルを追加します。 詳細については、 アーティクルの定義を参照してください。

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

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

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

  2. パブリケーションにアーティクルを追加します。 詳細については、 アーティクルの定義を参照してください。

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

    • -出版

    • -発行者

    • -ディストリビューター

    • -PublisherDB

    • -レプリケーションの種類

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

    • -DistributorLogin

    • -ディストリビューターパスワード

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

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

読みやすくするために改行が追加されました。 バッチ ファイルでは、コマンドは 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 オブジェクトを使用して同期的に開始することも、エージェント ジョブを使用して非同期的に起動することもできます。 初期スナップショットが生成されると、サブスクリプションが最初に同期されるときにサブスクライバーに転送され、サブスクライバーで適用されます。 既存のスナップショットに有効な up-to-date データが含まれなくなった場合には、エージェントを必ず再実行する必要があります。 詳細については、 パブリケーションの更新を参照してください。

重要

可能な場合は、実行時にセキュリティ資格情報の入力をユーザーに求めます。 資格情報を格納する必要がある場合は、Microsoft Windows .NET Framework によって提供される 暗号化サービス を使用します。

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

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

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

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

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

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

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

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

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

  2. ReplicationTypeTransactionalまたはSnapshotの値を設定します。

  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. ReplicationTypeMergeの値を設定します。

  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

こちらもご覧ください

パブリケーションを作成する
プル サブスクリプションを作成する
プッシュ サブスクリプションを作成する
同期スケジュールの指定
スナップショットの作成と適用
スナップショットを使用してサブスクリプションを初期化する
レプリケーション管理オブジェクトの概念
レプリケーション のセキュリティに関するベスト プラクティス
レプリケーション システム ストアド プロシージャの概念
sqlcmd でのスクリプト変数の使用