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

適用対象: SQL Server Azure SQL Managed Instance

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

  • すぐに生成。 既定では、マージ パブリケーションのスナップショットは、パブリケーションの新規作成ウィザードでパブリケーションが作成された後、すぐに生成されます。
  • スケジュールで設定した時刻に生成。 スケジュールは、パブリケーションの新規作成ウィザードの [スナップショット エージェント] ページで指定するか、ストアド プロシージャまたはレプリケーション管理オブジェクト (RMO) の使用時に指定します。
  • 手動。 コマンド プロンプトまたは SQL Server Management Studio からスナップショット エージェントを実行します。 エージェントの実行の詳細については、「レプリケーション エージェント実行可能ファイルの概念」および「レプリケーション エージェントを起動および停止する (SQL Server Management Studio)」を参照してください。

マージ レプリケーションの場合は、スナップショット エージェントが起動するたびにスナップショットが生成されます。 トランザクション レプリケーションでは、スナップショットの生成はパブリケーション プロパティ immediate_syncの設定で決まります。 プロパティが TRUE に設定されていると (パブリケーションの新規作成ウィザードを使用する際の既定の設定)、スナップショット エージェントを実行するたびにスナップショットが生成され、いつでもスナップショットをサブスクライバーに適用できます。 プロパティが FALSE に設定されていると ( sp_addpublicationを使用する場合の既定の設定)、最後にスナップショット エージェントを実行してから新しいサブスクリプションが追加された場合にのみスナップショットが生成されます。サブスクライバーは、スナップショット エージェントが完了するまで同期することはできません。

既定では、スナップショットが生成されると、そのスナップショットはディストリビューター上の既定のスナップショット フォルダーに保存されます。 スナップショット ファイルは、リムーバブル ディスク、CD-ROM などのリムーバブル メディアや、既定のスナップショット フォルダー以外の場所に保存することもできます。 また、格納および転送しやすいようにファイルを圧縮することや、サブスクライバーでスナップショットを適用する前または後にスクリプトを実行することもできます。 これらのオプションの詳細については、「 Snapshot Options」をご覧ください。

パラメーター化されたフィルターを使用するマージ パブリケーションに対するスナップショットの場合は、2 段階の処理でスナップショットが作成されます。 まず、パブリッシュされたオブジェクトのレプリケーション スクリプトとスキーマが含まれるスキーマ スナップショットが作成されます。ただしデータは含まれません。 次に、スキーマ スナップショットからコピーしたスクリプトとスキーマが含まれるスナップショットと、サブスクリプションのパーティションに属するデータを使用して、各サブスクリプションが初期化されます。 詳しくは、「 Snapshots for Merge Publications with Parameterized Filters」をご覧ください。

パブリッシャーで作成され、既定の位置または代替位置に格納されたスナップショットは、サブスクライバーに転送して適用することができます。 ディストリビューション エージェント (スナップショット レプリケーションおよびトランザクション レプリケーションの場合) またはマージ エージェント (マージ レプリケーションの場合) によって、最初の同期時に、サブスクライバー側のサブスクリプション データベースにスナップショットが転送され、スキーマ ファイルとデータ ファイルが適用されます。 サブスクリプションの新規作成ウィザードを使用する場合、既定では、サブスクリプションの作成後すぐに最初の同期が行われます。 この動作は、ウィザードの [サブスクリプションの初期化] ページの [次の場合に初期化] オプションによって制御されます。 サブスクリプションの初期化後に生成されたスナップショットは、サブスクリプションに再初期化のマークが付けられない限り、サブスクライバーに適用されません。 詳細については、「 サブスクリプションの再初期化」を参照してください。

ディストリビューション エージェントまたはマージ エージェントによる初期スナップショットの適用後、それらのエージェントによって以後の更新とその他のデータ変更が反映されます。 スナップショットがディストリビュートされサブスクライバーに適用されるときは、初期スナップショットまたは新しいスナップショットを待機しているサブスクライバーのみが影響を受けます。 そのパブリケーションへの他のサブスクライバー (パブリッシュされたデータへの挿入、更新、削除、またはその他の変更を既に受信中のサブスクライバー) は影響を受けません。

スナップショット フォルダーの既定の場所を表示または変更するには、「

既定のスナップショットの場所

ディストリビューションの構成ウィザードの [スナップショット フォルダー] ページで、既定のスナップショットの場所を指定します。 ウィザードの使用の詳細については、「パブリッシングおよびディストリビューションの構成」を参照してください。 ディストリビューターとして構成されていないサーバーでパブリケーションを作成する場合は、パブリケーションの新規作成ウィザードの [スナップショット フォルダー] ページで既定のスナップショットの場所を指定します。 このウィザードの使用の詳細については、「パブリケーションの作成」を参照してください。

[ディストリビューターのプロパティ - <Distributor]> ダイアログ ボックスの [パブリッシャー] ページで、既定のスナップショットの場所を変更します。 詳細については、「ディストリビューターとパブリッシャーのプロパティの表示および変更」を参照してください。 [パブリケーションのプロパティ - <Publication]> ダイアログ ボックスで、各パブリケーションのスナップショット フォルダーを設定します。 詳しくは、「 View and Modify Publication Properties」をご覧ください。

既定のスナップショットの場所の変更

  1. [ディストリビューターのプロパティ - <Distributor]> ダイアログ ボックスの [パブリッシャー] ページで、既定のスナップショットの場所を変更するパブリッシャーのプロパティ ボタン ([...]) をクリックします。

  2. [パブリッシャーのプロパティ - <Publisher]> ダイアログ ボックスで、[既定のスナップショット フォルダー] プロパティの値を入力します。

    Note

    スナップショット エージェントには、指定したディレクトリに対する書き込み権限が必要です。また、ディストリビューション エージェントまたはマージ エージェントには、読み取り権限が必要です。 プル サブスクリプションを使用する場合は、共有ディレクトリを \\computername\snapshot などの UNC (汎用名前付け規則) パス (\computername\snapshot など) として指定する必要があります。 詳細については、「Secure the Snapshot Folder」(スナップショット フォルダーのセキュリティ保護) をご覧ください。

  3. [OK] を選択します。

スナップショットの作成

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

SQL Server Management Studio を使用する

  1. Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。
  2. [レプリケーション] フォルダーを展開し、 [ローカル パブリケーション] フォルダーを展開します。
  3. スナップショットを作成するパブリケーションを右クリックして、 [スナップショット エージェントの状態の表示]をクリックします。
  4. [スナップショット エージェントの状態の表示 - <Publication]> ダイアログ ボックスで [開始] をクリックします。
    スナップショット エージェントによるスナップショットの生成が完了すると、"[100%] 17 個のアーティクルのスナップショットが生成されました。" などのメッセージが表示されます。

レプリケーション モニターで次を実行します。

  1. レプリケーション モニターの左ペインでパブリッシャー グループを展開し、パブリッシャーを展開します。
  2. スナップショットを生成するパブリケーションを右クリックして、 [スナップショットの生成]をクリックします。
  3. スナップショット エージェントの状態を表示するには、[エージェント] タブをクリックします。詳細については、グリッドでスナップショット エージェントを右クリックし、[詳細の表示] をクリックします。

Transact-SQL の使用

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

重要

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

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

  2. sp_addpublication_snapshot (Transact-SQL) を実行します。 このとき、 @publication パラメーターを指定したうえで、次のパラメーターを指定します。

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

    • Windows 資格情報に対応するパスワードを@job_passwordに指定します。

    • (省略可) エージェントからパブリッシャーへの接続に SQL Server 認証を使用する場合は、 @publisher_security_mode の値に 0 を指定します。 この場合は、さらに、 @publisher_login および @publisher_passwordに対して、SQL Server 認証のログイン情報を指定する必要があります。

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

    重要

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

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

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

スナップショットの適用

SQL Server Management Studio を使用する

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

    • エージェントを連続して実行するように設定している場合 (トランザクション レプリケーションの既定の動作)、スナップショットは生成後に自動的に適用されます。
    • スケジュールに基づいてエージェントを実行するように設定している場合、スナップショットは、スケジュールによる次回のエージェント実行時に適用されます。
    • 要求時にエージェントを実行するように設定している場合、スナップショットは、次回のエージェント実行時に適用されます。

    サブスクリプションの同期の詳細については、「 Synchronize a Push Subscription 」および「 Synchronize a Pull Subscriptionダイアログ ボックスを使用します。

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'AdventureWorks2022'; --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 [AdventureWorks2022]
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'AdventureWorks2022'; 
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

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

Note

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

  
REM -- Declare variables  
SET Publisher=%InstanceName%  
SET PublicationDB=AdventureWorks2022   
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  
  

レプリケーション管理オブジェクト (RMO) の使用

スナップショット エージェントは、パブリッシャーが作成された後でスナップショットを生成します。 レプリケーション管理オブジェクト (RMO) およびレプリケーション エージェント機能への直接的なマネージド コード アクセスを使用して、これらのスナップショットをプログラムで生成できます。 使用するオブジェクトは、レプリケーションの種類によって異なります。 スナップショット エージェントを同期的に開始する場合は SnapshotGenerationAgent オブジェクトを使用し、非同期的に開始する場合はエージェント ジョブを使用します。 初期スナップショットの生成後、サブスクリプションを最初に同期するときに、初期スナップショットをサブスクライバーに転送して適用することができます。 既存のスナップショットに最新の有効なデータが含まれていない場合は、エージェントを再実行する必要があります。 詳細については、「Maintain Publications」(パブリケーションの管理) を参照してください。

重要

可能であれば、実行時、ユーザーに対してセキュリティ資格情報の入力を要求します。 資格情報を保存する必要がある場合は、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 クラスのインスタンスを作成し、次の必須プロパティを設定します。

    • Publisher - パブリッシャーの名前

    • PublisherDatabase - パブリケーション データベースの名前

    • Publication - パブリケーションの名前

    • Distributor - ディストリビューターの名前

    • PublisherSecurityMode - パブリッシャーへの接続時に Windows 認証を使用する場合は Integrated の値を指定します。またはパブリッシャーへの接続時に SQL Server 認証を使用する場合は Standard の値および PublisherLoginPublisherPassword の値を指定します。 推奨されるのは、Windows 認証です。

    • DistributorSecurityMode - ディストリビューターへの接続時に Windows 認証を使用する場合は Integrated の値を指定します。ディストリビューターへの接続時に SQL Server 認証を使用する場合は Standard の値および DistributorLoginDistributorPassword の値を指定します。 推奨されるのは、Windows 認証です。

  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 クラスのインスタンスを作成し、次の必須プロパティを設定します。

    • Publisher - パブリッシャーの名前

    • PublisherDatabase - パブリケーション データベースの名前

    • Publication - パブリケーションの名前

    • Distributor - ディストリビューターの名前

    • PublisherSecurityMode - パブリッシャーへの接続時に Windows 認証を使用する場合は Integrated の値を指定します。またはパブリッシャーへの接続時に SQL Server 認証を使用する場合は Standard の値および PublisherLoginPublisherPassword の値を指定します。 推奨されるのは、Windows 認証です。

    • DistributorSecurityMode - ディストリビューターへの接続時に Windows 認証を使用する場合は Integrated の値を指定します。ディストリビューターへの接続時に SQL Server 認証を使用する場合は Standard の値および DistributorLoginDistributorPassword の値を指定します。 推奨されるのは、Windows 認証です。

  2. MergeReplicationTypeを設定します。

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

例 (RMO)

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

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

初期スナップショットの適用時のブロック

初期スナップショットの適用中にサブスクライバーでデータを 1 つのデータベースにパブリッシュするパブリケーションが複数ある場合、一度にそのスナップショットを適用できるパブリケーションは 1 つだけであることがわかります。

SQL アクティビティを確認するときに、次のような待機リソースが表示されることがあります。

APP: 18:16384:[snapshot_delivery_in_progress_Tr]:(9bcdaf92)
APP: 5:16384:[snapshot_delivery_in_progress_Er]:(3c3b7db9
)

ロック動作のクエリを実行すると、次のようなリソースが表示される場合があります。

APP 16384:[appname]:(fbe42d68) XAPP 16384:[snapshot_del]:(9bcdaf92) X

この動作は仕様によるものです。 これは、複数のレプリケーション エージェントが異なるパブリケーションのスナップショットを同じサブスクライバー データベースに同時に適用できないようにするために、アプリケーション ロックが使用されるために発生します。 アプリケーション ロックにはサブスクライバー データベースの名前が含まれているため、同じサブスクライバー データベースに発行するすべてのパブリケーションが影響を受けます。 その結果、特定の時点でサブスクライバー データベースに挿入できるスナップショットは 1 つだけになります。

この状況では、レプリケーション エージェントが互いにデッドロックする可能性を回避するために、排他ロックが使用されます。

この問題を回避するには、パブリケーションごとに異なるサブスクライバー データベースを指定します。

参照

パブリケーションを作成する
Create a Pull Subscription
プッシュ サブスクリプションを作成する
同期スケジュールの指定
Initialize a Subscription with a Snapshot (スナップショットを使用したサブスクリプションの初期化)
Replication Management Objects Concepts
レプリケーション セキュリティの推奨事項
Replication System Stored Procedures Concepts
sqlcmd でのスクリプト変数の使用