修正︰ 記憶體不足的錯誤訊息時收到 SQL Server 2005 中,或在 SQL Server 2008年中的 Web 同步處理中使用合併式複寫

錯誤 #: 119532 (內容維護)
VSTS 錯誤編號︰ 344705
VSTS 錯誤編號︰ 365477
VSTS 錯誤編號︰ 365476

Microsoft 分散成一個可下載的檔案的 Microsoft SQL Server 2005年的修正程式。因為修正程式是累積,每個新版本包含的所有 hotfix,而且先前的 SQL Server 2005 隨附的所有安全性修正都修正版本。Microsoft 分散成一個可下載的檔案的 Microsoft SQL Server 2008年的修正程式。因為修正程式是累積,每個新版本包含的所有 hotfix,而且所有安全性修正先前的 SQL Server 2008年隨附都修正版本。

狀況

您使用 SQL Server 2005 合併複寫或 SQL Server 2008年合併複寫使用 Web 同步處理基礎的 「 訂閱者 」。記憶體遺漏,就會發生重複的同步處理之後,您可能會收到 「 記憶體不足 」 錯誤在一段時間之後。當主機處理序不會重新啟動一段時間,例如當搭配-連續的參數使用 「 合併代理程式 」 (Replmerg.exe) 時,這就明顯或何時會套用至 「 代理程式 」 的代理程式設定檔中指定了連續的參數。RMO 應用程式或服務您開發應用程式執行數天,而不關閉時,在迴圈中執行同步處理,也可以影響這個問題。

原因

在每次同步處理時,會遺漏數個內部的物件。

解決方案

SQL Server 2005 Service Pack 3


SQL Server 2005 的 Service Pack 3 的第一次這個問題的修正程式釋放累積的更新 6] 中。如需有關此累積更新套件的詳細資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件︰

974648累計更新套件 6,SQL Server 2005 的 Service Pack 3注意因為組建是累計的每個新的修正程式版本會包含所有的 hotfix,和先前的 SQL Server 2005 隨附的所有安全性修正都修正版本。Microsoft 建議您考慮將套用最新的修正程式版本,其中包含此 hotfix。如需詳細資訊,按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

960598的 SQL Server 2005 建立的 SQL Server 2005 的 Service Pack 3 發行之後所發行的。
Microsoft SQL Server 2005年的 hotfix 會建立特定的 SQL Server service pack。您必須將 SQL Server 2005 的 Service Pack 3 hotfix 套用至的 SQL Server 2005 的 Service Pack 3 安裝。根據預設,SQL Server service pack 中所提供的任何 hotfix 併入下一步的 SQL Server service pack。

SQL Server 2008年的發行版本

重要如果您執行 SQL Server 2008年的發行版本,您必須安裝此修正程式。

這個問題的修正程式首次發表中累積的更新 8。如需有關如何取得此累積更新套件,SQL Server 2008 的詳細資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件︰

975976累計 SQL Server 2008 中更新套件 8注意因為組建是累計的每個新的修正程式版本會包含所有的 hotfix,並隨附於先前的 SQL Server 2008年所有安全性修正程式會都修正版本。我們建議您考慮將套用最新的修正程式版本,其中包含此 hotfix。如需詳細資訊,按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

SQL Server 2008年建置 SQL Server 2008年發行之後所發行的956909

SQL Server 2008 Service Pack 1

重要如果您執行 SQL Server 2008 Service Pack 1,您必須安裝此修正程式。


SQL Server 2008 Service Pack 1 的第一次這個問題的修正程式釋放累積的更新 5] 中。如需有關此累積更新套件的詳細資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件︰

975977累計更新套件 5,SQL Server 2008 Service Pack 1注意因為組建是累計的每個新的修正程式版本會包含所有的 hotfix,並隨附於先前的 SQL Server 2008年所有安全性修正程式會都修正版本。Microsoft 建議您考慮將套用最新的修正程式版本,其中包含此 hotfix。如需詳細資訊,按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

SQL Server 2008年建置 SQL Server 2008 Service Pack 1 發行之後所發行的970365
Microsoft SQL Server 2008 hotfix 會建立特定的 SQL Server service pack。您必須將 SQL Server 2008 Service Pack 1 hotfix 套用至的 SQL Server 2008 Service Pack 1 安裝。根據預設,SQL Server service pack 中所提供的任何 hotfix 併入下一步的 SQL Server service pack。

狀態

Microsoft 已確認這是<套用>一節所列出的 Microsoft 產品的問題。

因應措施

若要解決這個問題,請使用下列方法之一︰

方法 1

如果您使用 「 合併代理程式 」 以連續模式,定期,停止 「 合併代理程式處理序 」,然後重新啟動它。

例如,您在五天後,收到 「 記憶體不足 」 錯誤,而您合併代理程式 」 排程為作業。然後,您可以排定新的 SQL Server 代理程式工作,以呼叫sp_stop_job ,後面接著指定您合併代理程式作業名稱,將循環受影響的程序每隔五天的sp_start_job 。當您停止合併代理程式 」 (Replmerg.exe) 的程序時,就會釋放處理序的記憶體空間內的任何遺漏的記憶體。

如需有關使用-v 連續參數上 「 合併代理程式 」,請參閱下列 Microsoft 開發人員網路 (MSDN) 網站︰

http://msdn.microsoft.com/en-us/library/ms147839.aspx

sp_stop_job http://msdn.microsoft.com/en-us/library/ms182793(SQL.90).aspx

sp_start_job http://msdn.microsoft.com/en-us/library/ms186757(SQL.90).aspx

方法 2

如果您使用 「 合併代理程式 」,從工作時,您無法使用額外的步驟,而不依賴於連續的參數來設定內工作的手動重複循環邏輯。而不是一個合併代理程式處理內部迴圈不限次數持續為作業步驟重複一次每分鐘例如定期排程 「 合併代理程式 」。處理程序將會結束之間重試次數,這會釋放任何遺漏的記憶體。
編輯工作,以便在之間暫停的迴圈中重複的步驟重複 「 合併代理程式。

  1. [3] 的步驟之後"偵測非記錄式代理程式關機]"新增新的 [4] 步驟名為 [無限重複重試]。將類型設為 TSQL 和命令,以"waitfor 延遲 ' 0: 00:05' 」,此 TSQL 延遲將提供 5 的第二個暫停您可以設定為一種 「 合併代理程式 」 將暫停執行之間的簡略,並不會經常執行的輪詢間隔。在 [進階] 索引標籤上指定 [上成功執行] 為 「 移至步驟 [2] 的執行代理程式 」 和 「 失敗動作 」 為"移至步驟 [2] 執行代理程式 」。

  2. 編輯 [2] 的步驟執行代理程式以確保迴圈 [4] 的步驟為止。步驟 [2] 的 [進階] 索引標籤上設定上成功時] 動作,"請跳至步驟: [4] 的重試無限迴圈 」,並設定 [到下一步 」 的 On 失敗動作

  3. 編輯 [3] 的步驟 「 偵測非記錄式代理程式關機 」 以確定在 [4] 步驟中的迴圈為止。在步驟 [3] [進階] 索引標籤中,設定在成功時] 動作,「 移到下一步 」。您也可以決定是否要讓 [3] 的步驟失敗時的處理設定為 「 移到下一步 」 或 「 結束作業回報失敗 」。如果它被設定為結束,它會顯示複寫監視器] 和 [工作監視器中的工作失敗。如果它被設定到第四個迴圈步驟失敗時,可能會無限期,重新執行 「 合併代理程式 」,並無限期地記錄錯誤。

方法 3

同樣地如果您使用 RMO 應用程式呼叫MergeSynchronizationAgent.Synchronize()方法的同步處理在迴圈中的 「 訂閱者 」 資料庫時,停止並重新啟動處理序定期釋放任何由於發生此問題遺漏的記憶體。
如需有關這個物件和方法的詳細資訊,請參閱下列 Microsoft 開發人員網路 (MSDN) 網站︰ http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.replication.mergesynchronizationagent.synchronize(SQL.90).aspx

更多的資訊

呼叫堆疊資訊

記憶體遺漏 1


預設堆積中,就會發生此記憶體流失。預設堆積會因為小型的 32 位元組字串遺漏項目變成過於分散。0:000> !heapstats 0 -sHeap=0x00140000 BusyCount=1380235 BusyBytes=55115099
Found allocations in range of 0->151496 bytes.
Largest count is 850531 for memory blocks of size 32
Largest bytes used is 27216992 bytes for memory blocks of size 32

Size Count Total Percent Of Maximum Allocation Size In Range
------ ------ -------- ----------------------------------------------------------------------------------------------------
32 850531 27216992 ****************************************************************************************************
48 306892 14730816 ******************************************************
64 100583 6437312 ***********************
16 93995 1503920 *****
80 11068 885440 ***
151496 3 454488 *
256 1386 354816 *
160 1866 298560 *
904 131 118424

在這個範例中,32 位元組配置會加入為 27 MB 認可。不過,預設堆積會有大型的保留項目一部份的原因是這些遺漏的物件並分散在堆積和片段可用區塊之間的空間。



大部分的這些 32 位元組配置是來自於程式碼中的 SysAllocString 呼叫其中沒有 SysFreeString] 或 [刪除的呼叫。0:000> kLChildEBP RetAddr
0012b878 4c0a2f7b xmlsub!CXMLSubscriber::ReadAgentProfileParameter+0x1dd
0012b8b4 4e67a7e4 msgprox!CProxyMessageDatasource::ReadAgentProfileParameter+0x5b
0012bc18 4e6a65fe replrec!CDatabaseReconciler::UpdateAgentProfileCache+0x384
0012bda8 4e6a9281 replrec!CDatabaseReconciler::MoveChangesToDest+0x219e
0012cff8 4e6aae46 replrec!CDatabaseReconciler::CoreReconcile+0x1b01
0012d9ec 4e6ab388 replrec!CDatabaseReconciler::MessageReconcile+0x1206
0012ed90 4d1b651d replrec!CDatabaseReconciler::Reconcile+0x398
0012edd0 4dbf6331 sqlmergx!CSQLMerge::Run+0x18d
0012ede0 4de729b8 Microsoft_SqlServer_Replication!SQLMERGXLib::ISQLMerge::Run+0x11
0012ee70 4de70ed1 Microsoft_SqlServer_Replication_ni!Microsoft.SqlServer.Replication.MergeSynchronizationAgent.Run()+0x14c
0012eef8 00d2862b Microsoft_SqlServer_Replication_ni!Microsoft.SqlServer.Replication.MergeSynchronizationAgent.Synchronize()+0x71

C 執行階段中發生第二個遺漏堆積與複寫相關的 COM 物件。可以看到此遺漏掃描所有堆積的 replrov.dll 程式庫使用 MDACExts 延伸模組內的物件所指向的 vftable ! tablescan。0:000> !tablescan 'x replprov!*vftable*' 0Count Total Bytes Size Address Function
-------- ----------- ------ ---------- ----------------------------------------------------------------------------------------------------
1806 43344 24 0x4c9d1868 replprov!CReplicationProvider::`vftable'
1719 13752 8 0x4c9d1858 replprov!CSupportErrorInfo::`vftable'
1806 2066064 1144 0x4c9d1ba0 replprov!CMergePublisher::`vftable'
1806 7238448 4008 0x4c9d6250 replprov!CMergeDatasource::`vftable'
1806 7238448 4008 0x4c9d61a8 replprov!CMergeDatasource::`vftable'

如果您不需要掃描資料表,您可以檢視此遺漏的大小有註明 (24,8,1144、 4008) 為基礎。若要這麼做,請對堆積中執行下列類型的命令︰0:000> !heapstats 0x003e0000 -s
Heap=0x003e0000 BusyCount=9363 BusyBytes=12555368
Found allocations in range of 4->8192 bytes.
Largest count is 1897 for memory blocks of size 8
Largest bytes used is 7238448 bytes for memory blocks of size 4008

Size Count Total Percent Of Maximum Allocation Size In Range
----- ----- ------- ----------------------------------------------------------------------------------------------------
4008 1806 7238448 ****************************************************************************************************
3128 900 2815200 **************************************
1144 1806 2066064 ****************************
etc...


父物件是 CReplicationProvider。三個子系物件具有父物件的返回指標。因此,這些物件會有彼此的參考計數。若要摧毀這些物件,所有的參考計數必須減少為 0。由於其中一個參考計數不是遞減的正確程式碼中,四個物件沒有被終結的物件會具現化每次。



注意事項

如果您使用 [追蹤程式的遺漏,配置 3 / 4 的遺漏物件的方法是"replprov !CReplicationProvider::InitInstance"。



在新的 CReplicationProvider 本身上呼叫會是 4 的物件。



記憶體遺漏 2


此版本所修正的其他記憶體遺漏使用堆積區塊大小 32 個位元組,並從 48 個位元組,並包含從複寫的發行項的資料行名稱。以下是此堆疊的一部份︰xmlsub!CXMLSubscriberCommon::ReadNodexmlsub!CXMLSubscriberCommon::FindNamedNodeInList

參考

如需有關如何使用-連續的參數在 「 合併代理程式 」,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站︰

http://msdn.microsoft.com/en-us/library/ms147839.aspx
如需有關sp_stop_job預存程序的詳細資訊,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站︰

http://http://msdn.microsoft.com/en-us/library/ms182793(SQL.90).aspx
如需有關sp_start_job預存程序的詳細資訊,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站︰

http://msdn.microsoft.com/en-us/library/ms186757(SQL.90).aspx
如需有關如何取得 SQL Server 2005 的 Service Pack 3,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文︰

如何取得最新的 service pack,SQL Server 2005 的913089

如需有關 SQL Server 2005 Service Pack 3 (SP3) 中的新功能,以及有關 SQL Server 2005 SP3 中改良的詳細資訊,請造訪下列 Microsoft 網站︰

http://go.microsoft.com/fwlink/?LinkId=131442SQL Server 更新的命名結構描述的詳細資訊,如按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件︰

822499新命名的結構描述的 Microsoft SQL Server 軟體更新套件

如需有關軟體更新術語的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

編號 824684用來描述 Microsoft 軟體更新標準術語的說明

作者︰ jasonh
作者︰ v jayc
技術編審︰ jasonh;
編輯器︰ v stepce

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

感謝您的意見反應! 我們將協助您與我們的其中一個 Office 支援專員連絡以深入了解您的意見。

×