我們爲SQL Server 2008 R2開發了一個程序集。SQL Server停止加載程序集
大會已經工作了一個星期。組件內部的託管存儲過程在整個星期內工作正常,然後停止工作。我們幾次都看到這個問題。再次運行它的方法是重新啓動SQL Server。
Msg 10314, Level 16, State 11, Line 4
An error occurred in the Microsoft .NET Framework while trying to load assembly id 65536. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error:
System.IO.FileLoadException: Could not load file or assembly 'myAssembly, Version=2.0.0.490, Culture=neutral, PublicKeyToken=5963130873dd3a75' or one of its dependencies. Exception from HRESULT: 0x80FC0E21 System.IO.FileLoadException:
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
我在網上發現了不同的文章。
This KB建議我可能從另一個SQL Server恢復數據庫,我發誓我沒有。
This blog說我可能會遇到這個,如果我在SQL Server 2005上安裝.NET 3.5,但我的是SQL Server 2008 R2,並且在發生此問題時我沒有安裝任何東西。
重點是它可以持續一段時間。它隨機停止工作。然後,如果我們重新啓動SQL Server,它將再次開始工作。我曾想過我的服務器真的耗盡內存,但現在,我只是再次看到問題。 SQL Server只使用300MB RAM,而我的服務器有16GB RAM。這聽起來不可能,因爲我內存不足。
現在,我想收集有關此問題的更多信息。我可以打開並查看任何日誌?歡迎任何有助於解決此問題的建議。
我已經運行了一些SQL查詢。
SELECT * from sys.dm_clr_properties
=============================================
directory C:\Windows\Microsoft.NET\Framework64\v2.0.50727\
version v2.0.50727
state CLR is initialized
。
SELECT * from sys.dm_clr_appdomains
======================================================
0x0000000087160240 3 mydatabase.dbo[runtime].2 2011-08-12 08:44:08.940 10 1 E_APPDOMAIN_SHARED 1 1
。
SELECT * from sys.dm_clr_tasks
======================================================
0x000000008185A080 0x00000000818562C8 0x0000000000000000 E_TASK_ATTACHED_TO_CLR E_ABORT_NONE E_TYPE_ADUNLOAD 0 0
0x00000000818CE080 0x00000000818CA2C8 0x0000000000000000 E_TASK_ATTACHED_TO_CLR E_ABORT_NONE E_TYPE_FINALIZER 0 0
0x0000000081AD4C30 0x000000000400D048 0x0000000000000000 E_TASK_ATTACHED_TO_CLR E_ABORT_NONE E_TYPE_USER 0 0
。
SELECT * from sys.dm_clr_loaded_assemblies
<returns nothing>
* UPDATE *
在我的SQL Server中,我創建了四個數據庫。他們每個人都有相同的大會附加到它。現在,SQL Server拒絕加載程序集並給了我上述錯誤。
SELECT * from sys.dm_clr_appdomains
顯示我那時只有一個appdomain加載,並且SELECT * from sys.dm_clr_loaded_assemblies
顯示我沒有加載任何程序集。
然後,我在其他三個數據庫上運行相同的存儲過程。它工作併成功加載了程序集併成功運行了存儲過程。執行存儲的進程後。 SELECT * from sys.dm_clr_appdomains
現在顯示我只有四個appdomain加載和SELECT * from sys.dm_clr_loaded_assemblies
顯示我現在有三個程序集加載。
這是有道理的。現在,我希望如果我再次在原始數據庫中運行存儲過程,它應該能夠像原來那樣加載程序集。你猜怎麼了。不,它沒有。它仍然給我同樣的錯誤。它看起來像這個數據庫完全卡住了。解決它的唯一方法是重新啓動SQL Server。我希望系統表中的某個位置有一個標誌/鎖定,以防止這種情況發生。我找不到它。任何想法是受歡迎的。
現在,我的SQL Server處於需要我重新啓動以使其再次工作的狀態。
*更新(2011年8月31日)*
這聽起來像它涉及到數據庫的數據庫所有者。這很複雜。我們有兩個站點和兩個AD森林。 SQL Server計算機已加入到林A中,但數據庫所有者來自林B.林A和林B之間的連接並不穩定,因爲它們位於通過WAN物理連接的兩個不同站點中。
一旦我將數據庫所有者更改爲SQL登錄(非Windows帳戶),我的存儲過程已經運行了幾個星期,至今沒有中斷。
如果有人能解釋它,我會接受答案。
嘗試運行perfmon並查看硬件是否無法處理負載。 – 2011-08-12 03:06:00
「它隨機停止工作。」 - 更可能是您的程序集中發生錯誤(例如數據轉換錯誤) –
@ Surfer513:這不太可能是原因。 –