Мы разработали сборку для SQL Server 2008 R2.
Сборка работает уже неделю. Управляемая хранимая процедура внутри сборки работала нормально в течение всей недели, а затем перестала работать. Мы видели эту проблему пару раз. Способ заставить его работать снова - перезапустить 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)
Я нашел разные статьи в Интернете.
Этот KB предположил, что я мог бы восстановить базу данных с другого SQL Server, к которому я клянусь, что я этого не сделал.
Этот блог сказал, что я могу столкнуться с этим, если я установил .NET 3.5 на SQL Server 2005, но мой был SQL Server 2008 R2, и я ничего не установил, когда это проблема возникает.
Главное, что он может продолжать действовать в течение определенного периода времени. Он просто перестает работать случайным образом. Затем, если мы перезапустим SQL Server, он снова начнет работать. Я думал, что у моего сервера действительно закончилась нехватка памяти, но теперь я снова вижу проблему. SQL Server использует только ОЗУ 300 МБ, а на моем сервере - 16 ГБ. Это кажется невозможным, потому что у меня заканчивается память.
Теперь я хочу получить дополнительную информацию по этой проблеме. Любой журнал, на который я могу включить и посмотреть? Любое предложение, помогающее устранить эту проблему, приветствуется.
Я выполнил некоторые 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>
* ОБНОВЛЕНИЕ *
На моем SQL Server я создал четыре базы данных. Каждый из них с одной и той же сборкой прикреплен к ней. Теперь SQL Server отказался загружать сборку и дал мне вышеуказанную ошибку.
SELECT * from sys.dm_clr_appdomains
показывает, что в этот момент было загружено только одно приложение и SELECT * from sys.dm_clr_loaded_assemblies
показало, что загруженных сборок не было.
Затем я запустил один и тот же сохраненный процесс в трех других базах данных. Он работал и успешно загружал сборки и успешно выполнял хранимую процедуру. После выполнения хранимой процедуры. SELECT * from sys.dm_clr_appdomains
теперь показывает мне, что загружено всего четыре приложения и SELECT * from sys.dm_clr_loaded_assemblies
показал, что теперь загружаются три сборки.
Это имеет смысл. Теперь я надеюсь, что если я запустил сохраненный процесс снова в исходной базе данных, он должен как можно скорее загрузить сборку. Угадай, что. Нет, нет. Это все равно дает мне ту же ошибку. Похоже, эта база данных полностью застряла. Единственный способ исправить это - перезагрузить SQL Server. Я надеюсь, что есть флаг/замок где-нибудь в системной таблице, поддерживая это. Я не могу это найти. Любая идея приветствуется.
Теперь мой SQL Server находится в состоянии, требующем перезагрузки, чтобы он снова работал.
* ОБНОВЛЕНИЕ (8/31/2011) *
Похоже, что это связано с владельцем базы данных базы данных. Это довольно сложно. У нас есть два участка и два леса AD. Машина SQL Server соединена с лесом A, но владелец базы данных из леса B. Связь между лесом A и лесом B не является стабильной, поскольку они находятся на двух разных сайтах, физически связанных WAN.
Как только я изменю владельца базы данных на учетную запись SQL (учетная запись, отличная от Windows), моя сохраненная процедура работает на пару недель до сих пор без прерывания.
Я приму ответ, если кто-нибудь сможет это объяснить.