適用於:SQL Server
Azure SQL 受控執行個體
若對異動複寫的運作方式沒有基本的了解,針對複寫錯誤進行疑難排解可能會令人感到沮喪。 建立發行集的第一個步驟是讓快照集代理程式建立快照集,並將它儲存到快照集資料夾。 接下來,散發代理程式會將快照集套用到訂閱者。
此處理序會建立發行集,並將它置於「同步處理」狀態。 同步處理將分成三個階段進行:
交易將在複寫的物件上發生,且在交易記錄中會標示為「供複寫」。
記錄讀取器代理程式會掃描交易記錄,並尋找標示為「用於複寫」的交易。這些交易接著會儲存至散發資料庫。
散發代理程式會使用讀取器執行緒來掃描散發資料庫。 接著,此代理程式會使用寫入器執行緒連線至訂閱者,將這些變更套用到該訂閱者。
此處理序的任何步驟都可能會發生錯誤。 尋找這些錯誤可能是同步處理問題疑難排解中最具挑戰性的層面。 幸好使用複寫監視器可簡化此處理序。
注意
本疑難排解指南旨在教導疑難排解方法。 它的設計目的不是解決您的特定錯誤,而是提供尋找複寫錯誤的一般指導方針。 提供了一些特定範例,但它們的解決方法可能會因環境而有所不同。 範例錯誤是根據 教學課程:設定兩部完全連線伺服器(交易式)之間的複寫 教學課程。
疑難排解方法
要思考的問題
- 在同步處理過程中的哪個位置複寫失敗?
- 哪個代理程式發生錯誤?
- 上次複寫成功執行是什麼時候? 自那時起有任何變更嗎?
需採取的步驟
使用複寫監視器來識別發生錯誤的複寫時間點 (哪個代理程式?):
- 如果在發行者到散發者區段中發生錯誤,則問題出自記錄讀取器代理程式。
- 如果在散發者到訂閱者區段中發生錯誤,則問題出自散發代理程式。
查看該代理程式在 [作業活動監視器] 中的作業記錄,以找出錯誤的詳細資料。 如果作業歷程記錄未顯示足夠的詳細數據,您可以在該特定代理程式上 啟用詳細信息記錄 。
嘗試判斷適用於該錯誤的解決方案。
尋找快照集代理程式的錯誤
快照集代理程式會產生快照集,並將它寫入至指定的快照集資料夾。
檢視快照集代理程式的狀態:
在 [物件總管] 中,展開 [複寫] 下的 [本機發行集] 節點。
以滑鼠右鍵按一下您的發行集 AdvWorksProductTrans>[檢視快照集代理程式的狀態]。
如果快照集代理程式狀態回報錯誤,您可在快照集代理程式的作業記錄中找到更多詳細資料:
展開 [物件總管] 中的 [SQL Server Agent],然後開啟 [作業活動監視器]。
依據 [分類] 排序,並依分類 REPL-Snapshot 找出快照集代理程式。
以滑鼠右鍵按一下快照集代理程式,然後選取 [檢視記錄]。
在快照集代理程式記錄中,選取相關的記錄項目。 這通常是報告該錯誤之項目「前」的一兩行。 (紅色 X 表示錯誤。) 檢閱記錄下方方塊中的訊息內文:
The replication agent had encountered an exception. Exception Message: Access to path '\\node1\repldata.....' is denied.
如果您的 Windows 許可權未針對快照集資料夾正確設定,您會看到快照集代理程式的「存取遭到拒絕」錯誤。 您必須確認快照集儲存所在資料夾的許可權,並確定用來執行快照集代理程式的帳戶具有存取共用的許可權。
尋找記錄讀取器代理程式的錯誤
記錄讀取器代理程式會連線到您的發行者資料庫,並掃描交易記錄中是否有標示為「用於複寫」的任何交易。然後將這些交易新增至散發資料庫。
在 SQL Server Management Studio 中連線到發行者。 展開伺服器節點,再以滑鼠右鍵按一下 [複寫] 資料夾,然後選取 [啟動複寫監視器]:
隨即開啟複寫監視器:
紅色 X 表示出版物未同步。 展開左側的 [我的發行者],再展開相關的發行者伺服器。
在左側選取 AdvWorksProductTrans 發行集,然後在其中一個索引標籤中尋找紅色 X,以找出問題所在。 在本例中,紅色 X 出現在 [代理程式] 索引標籤上,因此其中一個代理程式發生錯誤:
選取 [代理程式] 索引標籤以找出發生錯誤的代理程式:
此檢視會向您顯示兩個代理程式:快照集代理程式和記錄讀取器代理程式。 發生錯誤的代理程式會有一個紅色 X。在此情況下,它是記錄讀取器代理程式。
在報告錯誤的行上按兩下,以開啟記錄讀取器代理程式的代理程式記錄。 此記錄會提供有關錯誤的詳細資訊:
Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'. The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'. Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'. Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
錯誤通常會在發行者資料庫的擁有者未正確設定時發生。 還原資料庫時也可能會發生此錯誤。 若要驗證這一點,請:
在 [物件總管] 中展開 [資料庫]。
以滑鼠右鍵按一下 [AdventureWorks2022]>[屬性]。
確認擁有者位在 [檔案] 頁面之下。 如果此方塊為空白,這可能就是問題的原因。
如果 [檔案] 頁面上的擁有者為空白,請在 資料庫的內容中開啟 [新增查詢]
AdventureWorks2022
視窗。 執行下列 T-SQL 程式碼:-- set the owner of the database to 'sa' or a specific user account, without the brackets. EXECUTE sp_changedbowner '<useraccount>'; -- example for sa: exec sp_changedbowner 'sa' -- example for user account: exec sp_changedbowner 'sqlrepro\administrator'
您可能需要重新啟動記錄讀取器代理程式:
展開 [物件總管] 的 [SQL Server Agent] 節點,然後開啟 [作業活動監視器]。
依據 [分類] 排序,並依 REPL-LogReader 分類找出記錄讀取器代理程式。
以滑鼠右鍵按一下 [記錄讀取器代理程式] 作業,然後選取 [從下列步驟啟動作業]。
再次開啟複寫監視器,以驗證您的發行集現在正執行同步處理。 如果它尚未開啟,只要以滑鼠右鍵按一下 [物件總管] 中的 [複寫] 即可找到它。
依序選取 AdvWorksProductTrans 發行集和 [代理程式] 索引標籤,並按兩下選取記錄讀取器代理程式來開啟代理程式記錄。 您現在應會看到記錄讀取器代理程式在執行中,且正在複寫命令或其有「無複寫交易」:
尋找散發代理程式的錯誤
散發代理程式會在散發資料庫中尋找資料,然後將它套用到訂閱者。
在 SQL Server Management Studio 中連線到發行者。 展開伺服器節點,再以滑鼠右鍵按一下 [複寫] 資料夾,然後選取 [啟動複寫監視器]。
在 [複寫監視器] 中,選取 [AdvWorksProductTrans] 發行集,然後選取 [所有訂閱] 索引 標籤。以滑鼠右鍵按一下訂閱,然後選取 [檢視詳細資料]:
[散發者到訂閱者記錄] 對話方塊隨即開啟,並會釐清代理程式發生哪個錯誤:
Error messages: Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
此錯誤指出散發代理程式正在重試。 若要尋找更多詳細資訊,請檢查散發代理程式作業記錄:
展開 [物件總管] 中的 [SQL Server Agent] [作業活動監視器]。
依分類排序作業。
依分類 REPL-Distribution 找出散發代理程式。 以滑鼠右鍵按一下代理程式,然後選取 [檢視記錄]。
選取其中一個錯誤項目,檢視視窗底部的錯誤文字:
Message: Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
這個錯誤指出散發代理程式所使用的密碼不正確。 若要解決此問題,請:
展開 [物件總管] 中的 [複寫] 節點。
以滑鼠右鍵按一下訂閱 >[屬性]。
選取代理程式處理帳戶旁的省略符號 (...) 並修改密碼。
以滑鼠右鍵按一下 [物件總管] 中的 [複寫],再次檢查複寫監視器。 [所有訂閱] 下的紅色 X 指出散發代理程式仍有錯誤。
以滑鼠右鍵按一下 [複寫監視器][檢視詳細資料] 中的訂閱,開啟 [發佈到訂閱者] 記錄。 現在錯誤變得不一樣了:
Connecting to Subscriber 'NODE2\SQL2016' Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'. Number: 18456 Message: Login failed for user 'NODE2\repl_distribution'.
此錯誤表示散發代理程式無法連線到訂閱者,因為使用者 NODE2 的登入失敗\repl_distribution。 若要進一步調查,請連線至訂閱者並開啟 [物件總管] 中 [管理] 節點下「目前的」SQL Server 錯誤記錄:
如果您看到這個錯誤,則表示訂閱者缺少登入。 若要解決此錯誤,請參閱 複寫的安全性角色需求。
登入錯誤解決之後,請再次檢查複寫監視器。 如果所有問題都獲得解決,您應該會在發行集名稱旁看到一個綠色箭號,而且 [所有訂閱] 下的狀態為 [執行中]。
再以滑鼠右鍵按一下訂閱,以啟動 [散發者到訂閱者] 記錄,確認是否成功。 如果這是您第一次運行散發代理程式,您會看到快照已批量複製到訂閱者:
排查合併代理程式的錯誤
合併代理程式可能需要很長時間才能複製變更。 若要判斷合併復寫同步處理過程中哪一個步驟需要最多時間,請使用 追蹤旗號 101 搭配合併代理程式記錄。 若要這樣做,請針對合併代理程式參數使用下列參數,然後重新啟動代理程式:
-T 101
-output
-outputverboselevel
注意
如果您必須將統計數據寫入 <distribution-server>..msmerge_history
表格,請使用追蹤標誌 102。
合併式複寫同步處理完成後合併代理程式的範例輸出如下所示:
**************************************************************
CONNECTION TIMES --> time took to establish the connection to the servers. Publisher (all connections) 156 msec Subscriber (all connections) 32 msec Distributor 93 msec
**************************************************************
UPLOAD COUNTERS --> upload phase (changes from the Sub to the Pub) stats MakeGeneration Time = 343 msec. InsertGenHistory Time = 31 msec. UpdateGenHistory Time = 0 msec. ProxiedMetadata Time = 0 msec.
**************************************************************
DOWNLOAD COUNTERS --> download phase (changes from the Pub to the Sub) stats MakeGeneration Time = 219 msec. InsertGenHistory Time = 0 msec. UpdateGenHistory Time = 0 msec.
**************************************************************
RETENTION-BASED CLEANUP STATISTICS --> sp_mergemetadataretentioncleanup proc stats Publisher: Cleanup Time 281 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_tombstone rows cleaned up 0 Subscriber: Cleanup Time 187 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_rowtrack rows cleaned up 0 MSmerge_tombstone rows cleaned up 0
**************************************************************
RETRY STATISTICS Retry Time (Upload) 0 msec. Retry Time (Download) 0 msec. Total changes retried 0 Number of Iterations through rows needing retry 0 Total number of changes that failed despite retry 0
**************************************************************
PROXY METADATA QUEUE COUNTERS Queue Full: Number of Waits: 0, Total Wait Time: 0 msec
**************************************************************
Distributor-side History Logging Time = 219 msec. Number of Distributor-side History Messages Logged = 11 Subscriber-side History Logging Time = 295 msec. Number of Subscriber-side History Messages Logged = 11
**************************************************************
2013-05-28 17:24:11.820 OLE DB Subscriber '<SQL Server name>\sql2008r2': DBCC SQLPERF (NETSTATS) 2013-05-28 17:24:11.822 OLE DB Publisher '<SQL Server name>\SQL2008R2': DBCC SQLPERF (NETSTATS) 2013-05-28 17:24:11.824 OLE DB Distributor '<SQL Server name>\SQL2008R2': DBCC SQLPERF (NETSTATS) NETWORK STATISTICS Server Reads Writes Bytes Read Bytes Written Publisher 74 74 19112 37526 Subscriber 73 73 19032 36931 Distributor 75 75 19192 38121
**************************************************************
NETWORK STATUS Network Connection: The computer has one or more LAN cards that are active. Network link speed: Destination Incoming Outgoing Publisher Unreachable Unreachable Subscriber Unreachable Unreachable Distributor Unreachable Unreachable
**************************************************************
在任何代理程式上啟用詳細資訊記錄
您可以使用詳細資訊記錄,來查看有關複寫拓撲中任何代理程式所發生錯誤的更多詳細資訊。 每個代理程式的步驟都相同。 只要確定您在 [作業活動監視器] 中選取正確的代理程式。
注意
根據代理程式是提取或發送訂閱而定,它可以位在發行者或訂閱者上。 如果您在調查的伺服器上無法使用代理程式,請檢查另一部伺服器。
決定您要儲存詳細資訊記錄的位置,並確保此資料夾已存在。 這個範例會使用 c:\temp。
展開 [物件總管] 的 [SQL Server Agent] 節點,然後開啟 [作業活動監視器]。
依據 [分類] 排序,並找出您感興趣的代理程式。 這個範例會使用記錄讀取器代理程式。 以滑鼠右鍵按一下您感興趣的代理程式 >[屬性]。
選取 [步驟] 頁面,然後反白顯示 [執行代理程式] 步驟。 選取 [編輯]。
在 [命令] 方塊中,開始新的一行,輸入下列文字,然後選取 [確定]:
-Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
您可以根據自己的喜好修改位置和詳細資訊層級。
新增詳細資訊輸出參數時,下列問題可能會導致代理程序失敗,或遺失 outfile 檔案:
有一個格式問題,其中虛線變成連字號。
該位置不存在於磁碟上,或執行代理程式的帳戶缺少寫入指定位置的權限。
最後一個參數與
-Output
參數之間遺漏一個空格。不同的代理程式支援不同層級的詳細資訊。 如果您啟用詳細資訊記錄,但代理程式無法啟動,請嘗試將指定的詳細資訊層級減少 1。
以滑鼠右鍵按一下代理程式 > [從下列步驟停止作業],重新啟動記錄讀取器代理程式。 選取工具列中的 [重新整理] 圖示以重新整理。 以滑鼠右鍵按一下代理程式 > [從下列步驟啟動作業]。
檢閱磁碟上的輸出。
若要停用詳細資訊記錄,請遵循相同的上一個步驟來移除您之前新增的一整行
-Output
。
相關內容
取得協助
- 對 SQL 的想法:有任何協助改善 SQL Server 的建議嗎?
Microsoft Q&A(SQL Server) - DBA Stack Exchange (標籤 sql-server):詢問 SQL Server 問題
- Stack Overflow (標籤 sql-server):SQL 開發問題的回答
- Microsoft SQL Server 授權條款及資訊
- 適用於商務使用者的支援選項
- 其他 SQL Server 說明與意見反應
參與編輯 SQL 文件
您知道您可以自行編輯 SQL 內容嗎? 這樣做不僅可以協助改善文件,也能名列該頁面的參與者。
如需詳細資訊,請參閱 編輯 Microsoft Learn 文件。