驗證訂閱者端的資料
本主題描述如何使用 SQL Server Management Studio、Transact-SQL 或 Replication Management Objects (RMO),在 SQL Server 2012 中驗證訂閱者端的資料。
驗證資料是一個三部份式的處理:
「標示」要驗證之發行集的單個或所有訂閱。 在 [驗證單一訂閱]、[驗證多個訂閱] 和 [驗證全部訂閱] 對話方塊 (位於 Microsoft SQL Server Management Studio 的 [本機發行集] 資料夾和 [本機訂閱] 資料夾) 中標示要驗證的訂閱。 您也可以從複寫監視器中的 [所有訂閱] 索引標籤、[訂閱監看清單] 索引標籤和發行集節點標示訂閱。 如需有關啟動複寫監視器的資訊,請參閱<啟動複寫監視器>。
在下一次由「散發代理程式」(用於異動複寫) 或「合併代理程式」(用於合併式複寫) 進行同步時,將對訂閱進行驗證。 「散發代理程式」通常連續執行,此時可立即進行驗證;「合併代理程式」通常視需要執行,此時驗證將在執行代理程式後進行。
檢視驗證結果:
在「複寫監視器」的詳細資料視窗中:用於異動複寫的 [散發者到訂閱者記錄] 索引標籤和用於合併式複寫的 [同步處理記錄] 索引標籤上。
在 Management Studio 的 [檢視同步處理的狀態] 對話方塊中。
本主題內容
開始之前:
限制事項
若要驗證訂閱者端的資料,請使用:
SQL Server Management Studio
Transact-SQL
Replication Management Objects (RMO)
開始之前
限制事項
「複寫監視器」的程序僅用於發送訂閱,因為發送訂閱無法在「複寫監視器」中同步。 但是,您可以標示要驗證的訂閱,並在「複寫監視器」中檢視發送訂閱的驗證結果。
驗證結果會指示驗證成功或失敗,但不會在驗證失敗時指定失敗的資料列。 若要比較「發行者」和「訂閱者」端的資料,請使用 tablediff 公用程式。 如需使用此公用程式處理複寫資料的詳細資訊,請參閱<比較複寫資料表的差異 (複寫程式設計)>。
[Top]
使用 SQL Server Management Studio
若要驗證交易式發行集之訂閱的資料 (Management Studio)
連接到 SQL Server Management Studio 中的發行者,然後展開伺服器節點。
展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。
以滑鼠右鍵按一下您要驗證訂閱的發行集,然後按一下 [驗證訂閱]。
在 [驗證訂閱] 對話方塊中,選取要驗證的訂閱:
選取 [驗證所有的 SQL Server 訂閱]。
選取 [驗證下列訂閱],然後選取一或多個訂閱。
若要指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼),請按一下 [驗證選項],然後在 [訂閱驗證選項] 對話方塊中指定選項。
按一下 [確定]。
在複寫監視器或 [檢視同步處理的狀態] 對話方塊中檢視驗證結果。 針對每個訂閱:
展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]。
如果代理程式尚未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動]。 對話方塊就會顯示關於驗證的參考用訊息。
如果您未看到任何關於驗證的訊息,則代理程式已經記錄了後續訊息。 在此情況下,請在複寫監視器中檢視驗證結果。 如需詳細資訊,請參閱這個主題中<複寫監視器>的如何程序。
若要驗證合併式發行集之單一訂閱的資料 (Management Studio)
連接到 SQL Server Management Studio 中的發行者,然後展開伺服器節點。
展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。
展開要驗證訂閱的發行集,以滑鼠右鍵按一下訂閱,然後按一下 [驗證單一訂閱]。
在 [驗證訂閱] 對話方塊中,選取 [驗證此訂閱]。
若要指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼),請按一下 [選項],然後在 [訂閱驗證選項] 對話方塊中指定選項。
按一下 [確定]。
在「複寫監視器」或 [檢視同步處理的狀態] 對話方塊中檢視驗證結果:
展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]。
如果代理程式未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動]。 對話方塊就會顯示關於驗證的參考用訊息。
如果您未看到任何關於驗證的訊息,則代理程式已經記錄了後續訊息。 在此情況下,請在複寫監視器中檢視驗證結果。 如需詳細資訊,請參閱這個主題中<複寫監視器>的如何程序。
若要驗證合併式發行集之所有訂閱的資料 (Management Studio)
連接到 SQL Server Management Studio 中的發行者,然後展開伺服器節點。
展開 [複寫] 資料夾,然後展開 [本機發行集] 資料夾。
以滑鼠右鍵按一下您要驗證訂閱的發行集,然後按一下 [驗證所有訂閱]。
在 [驗證所有訂閱] 對話方塊中,指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼)。
按一下 [確定]。
在複寫監視器或 [檢視同步處理的狀態] 對話方塊中檢視驗證結果。 針對每個訂閱:
展開發行集,以滑鼠右鍵按一下訂閱,然後按一下 [檢視同步處理的狀態]。
如果代理程式未執行,請按一下 [檢視同步處理的狀態] 對話方塊中的 [啟動]。 對話方塊就會顯示關於驗證的參考用訊息。
如果您未看到任何關於驗證的訊息,則代理程式已經記錄了後續訊息。 在此情況下,請在複寫監視器中檢視驗證結果。 如需詳細資訊,請參閱這個主題中<複寫監視器>的如何程序。
若要驗證交易式發行集之所有發送訂閱的資料 (複寫監視器)
在複寫監視器的左窗格中展開發行者群組,然後展開發行者。
以滑鼠右鍵按一下您要驗證訂閱的發行集,然後按一下 [驗證訂閱]。
在 [驗證訂閱] 對話方塊中,選取要驗證的訂閱:
選取 [驗證所有的 SQL Server 訂閱]。
選取 [驗證下列訂閱],然後選取一或多個訂閱。
若要指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼),請按一下 [驗證選項],然後在 [訂閱驗證選項] 對話方塊中指定選項。
按一下 [確定]。
按一下 [所有訂閱] 索引標籤。
檢視驗證結果。 針對每個發送訂閱:
如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]。
以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]。
檢視 [所選取工作階段中的動作] 文字區域之 [散發者到訂閱者記錄] 索引標籤中的資訊。
若要驗證合併式發行集之單一發送訂閱的資料 (複寫監視器)
在複寫監視器中,展開左窗格裡的發行者群組,展開發行者,然後按一下發行集。
按一下 [所有訂閱] 索引標籤。
以滑鼠右鍵按一下您要驗證的訂閱,然後按一下 [驗證單一訂閱]。
在 [驗證訂閱] 對話方塊中,選取 [驗證此訂閱]。
若要指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼),請按一下 [選項],然後在 [訂閱驗證選項] 對話方塊中指定選項。
按一下 [確定]。
按一下 [所有訂閱] 索引標籤。
檢視驗證結果:
如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]。
以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]。
在 [同步處理記錄] 索引標籤上的 [所選取工作階段的最後訊息] 測試區域中檢視資訊。
若要驗證合併式發行集之所有發送訂閱的資料 (複寫監視器)
在複寫監視器的左窗格中展開發行者群組,然後展開發行者。
以滑鼠右鍵按一下您要驗證訂閱的發行集,然後按一下 [驗證所有訂閱]。
在 [驗證所有訂閱] 對話方塊中,指定要執行驗證的類型 (資料列計數,或資料列計數與總和檢查碼)。
按一下 [確定]。
按一下 [所有訂閱] 索引標籤。
檢視驗證結果。 針對每個發送訂閱:
如果代理程式未執行,請以滑鼠右鍵按一下訂閱,然後按一下 [啟動同步處理]。
以滑鼠右鍵按一下訂閱,然後按一下 [檢視詳細資料]。
在 [同步處理記錄] 索引標籤上的 [所選取工作階段的最後訊息] 測試區域中檢視資訊。
[Top]
使用 Transact-SQL
若要驗證交易式發行集中所有發行項的資料
在發行集資料庫的「發行者」端,執行 sp_publication_validation (Transact-SQL)。 指定 @publication,以及下列其中一個 @rowcount_only 值:
1 - 只限列數檢查 (預設值)
2 - 列數及二進位總和檢查碼。
[!附註]
在執行 sp_publication_validation (Transact-SQL) 時,會針對發行集中的每個發行項執行 sp_article_validation (Transact-SQL)。 若要成功地執行 sp_publication_validation (Transact-SQL),您必須有已發行基底資料表之所有資料行的 SELECT 權限。
(選擇性) 針對每個訂閱啟動「散發代理程式」(如果尚未執行)。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。
檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱<驗證複寫的資料>。
若要驗證交易式發行集中單一發行項的資料
在發行集資料庫的「發行者」端,執行 sp_article_validation (Transact-SQL)。 指定 @publication、@article 的發行項名稱,及 @rowcount_only 的下列其中一個值:
1 - 只限列數檢查 (預設值)
2 - 列數及二進位總和檢查碼。
[!附註]
若要成功地執行 sp_article_validation (Transact-SQL),您必須有已發行基底資料表之所有資料行的 SELECT 權限。
(選擇性) 針對每個訂閱啟動「散發代理程式」(如果尚未執行)。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。
檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱<驗證複寫的資料>。
若要驗證交易式發行集中單一訂閱者的資料
在發行集資料庫的「發行者」端,使用 BEGIN TRANSACTION (Transact-SQL) 來開啟明確交易。
在發行集資料庫的「發行者」端,執行 sp_marksubscriptionvalidation (Transact-SQL)。 指定 @publication 的發行集、@subscriber 的「訂閱者」名稱,及 @destination_db 的訂閱資料庫名稱。
(選擇性) 針對每個要驗證的訂閱重複步驟 2。
在發行集資料庫的「發行者」端,執行 sp_article_validation (Transact-SQL)。 指定 @publication、@article 的發行項名稱,及 @rowcount_only 的下列其中一個值:
1 - 只限列數檢查 (預設值)
2 - 列數及二進位總和檢查碼。
[!附註]
若要成功地執行 sp_article_validation (Transact-SQL),您必須有已發行基底資料表之所有資料行的 SELECT 權限。
在發行集資料庫的「發行者」端,使用 COMMIT TRANSACTION (Transact-SQL) 來認可交易。
(選擇性) 針對每個要驗證的發行項重複步驟 1 到 5。
檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱<驗證訂閱者端的資料>。
若要驗證所有合併發行集訂閱中的資料
在發行集資料庫的「發行者」端,執行 sp_validatemergepublication (Transact-SQL)。 指定 @publication 以及下列其中一個 @level 值:
1 - 只驗證列數。
3 - 驗證列數二進位總和檢查碼。
這會標示所有訂閱以供驗證。
檢查代理程式輸出,以取得驗證的結果。 如需詳細資訊,請參閱<驗證訂閱者端的資料>。
若要驗證選取的合併發行集訂閱中的資料
在發行集資料庫的「發行者」端,執行 sp_validatemergesubscription (Transact-SQL)。 指定 @publication、@subscriber 的「訂閱者」名稱、@subscriber_db 的訂閱資料庫名稱,及下列其中一個 @level 值:
1 - 只驗證列數。
3 - 驗證列數二進位總和檢查碼。
這會標示選取的訂閱以供驗證。
檢查代理程式輸出,以取得驗證的結果。
針對每個要驗證的訂閱重複步驟 1 到 3。
[!附註]
您也可以在執行 複寫合併代理程式 時藉由指定 -Validate 參數,在同步處理結束時驗證合併發行集的訂閱。
若要使用合併代理程式參數驗證訂閱中的資料
以下列其中一種方法,從命令提示字元啟動「合併代理程式」(在「訂閱者」端的為提取訂閱,在「散發者」端的則為發送訂閱)。
針對 -Validate 參數,指定值 1 (列數) 或 3 (列數和二進位總和檢查碼)。
針對 -ProfileName 參數,指定 rowcount validation 或 rowcount and checksum validation。
[Top]
使用 Replication Management Objects (RMO)
複寫能讓您以程式設計的方式,使用 Replication Management Objects (RMO) 驗證「訂閱者」和「發行者」兩端的資料相符。 您使用的物件依照複寫拓撲的類型而定。 異動複寫需要驗證發行集的所有訂閱。
[!附註]
如需範例,請參閱本主題稍後的範例 (RMO)。
若要驗證交易式發行集中所有發行項的資料
使用 ServerConnection 類別建立與「發行者」的連接。
建立 TransPublication 類別的執行個體。 設定發行集的 Name 和 DatabaseName 屬性。 將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。
呼叫 LoadProperties 方法以取得物件的剩餘屬性。 如果此方法傳回 false,則表示步驟 2 中的發行集屬性定義不正確,或者該發行集不存在。
呼叫 ValidatePublication 方法。 傳遞下列項目:
此為布林值,指出在驗證完成後是否要停止「散發代理程式」。
這會標示要驗證的發行項。
如果尚未執行,請啟動「散發代理程式」以同步處理每個訂閱。 如需詳細資訊,請參閱<同步處理發送訂閱>或<同步處理提取訂閱>。 驗證作業的結果會寫入至代理程式記錄。 如需詳細資訊,請參閱<監視複寫>。
若要驗證所有合併發行集訂閱中的資料
使用 ServerConnection 類別建立與「發行者」的連接。
建立 MergePublication 類別的執行個體。 設定發行集的 Name 和 DatabaseName 屬性。 將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。
呼叫 LoadProperties 方法以取得物件的剩餘屬性。 如果此方法傳回 false,則表示步驟 2 中的發行集屬性定義不正確,或者該發行集不存在。
呼叫 ValidatePublication 方法。 傳遞所要的 ValidationOption。
為每個訂閱執行「合併代理程式」以啟動驗證,或等候下一個排程的代理程式執行。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。 驗證作業的結果會寫入至代理程式記錄,您可使用「複寫監視器」來加以檢視。 如需詳細資訊,請參閱<監視複寫>。
若要驗證合併發行集單一訂閱中的資料
使用 ServerConnection 類別建立與「發行者」的連接。
建立 MergePublication 類別的執行個體。 設定發行集的 Name 和 DatabaseName 屬性。 將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。
呼叫 LoadProperties 方法以取得物件的剩餘屬性。 如果此方法傳回 false,則表示步驟 2 中的發行集屬性定義不正確,或者該發行集不存在。
呼叫 ValidateSubscription 方法。 傳遞正在進行驗證之「訂閱者」和訂閱資料庫的名稱以及所要的 ValidationOption。
為訂閱執行「合併代理程式」以啟動驗證,或等候下一個排程的代理程式執行。 如需詳細資訊,請參閱<同步處理提取訂閱>和<同步處理發送訂閱>。 驗證作業的結果會寫入至代理程式記錄,您可使用「複寫監視器」來加以檢視。 如需詳細資訊,請參閱<監視複寫>。
範例 (RMO)
此範例會標示交易式發行集的所有訂閱,以進行列數驗證。
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2012";
TransPublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Set the required properties for the publication.
publication = new TransPublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// If we can't get the properties for this publication,
// throw an application exception.
if (publication.LoadProperties())
{
// Initiate validataion for all subscriptions to this publication.
publication.ValidatePublication(ValidationOption.RowCountOnly,
ValidationMethod.ConditionalFast, false);
// If not already running, start the Distribution Agent at each
// Subscriber to synchronize and validate the subscriptions.
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication. " +
"Ensure that the publication {0} exists on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Do error handling here.
throw new ApplicationException(
"Subscription validation could not be initiated.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2012"
Dim publication As TransPublication
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Set the required properties for the publication.
publication = New TransPublication()
publication.ConnectionContext = conn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' If we can't get the properties for this publication,
' throw an application exception.
If publication.LoadProperties() Then
' Initiate validataion for all subscriptions to this publication.
publication.ValidatePublication(ValidationOption.RowCountOnly, _
ValidationMethod.ConditionalFast, False)
' If not already running, start the Distribution Agent at each
' Subscriber to synchronize and validate the subscriptions.
Else
Throw New ApplicationException(String.Format( _
"Settings could not be retrieved for the publication. " + _
"Ensure that the publication {0} exists on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Do error handling here.
Throw New ApplicationException( _
"Subscription validation could not be initiated.", ex)
Finally
conn.Disconnect()
End Try
此範例會標示合併式發行集的特定訂閱,以進行列數驗證。
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2012";
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
MergePublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Set the required properties for the publication.
publication = new MergePublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// If we can't get the properties for this merge publication, then throw an application exception.
if (publication.LoadProperties())
{
// Initiate validation of the specified subscription.
publication.ValidateSubscription(subscriberName,
subscriptionDbName, ValidationOption.RowCountOnly);
// Start the Merge Agent to synchronize and validate the subscription.
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication. " +
"Ensure that the publication {0} exists on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Do error handling here.
throw new ApplicationException(String.Format(
"The subscription at {0} to the {1} publication could not " +
"be validated.", subscriberName, publicationName), ex);
}
finally
{
conn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2012"
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publication As MergePublication
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Set the required properties for the publication.
publication = New MergePublication()
publication.ConnectionContext = conn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' If we can't get the properties for this merge publication, then throw an application exception.
If publication.LoadProperties() Then
' Initiate validation of the specified subscription.
publication.ValidateSubscription(subscriberName, _
subscriptionDbName, ValidationOption.RowCountOnly)
' Start the Merge Agent to synchronize and validate the subscription.
Else
Throw New ApplicationException(String.Format( _
"Settings could not be retrieved for the publication. " + _
"Ensure that the publication {0} exists on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Do error handling here.
Throw New ApplicationException(String.Format( _
"The subscription at {0} to the {1} publication could not " + _
"be validated.", subscriberName, publicationName), ex)
Finally
conn.Disconnect()
End Try
[Top]