Le serveur SQL arrête le chargement de l'assemblage

nous avons développé un assemblage pour SQL Server 2008 R2.

l'Assemblée travaille depuis une semaine. Le proc managé stocké à l'intérieur de l'assemblage fonctionnait bien pendant toute la semaine, puis il s'arrête de fonctionner. Nous avons vu ce problème plusieurs fois. La façon de le faire fonctionner à nouveau est de redémarrer le serveur SQL.

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)

j'ai trouvé différents articles sur le web.

KO suggéré que j'aurais pu restaurer la base de données d'un autre serveur SQL, ce que je jure que je n'ai pas fait.

ce blog a dit que je pouvais courir dans cette si je l'ai installé .NET 3.5 sur SQL Server 2005, mais le mien était SQL Server 2008 R2 et je n'ai pas installer quoi que ce soit lorsque ce problème se produit.

le point principal est qu'il peut continuer pendant un certain temps. Il s'arrête juste à travailler de façon aléatoire. Ensuite, si nous redémarrons le serveur SQL, il recommencera à fonctionner. J'ai pensé que mon serveur fonctionnait vraiment. mais maintenant, je vois le problème à nouveau. SQL Server n'utilise que de la RAM de 300 Mo et mon serveur a de la RAM de 16 Go. Cela semble impossible que ce soit parce que je suis à court de mémoire.

Maintenant, je veux recueillir plus d'informations sur ce problème. Y a-t-il une bûche que je peux allumer et regarder? Toute suggestion qui pourrait aider à résoudre ce problème est la bienvenue.

j'ai exécuté quelques SQL requête.

SELECT * from sys.dm_clr_properties
=============================================
directory   C:WindowsMicrosoft.NETFramework64v2.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 *

sur mon serveur SQL, j'ai créé quatre bases de données. Chacun d'eux avec la même assemblée attaché à elle. Maintenant, SQL Server a refusé de charger l'assemblage et m'a donné l'erreur ci-dessus.

SELECT * from sys.dm_clr_appdomains me montre à ce point, il n'y avait qu'un domaine d'application chargé et SELECT * from sys.dm_clr_loaded_assemblies m'a montré qu'il n'y avait aucun assemblage chargé à tout.

puis, j'ai lancé le même proc stocké sur les trois autres bases de données. Il a fonctionné et a chargé avec succès les assemblages et a exécuté avec succès le proc stocké. Après avoir exécuté le proc stocké. SELECT * from sys.dm_clr_appdomains maintenant, montre-moi il y a seulement quatre appdomain chargé et SELECT * from sys.dm_clr_loaded_assemblies m'a montré il y a maintenant trois assemblées chargées.

cela a du sens. Maintenant, j'espère que si j'exécute le proc stocké à nouveau dans la base de données originale, il devrait obtenir l'assemblage chargé comme il l'a été. Devinez quoi. Non, pas du tout. Ça me donne toujours la même erreur. On dirait que cette base de données est complètement bloquée. La seule façon de le corriger est de redémarrer le serveur SQL. J'espère qu'il y a un drapeau/verrou quelque part dans la table du système qui tient ça. Je ne le trouve pas. Toute idée est la bienvenue.

maintenant, mon serveur SQL est dans l'état où je dois redémarrer pour que ça fonctionne à nouveau.

* mise à JOUR (8/31/2011) *

on dirait que c'est lié à la propriétaire de base de données de la base de données. C'est un peu compliqué. Nous avons deux sites et deux forêts. La machine de serveur SQL est reliée à la forêt A mais le propriétaire de la base de données est de la forêt B. La connexion entre la forêt A et la forêt B n'est pas si stable puisqu'ils sont dans deux sites différents physiquement connectés par WAN.

une fois que j'ai changé le propriétaire de la base de données en Login SQL (compte non-Windows), mon proc stocké est en cours d'exécution pour quelques semaines jusqu'à présent avec aucun interruption.

je vais accepter la réponse si quelqu'un peut l'expliquer.

36
demandé sur LittleBobbyTables 2011-08-12 06:14:11

10 réponses

les assemblages avec EXTERNAL_ACCESS sont, à travers un chemin alambiqué, relevant de L'EXECUTE AS path. Le problème apparaît lorsque le' dbo ' ne peut pas être associé à un login valide. le login de dbo est le login avec le SID le owner_sid valeur sys.databases. À moins qu'une clause D'autorisation n'ait été utilisée dans la base de données CREATE, owner_sid est le login sid du principal émettant l'instruction CREATE DATABASE. La plupart du temps, il s'agit du SID Windows de L'utilisateur connecté et l'émission de la création La BASE de données. Avec cette connaissance en main, on peut facilement imaginer les problèmes qui peuvent survenir:

  • base de données de copie: La base de données CREATE a été émise sur la machine a par un utilisateur local à A (c.-à-d. MachineA\user ou DomainA\user) puis la base de données a été copiée sur la machine B (Via sauvegarde/restauration ou copie de fichier). Le owner_sid est conservé par copie de fichier ainsi que par sauvegarde/restauration, ceci sur la machine B Le owner_sid est invalide. Tout ce qui doit être exécuté en cas de défaillance, y compris les assemblages de chargement à partir du la base de données.
  • désactivé compte. CREATE DATABASE a été publié par un utilisateur qui a quitté la société. Le compte AD est supprimé et S'exécute tout à coup comme s'il y avait une défaillance mystérieuse, y compris les assemblages de chargement.
  • déconnecté de l'ordinateur portable. Créer une base de données était un problème lorsque l'ordinateur portable était connecté dans le réseau de travail. À la maison, vous pouvez vous connecter en utilisant des justificatifs d'identité mis en cache par Windows, mais exécuter AS veut se connecter à la publicité indisponible et échoue. Les assemblages de chargement sont également défectueux. Les problèmes se résolvent mystérieusement le lendemain au travail, quand vous êtes à nouveau à portée de la publicité.
  • faible connectivité publicitaire. L'EXECUTE AS n'utilise pas les justificatifs d'identité système mis en cache et se connecte à la publicité à chaque fois. Si la connectivité de la publicité a des problèmes (timeout, errors) ces problèmes se manifestent comme des timeouts et des erreurs similaires dans EXECUTE AS, y compris les assemblages de chargement

Tous ces problèmes peuvent être diagnostiqués en lançant tout simplement: EXECUTE AS USER = 'dbo'; dans le contexte du problème db. Si elle échoue avec une erreur, alors la cause de vos problèmes de charge d'assemblage est L'exécution dans le contexte de dbo.

la solution est triviale, il suffit de forcer le owner_sid à un login valide. sa est généralement le meilleur candidat:

ALTER AUTHORIZATION ON DATABASE::[<dbanme>] TO sa;

ce qui est drôle, c'est que la base de données peut sembler parfaitement saine; les tables sont disponibles et vous pouvez exécuter selects, updates, deletes, create and drop tables etc. Seuls certains composants nécessitent EXECUTE AS:

  • la signature du code exige que le code ait une exécution en tant que clause
  • validation de l'assemblage
  • explicite EXECUTE AS en code T-SQL
  • Service Broker de message de diffusion (y compris les Notifications de Requête)

ce dernier est le coupable le plus souvent vu, car les applications s'appuient sur SqlDependency tout d'un coup semblent cesser de travailler, ou ont des problèmes aléatoires. Cet article explique comment SqlDependency dépend en fin de compte EXÉCUTER en tant QUE: La Mystérieuse Notification

40
répondu Remus Rusanu 2013-08-07 21:02:18

j'en ai fait l'expérience. il semble quand vous restaurez une base de données digne de confiance réglé à OFF. donc ma solution était de l'allumer:

ALTER DATABASE [myDB] SET TRUSTWORTHY ON
GO

et après l'avoir activée, mes déclencheurs et mes procédures stockées ont commencé à fonctionner comme avant.

23
répondu Ehsan Mirsaeedi 2012-11-05 09:51:37

juste au cas où quelqu'un tombe sur ce problème, la solution qui a fonctionné pour moi était:

ALTER AUTHORIZATION ON DATABASE::[mydb] TO sa;

suivi de

ALTER DATABASE [mydb]  SET TRUSTWORTHY ON;

je suis en train de restaurer ma PD avec le compte administrateur, et rien d'autre que la combinaison de ces deux appels n'a fonctionné pour moi.

Remplacer [mydb] pour [yourdatabasename]

15
répondu mahonya 2015-08-17 03:23:14

j'ai la même erreur et a remarqué ce qui est mal : Jetez un oeil à votre assemblée d'identité ! Il est 65536-le mien est 65538

il semble que l'ID d'assemblage soit codé sur un entier 16bits. Ainsi, "serveur peut être exécuté à partir de ressources" prend un sens logique.

bogue Microsoft, à mon avis. Si vous avez trouver un meilleur moyen que redémarrer ou redémarrer le service, s'il vous plaît faites le moi savoir! :)

5
répondu Hugues 2012-10-31 13:54:51

une combinaison de choses étaient nécessaires dans mon cas où j'avais copié une base de données à partir d'un serveur différent et l'utilisateur qui a créé la base de données n'était pas présent sur le nouveau serveur.

myDB est la base de données à laquelle j'essaie d'accéder validDbUser est le nom d'utilisateur sur le nouveau serveur de base de données auquel je souhaite changer le propriétaire de la base de données transplantée.

USE myDB
GO
ALTER DATABASE [myDB] SET TRUSTWORTHY ON
GO
EXEC sp_changedbowner [validDbUser]
2
répondu sweetfa 2016-07-23 03:46:58

problème dans mon cas était que la restauration de DB a été exécutée avec L'authentification de Windows sur le serveur SQL! Laisser tomber DB, se connecter avec sa, restaurer DB à nouveau et mettre TRUSTWORTHY sur, résolu mon problème!

1
répondu 100r 2013-11-01 15:34:15

quels espaces de noms faites-vous référence dans l'Assemblée? SQL Server ne supporte officiellement qu'un poignée des références que .net A disponibles.

j'ai vu exactement le même problème lors du référencement du système.DirectoryServices (non supporté). Nous avions une table clr fonction valorisée qui fonctionnerait très bien pendant une semaine environ et puis, tout d'un coup, serait erreur. Un redéploiement ou un recyclage du service réglerait temporairement le problème.

assurez-vous que tous vos les références à namespace sont supportées. Sinon, vous pouvez potentiellement détruire la base de données.

0
répondu brian 2011-08-12 05:21:32

je soupçonne que vous ne disposez pas de votre SqlConnection et SqlCommand des instances à l'intérieur de votre assemblage, c'est pourquoi il manque de ressources. Soit ça, soit il y a une fuite de mémoire, pouvez-vous poster le code?

0
répondu TheCodeKing 2011-09-03 15:45:18

C'est bizarre. J'ai eu le MÊME PROBLÈME MAIS j'ai confirmé que le compte dbo était valide via une requête rapide: Sélectionner "TEST" comme Test Exécuter as USER = 'dbo' J'ai aussi vérifié que Trustworthy était mis à True.

ce qui l'a réparé pour ma boîte a été de changer le "propriétaire de l'assemblage" de dbo à mon propre utilisateur et ensuite de nouveau à dbo.

0
répondu regeter 2014-01-28 23:51:37

nous avons vu cette erreur en essayant de mettre à jour des colonnes spatiales sur un nouveau serveur qui exécutait SQL Server 2017.

crédit au responsable informatique de notre société cliente qui a découvert que:

Sql 2017 introduit de nouvelles règles de fiducie pour CLR (SQL 2012 n'était pas un problème.).. Même le CLR " sûr " doit avoir été signé (ce qui n'est-ce pas), ou que vous avez à force de la fiducie, comme ci-dessous:

DECLARE @clrName nvarchar(4000) = 'sqlspatialtools, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil'

DECLARE @asmBin varbinary(max) = 'PUT THE BINARY STRING HERE (GET FROM SCRIPTING CREATE TO FOR THE EXISTING ASSEMBLY'

DECLARE @hash varbinary(64);

SELECT @hash = HASHBYTES('SHA2_512', @asmBin);

EXEC sys.sp_add_trusted_assembly @hash = @hash, @description = @clrName;

Cela a réglé le problème pour nous.

0
répondu Ian Grainger 2018-01-24 14:39:07