本文說明疑難解答步驟,可協助解決 SQL Server 中的復寫記錄讀取器代理程式失敗之後所發生的問題。
原始產品版本:SQL Server
原始 KB 編號: 2892635
徵兆
當Microsoft SQL Server 中的復寫記錄讀取器代理程序失敗時,您會收到類似 SQL Server 記錄檔中的錯誤訊息:
<時間戳> spid98 Replication-Replication事務歷史記錄讀取器子系統:代理程式logreadername 失敗。 進程無法在 『<Server name>』 上執行 『sp_replcmds』。 <時間戳> spid258錯誤:14151,嚴重性:18,狀態:1。 <時間戳> spid258 Replication-Replication事務歷史記錄讀取器子系統:代理程式logreadername 失敗。 進程無法在 『<Server name>』 上執行 『sp_replcmds』。
此外,您可能會收到一或多個類似下列的錯誤訊息:
-
18805/18836 LogReader 無法建構複寫的命令 <時間戳> 狀態:0,程序代碼:20011,文字:'進程無法在 '<Server name>' 上執行 'sp_replcmds'。 <時間戳> 此進程無法在 '<Server name>' 上執行 'sp_replcmds'。 <時間戳> 狀態:0,代碼:18836,文字:'UpdateText 的文字資訊區塊無效:m_pHead-GetType>() : 1, m_TextDataType: 0, m_TextOpType : 3, ti:{RowsetId 7746362867712, {TextTimeStamp 480235880448, {RowId {PageId 2680944, FileId 1}, SlotId 21 }} , coloffset -1, textInfoFlags 0x4, textSize 177, offset 177, oldSize 0, newSize 0}.'。 <時間戳> 狀態:0,代碼:18805,文字:'Logreader 無法從 LSN {00150725:00014316:009d}建構復寫的命令。'。 <時間戳>狀態:0,代碼:22037,文字:'進程無法在 'Server name<' 上執行 '>sp_replcmds'。
-
18805/18836 LogReader 無法建構複寫的命令 <時間戳> 狀態:0,程序代碼:20011,文字:'進程無法在 '<Server name>' 上執行 'sp_replcmds'。 <時間戳> 此進程無法在 '<Server name>' 上執行 'sp_replcmds'。 <時間戳> Repl 代理程序狀態:6 <時間戳> 狀態:0,代碼:18805,文字:'記錄讀取器代理程式無法從記錄序號 (LSN) {00033a89:0000969c:000a} 建構複寫的命令。 備份發行集資料庫並連絡客戶支援服務。』。 <時間戳>狀態:0,代碼:22037,文字:'進程無法在 'Server name<' 上執行 '>sp_replcmds'。
-
LogReader 逾時 代理程式正在執行。 使用複寫監視器檢視此代理程式會話的詳細數據。 Repl Agent Status: 3 Publisher: {call sp_repldone (0x0000172a0002ac900001, 0x0000172a0002ac900001, 0, 0)} Publisher: {call sp_replcmds (500, 0)} 狀態: 2, code: 0, text: '進程無法在 'Publisher name<' 上執行 '>sp_replcmds'。' 。 進程無法在 '<Publisher name>' 上執行 'sp_replcmds'。 Repl 代理程序狀態:5 狀態:2,代碼:0,文字:『逾時已過期』。 從發行者 『<Publisher name>』 中斷連線,代理程式失敗,並顯示「重試」狀態。 請稍後嘗試執行代理程式。
-
判斷提示<時間戳>狀態:0,代碼:20011,文字:'進程無法在 'Server name<' 上執行 '>sp_replcmds'。 <時間戳> 此進程無法在 '<Server name>' 上執行 'sp_replcmds'。 <時間戳> 狀態:0,代碼:18773,文字:'在命令建構期間找不到 “ClientPreferences” 數據行的文字信息記錄。' <時間戳> 狀態:0,代碼:3624,文字:『系統判斷提示檢查失敗。 請檢查 SQL Server 錯誤記錄檔,以取得詳細資料。 一般而言,判斷提示失敗是軟體錯誤或資料損毀所致。 若要檢查資料庫是否已損毀,請考慮執行 DBCC CHECKDB。 如果您在安裝過程中同意傳送傾印給 Microsoft,就會有一個迷你傾印傳送給 Microsoft。 之後 Microsoft 可能會以最新的 Service Pack 或技術支援 QFE 的形式提供更新。 '. <時間戳>狀態:0,代碼:22037,文字:'進程無法在 'Server name<' 上執行 '>sp_replcmds'。
疑難排解
錯誤訊息 1:「18805/18836 LogReader 無法建構複寫命令」
您可以從此訊息中判斷物件和在記錄中建立交易的變更。 若要這樣做,請使用下列資訊:
程序代碼 18836 會提供您可以在其中找到對象的頁面標識碼。
注意
您可以使用 如何使用 DBCC PAGE 來檢視資料庫頁面的內容。
程式代碼 18805 提供您可以提供 物件的記錄序號 (LSN):
dbcc Log(master, 3, 'lsn', '0x00000208:000000a0:0004', 'numrecs', 1)
錯誤訊息 2:「18805/18836 LogReader 無法建構複寫命令」
錯誤訊息 1 和錯誤訊息 2 之間的主要差異在於錯誤 2 不包含狀態消息,而且不會指向 「textinfo」 資料行。 SQL Server 2008 Service Pack 3 (SP3) 的累積更新套件 1 Microsoft 1 已修正此問題。
此問題只會發生在具有二進位大型物件 (BLOB) 資料類型數據行且發行項不使用參數化命令來復寫的數據表上。 若要解決此問題,請依照下列步驟執行︰
判斷發行項是否使用參數化命令。 若要這樣做,請執行下列查詢:
SELECT STATUS, NAME FROM sysarticles WHERE NAME =''將狀態值轉換成二進位格式。 例如,對於狀態值為 41,二進位值會101001,而右側的第五位也稱為狀態位為 ON。 如果狀態位為 1,表示它已經設定。 如果狀態位為 0,則不會設定。 因此,您必須執行
sp_changearticle來設定參數化命令。 若要變更狀態位,請執行下列命令:sp_changearticle 'ConstituentRequest_ETL_Trans', 'CRProfile', 'status', 'parameters'
錯誤訊息 3: LogReader 逾時
若要解決這個問題,請使用下列其中一個方法:
增加記錄讀取器代理程式的 QueryTimeout 參數值。
注意
根據預設,此參數的值是 1,800 秒(30 分鐘)。
將 QueryTimeout 參數的值設定為零 (0) 以停用逾時。
減少記錄讀取器代理程式的 ReadBatchSize 參數值。
如果錯誤記錄檔中的判斷提示符合這些知識庫文章中的問題,請安裝適當的修正程式。