修正: 錯誤訊息之後 SQL Server 已經執行了一些時間在 Windows Server 2003 上,或在 Windows 2000 上,: 「 無法載入 FileName.dll"和"嘗試載入任何類型的 dll 可能會在 SQL Server 處理序內失敗"

適用於: SQL Server 2008 R2 StandardSQL Server 2008 R2 WorkgroupSQL Server 2008 R2 Developer

徵狀


當您在 Windows Server 2003 電腦上或在 Windows 2000 為基礎的電腦上執行 Microsoft SQL Server 時,您可能會收到錯誤訊息包含下列的錯誤訊息:
  • 無法載入.dll檔名
  • 嘗試載入任何類型的 dll 可能在 SQL Server 處理序內會失敗,且有指向 LoadLibrary 失敗的錯誤。
SQL Server 已經執行了一些時間之後,通常會發生這個問題。您收到完整的錯誤訊息類似下列:
例外狀況型別: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseExceptionMessage: 在資料庫上的讀取失敗。原因: 無法載入 Msxmlsql.dll.Data: System.Collections.ListDictionaryI,4092,NULL,NULL,2007-04-13 09:44:11.640,DB\SQLServer5,警告,2007年-04-13 09:44:13.153 啟動程序 [dbo]。[sp_sysmail_activate] 佇列 msdb.dbo.ExternalMailQueue 上執行輸出下列: '服務佇列"ExternalMailQueue"is 目前' 嘗試使用 XML 相關 TSQL 的活動就會失敗。 停。訊息 6610,層級 16,狀態 1、 程序 sp_xml_preparedocument,行 1Failed,載入 Msxmlsql.dll.Msg 6607,層次 16,狀態 3,Proceduresp_xml_removedocument,行 1 sp_xml_removedocument: 提供的參數號碼 1 不正確的值。嘗試載入任何類型的 dll 可能在 SQL Server 處理序內會失敗,且有指向 LoadLibrary 失敗的錯誤。嘗試使用延伸預存程序會導致訊息 0、 層級 16,狀態 0、 程序 xp_ss_backup、 行 1Cannot 載入 DLL C:\Program 必要 SQL Server\MSSQL\Binn\SQLsafe_ExtendedStoredProc.dll,或其中一個 Dll 它的參考。原因: 1114 (對動態連結程式庫 (DLL) 初始化常式失敗。)。錯誤: 18210,高的嚴重性等級: 16,狀態: 1.BackupVirtualDeviceSet::Initialize: ' d4630f27-03a1-47ae-b7a7-4813a6809908' 的備份裝置上的 CoCreateInstance 失敗。作業系統錯誤 0x8007045a (對動態連結程式庫 (DLL) 初始化常式失敗。)。錯誤: 6512,高的嚴重性等級: 16,狀態: 無法初始化通用語言執行階段 (CLR) v2.0.50727,HRESULT 0x80004005 與 27.。您必須重新啟動 SQL Server 使用 CLR 整合功能。

原因


之所以發生這個問題,是因為沒有執行緒區域儲存區 (TLS) 插槽適用於 SQL Server 處理序 (Sqlservr.exe)。這是 SQL Server 卸載 DLL、 DLL 使用TlsFree函式中的問題,所以可能不會釋放 TLS 介面槽的 Windows 2000.When 和 Windows Server 2003 中的問題。如果 SQL Server 會經常載入不同的 Dll,並再卸載這些 Dll,這些 Dll 會用盡所有可用的 TLS 介面槽。最後,SQL Server 不會再載入取得 TLS 插槽的 DLL。

解決方案


附註此解決方案只為 Windows Server 2003。如果您使用的 Windows 2000,請依照 < 其他可行方案=""> 一節的步驟。"

Windows Server 2003 的 Hotfix 資訊

支援的 hotfix 是可以從 Microsoft 取得的。不過,此 hotfix 被用來修正本文所述的問題。此 hotfix 只適用於發生此特定問題的系統上。此 hotfix 可能會接受其他測試。因此,如果此問題不會嚴重影響,我們建議您等候下一版包含此 hotfix 的軟體更新。如果可供下載的 hotfix,但沒有 「 下載 Hotfix 」 區段中,在此知識庫文件的頂端。如果這個區段不會出現,請連絡 Microsoft 客戶服務及支援 」 取得 hotfix。附註如果發生其他問題,或如果需要進行疑難排解,您可能必須建立個別的服務要求。收取支援費用會套用到其他支援問題,以及此特定 hotfix 無法解決的問題。如 Microsoft 客戶服務及支援的電話號碼或建立個別的服務要求的完整清單,請造訪下列 Microsoft 網站:附註「 下載 Hotfix 」 表單會顯示 hotfix 是可用的語言。如果看不到您的語言,它是因為 hotfix 未提供該語言的支援。
先決條件
您必須在 Windows Server 2003 Service Pack 2 伺服器上安裝。如需詳細資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文:
如何取得最新的 service pack,Windows Server 2003 的889100
重新啟動資訊
套用此 hotfix 之後,您必須重新啟動電腦。
Hotfix 取代資訊
此 hotfix 不會取代任何其他 hotfix。
檔案資訊
檔案屬性 (或較新的檔案屬性),此 hotfix 的英文的版本具有下表中所列。其日期和時間,這些檔案會列出在國際標準時間 (UTC)。當您檢視檔案資訊時,會將它轉換為本地時間。若要想知道 UTC 及當地時間的時差,使用 [控制台] 中的日期和時間項目中的 [時區] 索引標籤。Service Pack 2,以 x86 為基礎的版本的 Windows Server 2003
檔案名稱檔案版本檔案大小日期時間平台
Ntkrpamp.exe5.2.3790.41772,348,03229-Oct-200719:01x86
Service Pack 2,x64 型版本的 Windows Server 2003
檔案名稱檔案版本檔案大小日期時間平台
Hal.dll5.2.3790.4225280,06428-Jan-200810:42x64
Ntkrnlmp.exe5.2.3790.42254,603,90428-Jan-200810:42x64
Ntoskrnl.exe5.2.3790.42254,533,76028-Jan-200810:42x64
Service Pack 2,以 IA64 為基礎的版本的 Windows Server 2003
檔案名稱檔案版本檔案大小日期時間平台
Ntdll.dll5.2.3790.42251,636,86428-Jan-200810:40IA-64
Ntkrnlmp.exe5.2.3790.42256,568,96028-Jan-200810:40IA-64

因應措施


您可以使用下列方法之一來解決這個問題。 我們建議您使用方法 1,因為延伸預存程序功能可能會移除在未來版本的 SQL Server 中。

方法 1

  1. 您可以使用sp_OACreate預存程序,判斷 SQL Server 載入的 SQL Server 處理序的 Dll。若要這麼做,請依照下列步驟執行:
    1. 開啟 SQL 程式碼剖析工具,並再連接到 SQL Server 的執行個體。
    2. 在 [追蹤屬性] 對話方塊中,指定追蹤的名稱、 指定的 SQL 程式碼剖析工具會追蹤的儲存位置的位置,然後按一下執行
    3. 您可以執行 SQL 程式碼剖析工具段時間後,分析找不到sp_OACreate預存程序的項目追蹤。
    4. 請注意sp_OACreate預存程序的每個出現的第一個參數。附註第一個參數表示的程式設計識別項 (ProgID) 的 OLE 物件或 OLE 物件的類別識別項 (CLSID)。
    5. 判斷包含此 OLE 物件的 DLL。
    附註您可以使用 SQL 程式碼剖析工具來監視 SQL Server 的執行個體,當您啟動 SQL Server 服務。
  2. 請確定您已啟用 [ OLE 自動化程序] 選項。如需有關如何判斷是否已啟用 [ OLE 自動化程序] 選項,以及要啟用OLE 自動化程序] 選項,請造訪下列 Microsoft 開發網路 (MSDN) 網站:
  3. 在 SQL Server Management Studio 的 SQL Server 2008 R2,SQL Server 2008 中,或 SQL Server 2005 的或在 SQL 查詢分析器的 SQL Server 2000 中,執行下列陳述式。附註 例如,下列程式碼會示範如何載入 Wbemdisp.dll 檔案。
    DROP PROC sp_Load_DllGOCREATE PROC sp_Load_DllASdeclare @WmiServiceLocator int, @hr intexec @hr = sp_OACreate 'WbemScripting.SWbemLocator', @WmiServiceLocator output if @hr = 0 raiserror ( 'wbemdisp.dll loaded into sql address space by startup procedure sp_Load_Dll, Object Info: %d' , 10 , 1 , @WmiServiceLocator) --WITH LOGWHILE 1=1 WAITFOR DELAY '01:00:00'GOEXEC sp_procoption 'sp_Load_Dll' , 'startup' , 'true' GO
    陳述式會建立預存程序。陳述式也可讓 SQL Server 服務啟動時執行的預存程序。這個預存程序會執行下列作業:
    • 載入 Wbemdisp.dll 檔案。
    • 保持在記憶體中的 Wbemdisp.dll 檔案,因為並未結束陳述式。
    只要 Wbemdisp.dll 檔案是在記憶體中,其他的陳述式不會載入 Wbemdisp.dll 檔案一次。因此,SQL Server 不會 Wbemdisp.dll 檔呼叫TlsAlloc函式和TlsFree函式。附註您必須更新您在步驟 1 判定的 Dll 的載入程式碼。
  4. 加入在步驟 3 中的sp_Load_Dll預存程序的陳述式。這些陳述式會載入您在步驟 1 判定的 Dll。
  5. 重新啟動 SQL Server 服務。
  6. 請確認 SQL Server 載入記憶體中的 Wbemdisp.dll 檔案。若要這麼做,請依照下列步驟執行:
    1. 開啟 SQL Server 錯誤記錄檔。
    2. 搜尋下列訊息:
      載入到 sql 位址空間啟動程序 sp_Load_Dll 的 wbemdisp.dll
      附註此訊息表示 SQL Server 已載入 Wbemdisp.dll 檔案。
    3. 在命令提示字元中,執行下列命令:
      tasklist /m
    4. 在您取得的結果,找出 Sqlservr.exe 處理序,然後確認列出了 Wbemdisp.dll 檔案。附註如果 Wbemdisp.dll 檔案清單中,SQL Server 已載入 Wbemdisp.dll 檔案。

方法 2

  1. 您可以使用sp_OACreate預存程序,判斷 SQL Server 載入的 SQL Server 處理序的 Dll。若要這麼做,請依照下列步驟執行:
    1. 開啟 SQL 程式碼剖析工具,並再連接到 SQL Server 的執行個體。
    2. 在 [追蹤屬性] 對話方塊中,指定追蹤的名稱、 指定的 SQL 程式碼剖析工具會追蹤的儲存位置的位置,然後按一下執行
    3. 您可以執行 SQL 程式碼剖析工具段時間後,分析找不到sp_OACreate預存程序的項目追蹤。
    4. 請注意sp_OACreate預存程序的每個出現的第一個參數。附註第一個參數表示的程式設計識別項 (ProgID) 的 OLE 物件或 OLE 物件的類別識別項 (CLSID)。
    5. 判斷包含此 OLE 物件的 DLL。
    附註您可以使用 SQL Server Profiler 來監視 SQL Server 的執行個體,當您啟動 SQL Server 服務。
  2. 建立延伸預存程序。延伸預存程序包含載入您在步驟 1 判定的 Dll 函式。
  3. 加入 SQL Server 中的延伸預存程序。
  4. 在 SQL Server 使用sp_addextendedproc系統預存程序來註冊延伸預存程序中的函式。
  5. 您可以使用sp_procoption預存程序來啟用 [延伸預存程序的啟動 SQL Server 服務時自動啟動。
  6. 重新啟動 SQL Server 服務。
當 SQL Server 在延伸預存程序中執行函式時,SQL Server 會藉由呼叫 LoadLibrary API 載入 Dll。

狀態


這不是 SQL Server 中的問題。這是 Windows 2000 和 Windows Server 2003 中的問題。在 Windows Vista 中,或在 Windows Server 2008 中,則不會發生這個問題。

參考


如需有關TlsAlloc函式的詳細資訊,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站:如需有關TlsFree函式的詳細資訊,請造訪下列 MSDN 網站:如需有關sp_OACreate預存程序的詳細資訊,請造訪下列 MSDN 網站: