サブスクリプションの再初期化
適用対象: SQL Server Azure SQL データベース
このトピックでは、SQL Server Management Studio、Transact-SQL、または レプリケーション管理オブジェクト (RMO) を使用して、SQL Server でサブスクリプションを再初期化する方法について説明します。 次回の同期で新しいスナップショットが適用されるように、個別のサブスクリプションに再初期化のマークを付けることができます。
Note
Azure SQL Managed Instance は、スナップショットおよびトランザクション レプリケーションのパブリッシャー、ディストリビューター、およびサブスクライバーの可能性があります。 Azure SQL Database のデータベースは、スナップショットとトランザクション レプリケーションのプッシュ サブスクライバーの可能性しかありません。 詳細については、Azure SQL Database および Azure SQL Managed Instance を使用したトランザクションのレプリケーションに関するページを参照してください。
SQL Server Management Studio を使用する
サブスクリプションの再初期化には、2 段階の処理があります。
パブリケーションの単一のサブスクリプションまたはすべてのサブスクリプションが再初期化対象として マーク されます。 [サブスクリプションの再初期化] ダイアログ ボックスでサブスクリプションを再初期化するように設定すします。このダイアログ ボックスは、Microsoft SQL Server Management Studio の [ローカル パブリケーション] フォルダーおよび [ローカル サブスクリプション] フォルダーから使用できます。 また、 [すべてのサブスクリプション] タブやレプリケーション モニターのパブリケーション ノードからマークを設定することもできます。 レプリケーション モニターの起動の詳細については、「Start the Replication Monitor」 (レプリケーション モニターの開始) を参照してください。 サブスクリプションの再初期化の設定には、以下のオプションがあります。
[現在のスナップショットを使用する]
このオプションを選択すると、次にディストリビューション エージェントまたはマージ エージェントが実行されたときに、現在のスナップショットがサブスクライバーに適用されます。 有効なスナップショットが使用できない場合、このオプションは選択できません。[新しいスナップショットを使用する]
このオプションを選択すると、新しいスナップショットによってサブスクリプションが再初期化されます。 スナップショットは、スナップショット エージェントによって生成された後にだけ、サブスクライバーに適用できます。 スナップショットがスケジュールに従って実行されるように設定している場合は、スナップショット エージェントが次回実行されて終了するまでサブスクリプションを再初期化できません。 スナップショット エージェントをすぐに開始するには、 [今すぐ新しいスナップショットを生成する] を選択します。[再初期化する前に、同期されていない変更をアップロード]
マージ レプリケーションのみです。 このオプションを選択すると、サブスクライバーのデータがスナップショットで上書きされる前に、保留中の変更がサブスクリプション データベースからアップロードされます。パラメーター化フィルターを追加、削除、変更する場合は、再初期化の際、サブスクライバーで保留中の変更をパブリッシャーにアップロードできません。 保留中の変更をアップロードしたい場合は、フィルターを変更する前にすべてのサブスクリプションを同期してください。
サブスクリプションは、次回同期されるときに再初期化されます。ディストリビューション エージェント (トランザクション レプリケーションの場合) またはマージ エージェント (マージ レプリケーションの場合) により、再初期化するように設定されている各サブスクライバーに最新のスナップショットが適用されます。 サブスクリプションの同期の詳細については、「 Synchronize a Push Subscription 」および「 Synchronize a Pull Subscriptionダイアログ ボックスを使用します。
Management Studio で単一のプッシュ サブスクリプションまたはプル サブスクリプションに再初期化を設定するには (パブリッシャーで実行)
Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。
[レプリケーション] フォルダーを展開し、 [ローカル パブリケーション] フォルダーを展開します。
再初期化するサブスクリプションが含まれているパブリケーションを展開します。
サブスクリプションを右クリックし、 [再初期化]をクリックします。
[サブスクリプションの再初期化] ダイアログ ボックスでオプションを選択し、 [再初期化するように設定]をクリックします。
Management Studio で単一のプル サブスクリプションに再初期化を設定するには (サブスクライバーで実行)
Management Studio でサブスクライバ―に接続し、サーバー ノードを展開します。
[レプリケーション] フォルダーを展開し、 [ローカル サブスクリプション] フォルダーを展開します。
サブスクリプションを右クリックし、 [再初期化]をクリックします。
表示される確認のダイアログ ボックスで、 [はい]をクリックします。
Management Studio ですべてのサブスクリプションに再初期化を設定するには
Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。
[レプリケーション] フォルダーを展開し、 [ローカル パブリケーション] フォルダーを展開します。
サブスクリプションを再初期化するパブリケーションを右クリックし、 [すべてのサブスクリプションの再初期化]をクリックします。
[サブスクリプションの再初期化] ダイアログ ボックスでオプションを選択し、 [再初期化するように設定]をクリックします。
レプリケーション モニターで単一のプッシュ サブスクリプションまたはプル サブスクリプションに再初期化を設定するには
レプリケーション モニターで、左ペインのパブリッシャー グループを展開し、パブリッシャーを展開してパブリケーションをクリックします。
[すべてのサブスクリプション] タブをクリックします。
再初期化するサブスクリプションを右クリックし、 [サブスクリプションの再初期化]をクリックします。
[サブスクリプションの再初期化] ダイアログ ボックスでオプションを選択し、 [再初期化するように設定]をクリックします。
レプリケーション モニターですべてのサブスクリプションに再初期化を設定するには
レプリケーション モニターの左ペインでパブリッシャー グループを展開し、パブリッシャーを展開します。
サブスクリプションを再初期化するパブリケーションを右クリックし、 [すべてのサブスクリプションの再初期化]をクリックします。
[サブスクリプションの再初期化] ダイアログ ボックスでオプションを選択し、 [再初期化するように設定]をクリックします。
Transact-SQL の使用
サブスクリプションは、プログラムでレプリケーション ストアド プロシージャを使用して再初期化できます。 使用するストアド プロシージャは、サブスクリプションの種類 (プッシュまたはプル) およびサブスクリプションが属しているパブリケーションの種類によって変わります。
トランザクション パブリケーションに対するプル サブスクリプションを再初期化するには
サブスクライバー側のサブスクリプション データベースに対して、sp_reinitpullsubscription (Transact-SQL) を実行します。 @publisher、 @publisher_db、および @publicationを指定します。 これにより、ディストリビューション エージェントの次回実行時に再初期化するようにサブスクリプションにマークが付けられます。
(省略可) サブスクライバーでディストリビューション エージェントを起動し、サブスクリプションを同期します。 詳細については、「 Synchronize a Pull Subscription」をご覧ください。
トランザクション パブリケーションに対するプッシュ サブスクリプションを再初期化するには
パブリッシャーで、sp_reinitsubscription (Transact-SQL) を実行します。 @publication、 @subscriber、および @destination_dbを指定します。 これにより、ディストリビューション エージェントの次回実行時に再初期化するようにサブスクリプションにマークが付けられます。
(省略可) ディストリビューターでディストリビューション エージェントを起動し、サブスクリプションを同期します。 詳細については、「 プッシュ サブスクリプションの同期」をご覧ください。
マージ パブリケーションに対するプル サブスクリプションを再初期化するには
サブスクライバー側のサブスクリプション データベースに対して、sp_reinitmergepullsubscription (Transact-SQL) を実行します。 @publisher、 @publisher_db、および @publicationを指定します。 再初期化が実行される前にサブスクライバーの変更をアップロードする場合は、 @upload_first に trueを指定します。 これにより、マージ エージェントの次回実行時に再初期化するようにサブスクリプションにマークが付けられます。
重要
パラメーター化フィルターを追加、削除、変更する場合は、再初期化の際、サブスクライバーで保留中の変更をパブリッシャーにアップロードできません。 保留中の変更をアップロードしたい場合は、フィルターを変更する前にすべてのサブスクリプションを同期してください。
(省略可) サブスクライバーでマージ エージェントを起動し、サブスクリプションを同期します。 詳細については、「 Synchronize a Pull Subscription」をご覧ください。
マージ パブリケーションに対するプッシュ サブスクリプションを再初期化するには
パブリッシャーで、sp_reinitmergesubscription (Transact-SQL) を実行します。 @publication、 @subscriber、および @subscriber_dbを指定します。 再初期化が実行される前にサブスクライバーの変更をアップロードする場合は、 @upload_first に trueを指定します。 これにより、ディストリビューション エージェントの次回実行時に再初期化するようにサブスクリプションにマークが付けられます。
重要
パラメーター化フィルターを追加、削除、変更する場合は、再初期化の際、サブスクライバーで保留中の変更をパブリッシャーにアップロードできません。 保留中の変更をアップロードしたい場合は、フィルターを変更する前にすべてのサブスクリプションを同期してください。
(省略可) ディストリビューターでマージ エージェントを起動し、サブスクリプションを同期します。 詳細については、「 プッシュ サブスクリプションの同期」をご覧ください。
新しいマージ パブリケーションを作成するときに再初期化ポリシーを設定するには
パブリッシャー側のパブリケーション データベースで、 sp_addmergepublicationを実行し、次のいずれかの値を @automatic_reinitialization_policyに指定します。
1 - パブリケーションに対する変更に応じてサブスクリプションが自動的に再初期化される前に、サブスクライバーの変更がアップロードされます。
0 - パブリケーションに対する変更に応じてサブスクリプションが自動的に再初期化されるときに、サブスクライバーの変更は破棄されます。
重要
パラメーター化フィルターを追加、削除、変更する場合は、再初期化の際、サブスクライバーで保留中の変更をパブリッシャーにアップロードできません。 保留中の変更をアップロードしたい場合は、フィルターを変更する前にすべてのサブスクリプションを同期してください。
詳しくは、「 パブリケーションを作成」をご覧ください。
既存のマージ パブリケーションの再初期化ポリシーを変更するには
パブリッシャー側のパブリケーション データベースに対して sp_changemergepublicationを実行します。 @property に automatic_reinitialization_policy を指定し、次のいずれかの値を @valueに指定します。
1 - パブリケーションに対する変更に応じてサブスクリプションが自動的に再初期化される前に、サブスクライバーの変更がアップロードされます。
0 - パブリケーションに対する変更に応じてサブスクリプションが自動的に再初期化されるときに、サブスクライバーの変更は破棄されます。
重要
パラメーター化フィルターを追加、削除、変更する場合は、再初期化の際、サブスクライバーで保留中の変更をパブリッシャーにアップロードできません。 保留中の変更をアップロードしたい場合は、フィルターを変更する前にすべてのサブスクリプションを同期してください。
詳しくは、「 View and Modify Publication Properties」をご覧ください。
レプリケーション管理オブジェクト (RMO) の使用
次回の同期で新しいスナップショットが適用されるように、個別のサブスクリプションに再初期化のマークを付けることができます。 レプリケーション管理オブジェクト (RMO) を使用することで、プログラムによってサブスクリプションを再初期化できます。 使用するクラスは、サブスクリプションが属するパブリケーションの種類と、サブスクリプションの種類 (プッシュ サブスクリプションまたはプル サブスクリプション) に応じて変わります。
トランザクション パブリケーションに対するプル サブスクリプションを再初期化するには
ServerConnection クラスを使用して、サブスクライバーへの接続を作成します。
TransPullSubscription クラスのインスタンスを作成し、 PublicationName、 DatabaseName、 PublisherName、 PublicationDBNameを設定して、手順 1. の接続を ConnectionContextに設定します。
LoadProperties メソッドを呼び出して、オブジェクトのプロパティを取得します。
Note
このメソッドが falseを返す場合、手順 2. でサブスクリプション プロパティを不適切に設定したか、プル サブスクリプションが存在していません。
Reinitialize メソッドを呼び出します。 このメソッドにより、サブスクリプションを再初期化するようにマークされます。
プル サブスクリプションを同期します。 詳細については、「 Synchronize a Pull Subscription」をご覧ください。
トランザクション パブリケーションに対するプッシュ サブスクリプションを再初期化するには
ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。
TransSubscription クラスのインスタンスを作成し、 PublicationName、 DatabaseName、 SubscriberName、 SubscriptionDBNameを設定して、手順 1. の接続を ConnectionContextに設定します。
LoadProperties メソッドを呼び出して、オブジェクトのプロパティを取得します。
Note
このメソッドが falseを返す場合、手順 2. でサブスクリプション プロパティを不適切に設定したか、プッシュ サブスクリプションが存在していません。
Reinitialize メソッドを呼び出します。 このメソッドにより、サブスクリプションを再初期化するようにマークされます。
プッシュ サブスクリプションを同期します。 詳細については、「 プッシュ サブスクリプションの同期」をご覧ください。
マージ パブリケーションに対するプル サブスクリプションを再初期化するには
ServerConnection クラスを使用して、サブスクライバーへの接続を作成します。
MergePullSubscription クラスのインスタンスを作成し、 PublicationName、 DatabaseName、 PublisherName、 PublicationDBNameを設定して、手順 1. の接続を ConnectionContextに設定します。
LoadProperties メソッドを呼び出して、オブジェクトのプロパティを取得します。
Note
このメソッドが falseを返す場合、手順 2. でサブスクリプション プロパティを不適切に設定したか、プル サブスクリプションが存在していません。
Reinitialize メソッドを呼び出します。 再初期化の前に true を渡してサブスクライバーの変更をアップロードするか、 false を渡して再初期化し、サブスクライバーの保留中の変更をすべて破棄します。 このメソッドにより、サブスクリプションを再初期化するようにマークされます。
Note
サブスクリプションの有効期限が切れると、変更をアップロードできません。 詳しくは、「 Set the Expiration Period for Subscriptions」をご覧ください。
プル サブスクリプションを同期します。 詳細については、「 Synchronize a Pull Subscription」をご覧ください。
マージ パブリケーションに対するプッシュ サブスクリプションを再初期化するには
ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。
MergeSubscription クラスのインスタンスを作成し、 PublicationName、 DatabaseName、 SubscriberName、 SubscriptionDBNameを設定して、手順 1. の接続を ConnectionContextに設定します。
LoadProperties メソッドを呼び出して、オブジェクトのプロパティを取得します。
Note
このメソッドが falseを返す場合、手順 2. でサブスクリプション プロパティを不適切に設定したか、プッシュ サブスクリプションが存在していません。
Reinitialize メソッドを呼び出します。 再初期化の前に true を渡してサブスクライバーの変更をアップロードするか、 false を渡して再初期化し、サブスクライバーの保留中の変更をすべて破棄します。 このメソッドにより、サブスクリプションを再初期化するようにマークされます。
Note
サブスクリプションの有効期限が切れると、変更をアップロードできません。 詳しくは、「 Set the Expiration Period for Subscriptions」をご覧ください。
プッシュ サブスクリプションを同期します。 詳細については、「 プッシュ サブスクリプションの同期」をご覧ください。
例 (RMO)
次の例では、トランザクション パブリケーションに対するプル サブスクリプションを再初期化します。
// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksProductTran";
String publicationDbName = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";
// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);
TransPullSubscription subscription;
try
{
// Connect to the Subscriber.
conn.Connect();
// Define subscription properties.
subscription = new TransPullSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = subscriptionDbName;
subscription.PublisherName = publisherName;
subscription.PublicationDBName = publicationDbName;
subscription.PublicationName = publicationName;
// If the pull subscription and the job exists, mark the subscription
// for reinitialization and start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
subscription.Reinitialize();
subscription.SynchronizeWithJob();
}
else
{
// Do something here if the subscription does not exist.
throw new ApplicationException(String.Format(
"A subscription to '{0}' does not exists on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Do appropriate error handling here.
throw new ApplicationException("The subscription could not be reinitialized.", ex);
}
finally
{
conn.Disconnect();
}
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)
Dim subscription As TransPullSubscription
Try
' Connect to the Subscriber.
conn.Connect()
' Define subscription properties.
subscription = New TransPullSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = subscriptionDbName
subscription.PublisherName = publisherName
subscription.PublicationDBName = publicationDbName
subscription.PublicationName = publicationName
' If the pull subscription and the job exists, mark the subscription
' for reinitialization and start the agent job.
If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
subscription.Reinitialize()
subscription.SynchronizeWithJob()
Else
' Do something here if the subscription does not exist.
Throw New ApplicationException(String.Format( _
"A subscription to '{0}' does not exists on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Do appropriate error handling here.
Throw New ApplicationException("The subscription could not be reinitialized.", ex)
Finally
conn.Disconnect()
End Try
次の例では、最初にサブスクライバーの保留中の変更をアップロードした後、マージ パブリケーションに対するプル サブスクリプションを初期化します。
// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksSalesOrdersMerge";
String publicationDbName = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";
// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
conn.Connect();
// Define subscription properties.
subscription = new MergePullSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = subscriptionDbName;
subscription.PublisherName = publisherName;
subscription.PublicationDBName = publicationDbName;
subscription.PublicationName = publicationName;
// If the pull subscription and the job exists, mark the subscription
// for reinitialization after upload and start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
subscription.Reinitialize(true);
subscription.SynchronizeWithJob();
}
else
{
// Do something here if the subscription does not exist.
throw new ApplicationException(String.Format(
"A subscription to '{0}' does not exists on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Do appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
conn.Connect()
' Define subscription properties.
subscription = New MergePullSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = subscriptionDbName
subscription.PublisherName = publisherName
subscription.PublicationDBName = publicationDbName
subscription.PublicationName = publicationName
' If the pull subscription and the job exists, mark the subscription
' for reinitialization after upload and start the agent job.
If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
subscription.Reinitialize(True)
subscription.SynchronizeWithJob()
Else
' Do something here if the subscription does not exist.
Throw New ApplicationException(String.Format( _
"A subscription to '{0}' does not exists on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Do appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try