適用対象: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(New Publication Wizard使用時のデフォルト)に設定されている場合、スナップショット エージェントは実行するたびにスナップショットを生成し、いつでもサブスクライバーにスナップショットを適用できます。 プロパティがFALSE(sp_addpublication使用時のデフォルト)に設定されている場合、スナップショット エージェントは前回のスナップショット エージェント実行以降に新しいサブスクリプションが追加された場合にのみスナップショットを生成します。サブスクライバーは同期する前にスナップショット エージェントが完了するまで待つ必要があります。
デフォルトでは、スナップショット エージェントは生成されたスナップショットをディストリビューター上のデフォルトのスナップショットフォルダに保存します。 また、リムーバブルディスクやCD-ROM、またはデフォルトのスナップショットフォルダ以外の場所にスナップショットファイルを保存することも可能です。 また、ファイルを圧縮して保存や転送を容易にし、スナップショット エージェントがサブスクライバーにスナップショットを適用する前にスクリプトを実行することもできます。 これらのオプションの詳細については、「 Snapshot Options」をご覧ください。
もしスナップショットがパラメータ化されたフィルターを使用するマージ出版の場合、スナップショット エージェントは2つのプロセスでスナップショットを作成します。 まず、レプリケーションスクリプトと公開オブジェクトのスキーマを含むスキーマスナップショットを作成しますが、データは含まれません。 各サブスクリプションは、スキーマスナップショットからコピーされたスクリプトやスキーマ、そしてサブスクリプションのパーティションに属するデータを含むスナップショットで初期化されます。 詳細については、「パラメーター化されたフィルターを使用するマージ パブリケーションのスナップショット」をご覧ください。
スナップショット エージェントがPublisherでスナップショットを作成し、デフォルトまたは別のスナップショット場所に保存した後、そのスナップショットをSubscriberに転送し適用できます。 ディストリビューション エージェント(スナップショットまたはトランザクションレプリケーション用)またはマージ エージェント(マージレプリケーション用)は、スナップショットを転送し、スキーマとデータファイルを初期同期時にサブスクライバーのサブスクリプションデータベースに適用します。 デフォルトでは、新規サブスクリプションウィザードを使うと、購読を作成直後に初期同期が行われます。 ウィザードの「Initialize Subscriptions」ページの「Initialize When 」オプションがこの動作を制御します。 スナップショット エージェントがサブスクリプションの初期化後にスナップショットを生成する場合、サブスクリプションを初期化しない限り、サブスクライバーには適用しません。 詳細については、「 サブスクリプションの再初期化」を参照してください。
ディストリビューション エージェントまたはマージ エージェントによる初期スナップショットの適用後、それらのエージェントによって以後の更新とその他のデータ変更が反映されます。 スナップショットがディストリビュートされサブスクライバーに適用されるときは、初期スナップショットまたは新しいスナップショットを待機しているサブスクライバーのみが影響を受けます。 そのパブリケーションの他のサブスクライバー(つまり、公開済みデータに対する挿入、更新、削除、その他の変更をすでに受信しているサブスクライバー)は影響を受けません。
スナップショット フォルダーの既定の場所を表示または変更するには、「
SQL Server Management Studio: スナップショット オプションの変更
レプリケーションのプログラミングと RMO のプログラミング: パブリッシングとディストリビューションの構成
既定のスナップショットの場所
ディストリビューションの構成ウィザードの [スナップショット フォルダー] ページで、既定のスナップショットの場所を指定します。 ウィザードの使用の詳細については、「パブリッシングおよびディストリビューションの構成」を参照してください。 ディストリビューターとして構成されていないサーバーでパブリケーションを作成する場合は、パブリケーションの新規作成ウィザードの [スナップショット フォルダー] ページで既定のスナップショットの場所を指定します。 このウィザードの使用の詳細については、「パブリケーションの作成」を参照してください。
[ディストリビューターのプロパティ - ディストリビューター] ダイアログ ボックスの [パブリッシャ] ページで、既定のスナップショットの場所を変更します。 詳細については、「ディストリビューターとパブリッシャーのプロパティの表示および変更」を参照してください。 [パブリケーションのプロパティ - <Publication]> ダイアログ ボックスで、各パブリケーションのスナップショット フォルダーを設定します。 詳しくは、「 View and Modify Publication Properties」をご覧ください。
既定のスナップショットの場所の変更
Distributor Properties - <Distributor>ダイアログボックスのPublishersページで、デフォルトのスナップショット位置を変更したいPublisherのプロパティボタン(...)を選択してください。
[パブリッシャーのプロパティ - <Publisher]> ダイアログ ボックスで、[既定のスナップショット フォルダー] プロパティの値を入力します。
注
スナップショット エージェントは指定したディレクトリの書き込み権限を必要とし、ディストリビューション エージェントやマージ エージェントは読み取り権限を必要とします。 プルサブスクリプションを使う場合は、\\computername\snapshotのような共通命名規則(UNC)パスとして共有ディレクトリを指定する必要があります。 詳細については、「Secure the Snapshot Folder」(スナップショット フォルダーのセキュリティ保護) をご覧ください。
[OK] を選択します。
スナップショットの作成
デフォルトでは、SQL Server エージェントが実行中の場合、スナップショット エージェントはNew Publication Wizardを使ってpublicationを作成した直後にスナップショットを生成します。 デフォルトでは、ディストリビューション エージェント(スナップショットおよびトランザクションレプリケーション用)またはマージ エージェント(マージサブスクリプション用)がすべてのサブスクリプションに対してスナップショットを適用します。 また、SQL Server Management StudioやReplication Monitorを使ってスナップショットを生成することもできます。 レプリケーション モニターの起動の詳細については、「Start the Replication Monitor」 (レプリケーション モニターの開始) を参照してください。
SQL Server Management Studio を使用する
- Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。
- [レプリケーション] フォルダーを展開し、 [ローカル パブリケーション] フォルダーを展開します。
- スナップショットを作成したい出版物を右クリックし、「スナップショット エージェント Statusを表示」を選択します。
-
スナップショット エージェントの状態の表示 - <パブリケーション>ダイアログ ボックスでは、開始 を選択します。
スナップショット エージェントがスナップショットの生成を終えると、「[100%] 17記事のスナップショットが生成されました」といったメッセージが表示されます。
レプリケーション モニターで次を実行します。
- レプリケーション モニターの左ペインでパブリッシャー グループを展開し、パブリッシャーを展開します。
- スナップショットを生成したい出版物を右クリックし、「 スナップショット生成」を選択してください。
- スナップショット エージェントの状態を見るには、「Agents」タブを選択してください。より詳細な情報は、グリッド内のスナップショット エージェントを右クリックし、「詳細を表示」を選択してください。
Transact-SQL の使用
初期スナップショットは、スナップショット エージェントジョブを作成して実行するか、バッチファイルからスナップショット エージェント実行ファイルを実行することでプログラム的に作成できます。 生成された初期スナップショットは、サブスクリプションの初回同期時にサブスクライバーに転送されて適用されます。 コマンドプロンプトやバッチファイルからスナップショット エージェントを実行する場合、既存のスナップショットが無効になるたびにエージェントを再実行する必要があります。
重要
可能であれば、実行時、ユーザーに対してセキュリティ資格情報の入力を要求します。 資格情報をスクリプト ファイルに含める必要がある場合は、不正なアクセスが行われないようにファイルをセキュリティで保護してください。
スナップショット パブリケーション、トランザクション パブリケーション、またはマージ パブリケーションを作成します。 詳しくは、「 パブリケーションを作成」をご覧ください。
sp_addpublication_snapshot (Transact-SQL) を実行します。 このとき、 @publication パラメーターを指定したうえで、次のパラメーターを指定します。
ディストリビューターで実行するスナップショット エージェントが使用するための Windows 認証の資格情報を@job_login に指定します。
@job_password。これは、指定された Windows 資格情報のパスワードです。
(任意)エージェントがPublisherに接続する際にSQL Server認証を使用している場合、@publisher_security_modeの値は0となります。 この場合は、さらに、 @publisher_login および @publisher_passwordに対して、SQL Server 認証のログイン情報を指定する必要があります。
(省略可) スナップショット エージェント ジョブの同期スケジュールを指定します。 詳細については、「 Specify Synchronization Schedules」を参照してください。
重要
リモートディストリビューターでPublisherを設定すると、job_loginやjob_passwordを含むすべてのパラメータの値をプレーンテキストでディストリビューターに送信します。 このストアドプロシージャを実行する前に、Publisherとそのリモートディストリビューター間の接続を暗号化してください。 詳細については、「データベース エンジンへの暗号化接続の有効化 (SQL Server 構成マネージャー)」を参照してください。
パブリケーションにアーティクルを追加します。 詳しくは、「 アーティクルを定義」をご覧ください。
パブリケーション データベースのパブリッシャーで sp_startpublication_snapshot (Transact-SQL) を実行し、手順 1 の @publication の値を指定します。
スナップショットの適用
SQL Server Management Studio を使用する
スナップショットが生成された後、サブスクリプションをディストリビューション エージェントまたはマージ エージェントと同期して適用します:
エージェントが継続的に実行されている場合(トランザクションレプリケーションのデフォルト)、生成後に自動的にスナップショットを適用します。
エージェントがスケジュールに従って実行される場合、次回実行時にスナップショットを適用します。
エージェントがオンデマンドで動作する場合、次に実行したときにスナップショットを適用します。
サブスクリプションの同期の詳細については、Synchronize a Push Subscription および Synchronize a Pull Subscription を参照してください。
Transact-SQL の使用
スナップショット パブリケーション、トランザクション パブリケーション、またはマージ パブリケーションを作成します。 詳しくは、「 パブリケーションを作成」をご覧ください。
パブリケーションにアーティクルを追加します。 詳しくは、「 アーティクルを定義」をご覧ください。
コマンド プロンプトまたはバッチ ファイルから、次のコマンド ライン引数を指定して snapshot.exe を実行し、 レプリケーション マージ エージェントを起動します。
- -出版
- -Publisher
- -ディストリビューター
- -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'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
次のコマンド ライン引数は、スナップショット エージェントを起動して、マージ パブリケーション用のスナップショットを生成します。
注
読みやすくするために、改行が追加されています。 バッチファイルでは、コマンドは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 に用意されている 暗号化サービス を使用します。
スナップショット エージェント ジョブを非同期的に開始して、スナップショット パブリケーションまたはトランザクション パブリケーションの初期スナップショットを生成するには
ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。
TransPublication クラスのインスタンスを作成します。 パブリケーションの Name プロパティおよび DatabaseName プロパティを設定し、 ConnectionContext プロパティに手順 1. で作成した接続を設定します。
LoadProperties メソッドを呼び出して、オブジェクトの残りのプロパティを読み込みます。 このメソッドが falseを返す場合、ステップ2の出版プロパティが正しく定義されていないか、出版自体が存在しない可能性があります。
SnapshotAgentExists の値が false の場合は、CreateSnapshotAgent を呼び出して、このパブリケーション用のスナップショット エージェント ジョブを作成します。
StartSnapshotGenerationAgentJob メソッドを呼び出して、このパブリケーションのスナップショットを生成するエージェント ジョブを開始します。
(省略可) SnapshotAvailable の値が trueである場合は、スナップショットをサブスクライバーに使用できます。
スナップショット エージェント ジョブを同期的に実行して、スナップショット パブリケーションまたはトランザクション パブリケーションの初期スナップショットを生成するには
SnapshotGenerationAgent クラスのインスタンスを作成し、次の必須プロパティを設定します。
Publisher - パブリッシャーの名前
PublisherDatabase - パブリケーション データベースの名前
Publication - パブリケーションの名前
Distributor - ディストリビューターの名前
PublisherSecurityMode - パブリッシャーへの接続時に Windows 認証を使用する場合は Integrated の値を指定します。またはパブリッシャーへの接続時に SQL Server 認証を使用する場合は Standard の値および PublisherLogin と PublisherPassword の値を指定します。 推奨されるのは、Windows 認証です。
DistributorSecurityMode - ディストリビューターへの接続時に Windows 認証を使用する場合は Integrated の値を指定します。ディストリビューターへの接続時に SQL Server 認証を使用する場合は Standard の値および DistributorLogin と DistributorPassword の値を指定します。 推奨されるのは、Windows 認証です。
ReplicationType に Transactional または Snapshot の値を設定します。
GenerateSnapshot メソッドを呼び出します。
スナップショット エージェント ジョブを非同期的に開始して、マージ パブリケーションの初期スナップショットを生成するには
ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。
MergePublication クラスのインスタンスを作成します。 パブリケーションの Name プロパティおよび DatabaseName プロパティを設定し、 ConnectionContext プロパティに手順 1. で作成した接続を設定します。
LoadProperties メソッドを呼び出して、オブジェクトの残りのプロパティを読み込みます。 このメソッドが falseを返す場合、ステップ2の出版プロパティが正しく定義されていないか、出版自体が存在しない可能性があります。
SnapshotAgentExists の値が false の場合は、CreateSnapshotAgent を呼び出して、このパブリケーション用のスナップショット エージェント ジョブを作成します。
StartSnapshotGenerationAgentJob メソッドを呼び出して、このパブリケーションのスナップショットを生成するエージェント ジョブを開始します。
(省略可) SnapshotAvailable の値が trueである場合は、スナップショットをサブスクライバーに使用できます。
スナップショット エージェントを同期的に実行して、マージ パブリケーションの初期スナップショットを生成するには
SnapshotGenerationAgent クラスのインスタンスを作成し、次の必須プロパティを設定します。
Publisher - パブリッシャーの名前
PublisherDatabase - パブリケーション データベースの名前
Publication - パブリケーションの名前
Distributor - ディストリビューターの名前
PublisherSecurityMode - パブリッシャーへの接続時に Windows 認証を使用する場合は Integrated の値を指定します。またはパブリッシャーへの接続時に SQL Server 認証を使用する場合は Standard の値および PublisherLogin と PublisherPassword の値を指定します。 推奨されるのは、Windows 認証です。
DistributorSecurityMode - ディストリビューターへの接続時に Windows 認証を使用する場合は Integrated の値を指定します。ディストリビューターへの接続時に SQL Server 認証を使用する場合は Standard の値および DistributorLogin と DistributorPassword の値を指定します。 推奨されるのは、Windows 認証です。
ReplicationType に Merge の値を設定します。
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つだけであることに気づくでしょう。
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 つだけになります。
この状況では、レプリケーション エージェントが互いにデッドロックする可能性を回避するために、排他ロックが使用されます。
この問題を回避するには、パブリケーションごとに異なるサブスクライバー データベースを指定します。