共用方式為


使用警示以通知復寫代理程式事件

SQL Server Management Studio 和 Microsoft SQL Server Agent 可讓您使用警示來監視事件,例如復寫代理程式事件。 SQL Server Agent 會監視 Windows 應用程式記錄檔中與警示相關聯的事件。 如果發生這類事件,SQL Server Agent 會執行您已定義的工作,並/或傳送電子郵件或呼叫器訊息給指定的作員,以自動回應。 SQL Server 包含一組預先定義的複寫代理程式警示,您可以設定為執行工作和/或通知作員。 如需了解定義執行工作的更多資訊,請參閱本主題中「自動化警報回應」一節。

當計算機設定為散發者時,會安裝下列警示:

訊息識別碼 預先定義的警示 引發警報的條件 在 msdb..sysreplicationalerts 中輸入其他資訊。
14150 複寫:代理程式成功 代理程式已成功關閉。 是的
14151 複寫:代理程序失敗 代理程式會關閉並且發生錯誤。 是的
14152 複寫:代理程式重試 代理程式在重試作業失敗后關閉 (代理程序發生錯誤,例如伺服器無法使用、死結、連線失敗或逾時失敗)。 是的
14157 複寫:已卸除過期的訂用帳戶 已取消過期的訂閱。
20572 複寫:驗證失敗后重新初始化的訂用帳戶 回應作業「在數據驗證失敗時重新初始化訂用帳戶」會成功重新初始化訂閱。
20574 複寫:訂閱者數據驗證失敗 分發或合併代理程式的資料驗證失敗。 是的
20575 複寫:訂閱者已通過數據驗證 分發代理程式或合併代理程式通過資料驗證。 是的
20578 複寫:代理程式自定義關機
22815 點對點衝突偵測警示 散發代理程式在嘗試在點對點節點套用變更時偵測到衝突。 是的

除了這些警示之外,復寫監視器還提供一組與狀態和效能相關的警告和警示。 如需詳細資訊,請參閱 在復寫監視器警示基礎結構中設定臨界值和警告 。 如需詳細資訊,請參閱 建立 User-Defined 事件

設定預先定義的復寫警示

直接檢視應用程式記錄檔

若要檢視 Windows 應用程式記錄檔,請使用 Microsoft Windows 事件查看器。 應用程式記錄檔包含 SQL Server 錯誤訊息,以及電腦上許多其他活動的訊息。 不同於 SQL Server 錯誤記錄檔,每次啟動 SQL Server 時,都不會建立新的應用程式記錄檔(每個 SQL Server 會話都會將新事件寫入現有的應用程式記錄檔):不過,您可以指定將保留記錄事件的時間長度。 當您檢視 Windows 應用程式記錄檔時,您可以篩選特定事件的記錄檔。 如需詳細資訊,請參閱 Windows 文件集。

自動化對警示的回應

複製會為數據驗證失敗的訂閱提供回應作業,並提供一個架構,用於建立警示的額外自動化回應。 回應作業的標題為 資料驗證失敗時重新初始化訂閱,並儲存在 SQL Server Management Studio 的 SQL Server Agent 作業 資料夾中。 如需啟用此回應作業的相關信息,請參閱 設定預先定義的複寫警示 (SQL Server Management Studio) 。 如果交易式出版刊物中的文章未通過驗證,回應作業只會重新初始化未通過驗證的文章。 如果合併式發行集中的發行項驗證失敗,回應作業會重新初始化發行集中的所有發行項。

自動化回應的架構

通常,當警示發生時,您能夠依賴的唯一資訊就是警示訊息本身,這能協助您了解導致警示的原因以及要採取的適當行動。 剖析這項資訊可能會容易出錯且耗時。 復寫可藉由在 sysreplicationalerts 系統數據表中提供警示的其他資訊,讓自動回應變得更容易;所提供的資訊已經剖析成自定義程式容易使用的表單。

例如,如果訂閱者 A 的 Sales.SalesOrderHeader 數據表中的數據驗證失敗,SQL Server 可以觸發訊息 20574,通知您該失敗。 您收到的訊息為:「訂閱者 'A' 在出版物 'MyPublication' 中訂閱的文章 'SalesOrderHeader' 數據驗證失敗。」

如果您根據訊息建立回應,您必須從訊息手動剖析訂閱者名稱、發行項名稱、發行集名稱和錯誤。 不過,因為散發代理程式和合併代理程式會將相同的資訊寫入 sysreplicationalerts (以及代理程式類型、警示時間、發行集資料庫、訂閱者資料庫和發行集類型等詳細數據),因此響應作業可以直接從數據表查詢相關信息。 雖然確切的數據列無法與警示的特定實例相關聯,但數據表具有 狀態 數據行,可用來追蹤服務專案。 此表中的項目會在歷史保留期間內保留。

例如,如果您要在服務警示訊息 20574 的 Transact-SQL 中建立回應作業,您可以使用下列邏輯:

declare @publisher sysname, @publisher_db sysname, @publication sysname, @publication_type int, @article sysname, @subscriber sysname, @subscriber_db sysname, @alert_id int  
declare hc cursor local for select publisher, publisher_db, publication, publication_type, article, subscriber,   
  subscriber_db, alert_id from   
  msdb..sysreplicationalerts where  
  alert_error_code = 20574 and status = 0  
  for read only  
open hc  
fetch hc into  @publisher, @publisher_db, @publication, @publication_type, @article, @subscriber, @subscriber_db, @alert_id  
while (@@fetch_status <> -1)  
begin  
/* Do custom work  */  
/* Update status to 1, which means the alert has been serviced. This prevents subsequent runs of this job from doing this again */  
update msdb..sysreplicationalerts set status = 1 where alert_id = @alert_id  
 fetch hc into  @publisher, @publisher_db, @publication, @publication_type, @article, @subscriber, @subscriber_db, @alert_id  
end  
close hc  
deallocate hc  

另請參閱

複寫代理程式管理
複寫管理的最佳做法
監視 (複寫)