FIX: Messages d'erreur après SQL Server a été en cours d'exécution pendant un certain temps sur Windows Server 2003 ou sur Windows 2000: "Failed to load FileName.dll" et "Tentatives de charger n'importe quel type de dll pourrait échouer dans le processus de serveur SQL"

S’applique à : SQL Server 2008 R2 StandardSQL Server 2008 R2 WorkgroupSQL Server 2008 R2 Developer

Symptômes


Lorsque vous exécutez Microsoft SQL Server sur un ordinateur Windows Server 2003 ou sur un ordinateur Windows 2000, vous pouvez recevoir un message d'erreur qui contient les messages d'erreur suivants :
  • Défaut de charger FileName.dll
  • Les tentatives de chargement de n'importe quel type de dll peuvent échouer dans le processus de serveur SQL avec des erreurs pointant vers l'échec de LoadLibrary.
Ce problème se produit généralement après SQL Server a été en cours d'exécution pendant un certain temps. Le message d'erreur complet que vous recevez ressemble à ce qui suit :
Type d'exception: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseExceptionMessage: La lecture sur la base de données a échoué. Motif: Failed to load Msxmlsql.dll.Data: System.Collections.ListDictionaryI,4092,NULL,NULL,2007-04-13 09:44:11.640,DB-SQLServer5,warning,2007-04-13 09:44:13.153,The activated proc [dbo]. [sp_sysmail_activate] en cours d'exécution sur la file d'attente msdb.dbo.ExternalMailQueue sortie suivante: «La file d'attente de service "ExternalMailQueue" est actuellement désactivé.'Tentatives d'utiliser l'activité liée XML dans TSQL échoue. Msg 6610, Niveau 16, État 1, Procédure sp_xml_preparedocument, Ligne 1 Failed to load Msxmlsql.dll.Msg 6607, Level 16, State 3, Proceduresp_xml_removedocument, Line 1 sp_xml_removedocument: La valeur fournie pour le paramètre numéro 1 est invalide. Les tentatives de chargement de n'importe quel type de dll peuvent échouer dans le processus de serveur SQL avec des erreurs pointant vers l'échec de LoadLibrary. Les tentatives d'utilisation de procédures stockées prolongées se traduiront par Msg 0, Niveau 16, État 0, Procédure xp_ss_backup, Ligne 1Impossible à charger le DLL C : 'Program Files''Microsoft SQL Server'MSSQL'SQLsafe_ExtendedStoredProc.dll, ou l'un des DLL qu'il fait référence. Motif: 1114(Une bibliothèque de liaison dynamique (DLL) routine d'initialisation a échoué.). Erreur: 18210, Gravité: 16, État: 1.BackupVirtualDeviceSet::Initialize: CoCreateInstance failure on backup device 'd4630f27-03a1-47ae-b7a7-4813a6809908'. Erreur du système d'exploitation 0x8007045a(Une bibliothèque de liaison dynamique (DLL) routine d'initialisation échoué.). Erreur: 6512, Gravité: 16, État: 27.Failed to paraphé the Common Language Runtime (CLR) v2.0.50727 with HRESULT 0x80004005. Vous devez redémarrer SQL Server pour utiliser les fonctionnalités d'intégration CLR.

Cause


Ce problème se produit parce qu'aucun thread local de stockage (TLS) slot est disponible pour le processus SQL Server (Sqlservr.exe). Il s'agit d'un problème dans Windows Server 2003 et dans Windows 2000.When SQL Server décharge un DLL, les fentes TLS que le DLL utilise ne peut pas être publié en raison d'un problème dans la fonction TlsFree. Si SQL Server charge fréquemment différents DLL, puis décharge ces DLL, ces DLL s'utilisent jusqu'à toutes les fentes TLS disponibles. Finalement, SQL Server ne peut plus charger un DLL qui nécessite des emplacements TLS.

Résolution


Remarque Cette résolution est uniquement pour Windows Server 2003. Si vous utilisez Windows 2000, suivez les étapes de la section « Contournement ».

Informations Hotfix pour Windows Server 2003

Un hotfix pris en charge est disponible chez Microsoft. Cependant, ce hotfix est destiné à corriger uniquement le problème qui est décrit dans cet article. Appliquez ce hotfix uniquement aux systèmes qui connaissent ce problème spécifique. Ce hotfix pourrait recevoir des tests supplémentaires. Par conséquent, si vous n'êtes pas gravement affecté par ce problème, nous vous recommandons d'attendre la prochaine mise à jour logicielle qui contient ce hotfix. Si le hotfix est disponible en téléchargement, il y a une section "Téléchargement Hotfix disponible" en haut de cet article de base de connaissances. Si cette section n'apparaît pas, contactez Microsoft Customer Service and Support pour obtenir le hotfix. Remarque Si d'autres problèmes se produisent ou si un dépannage est nécessaire, vous devrez peut-être créer une demande de service distincte. Les coûts de soutien habituels s'appliqueront aux questions de soutien supplémentaires et aux questions qui ne sont pas admissibles à ce correctif précis. Pour une liste complète des numéros de téléphone Microsoft Customer Service et Support ou pour créer une demande de service distincte, visitez le site Web Microsoft suivant :Remarque Le formulaire "Téléchargement Hotfix disponible" affiche les langues pour lesquelles le hotfix est disponible. Si vous ne voyez pas votre langue, c'est parce qu'un hotfix n'est pas disponible pour cette langue.
Conditions préalables
Vous devez avoir Windows Server 2003 Service Pack 2 installé sur le serveur. Pour plus d'informations, cliquez sur le numéro d'article suivant pour voir l'article dans la base de connaissances Microsoft :
889100 Comment obtenir le dernier Service Pack pour Windows Server 2003
Informations sur le redémarrage
Vous devez redémarrer l'ordinateur après avoir appliqué ce hotfix.
Informations sur le remplacement de correctif logiciel
Ce correctif logiciel n'en remplace pas d'autre.
Informations sur les fichiers
La version anglaise de ce hotfix a les attributs de fichier (ou plus tard attributs de fichier) qui sont répertoriés dans le tableau suivant. Les dates et les heures de ces fichiers sont répertoriées dans Le Temps Universel Coordonné (UTC). Lorsque vous affichez les informations de fichier, elles sont converties en heure locale. Pour trouver la différence entre utC et heure locale, utilisez l'onglet Time Zone dans l'élément Date et Heure dans le panneau de contrôle.Windows Server 2003 avec Service Pack 2, versions x86
Nom du fichierVersion du fichierTaille du fichierDateHeurePlateforme
Ntkrpamp.exe5.2.3790.41772,348,03229-Oct-200719:01x86
Windows Server 2003 avec Service Pack 2, versions x64
Nom du fichierVersion du fichierTaille du fichierDateHeurePlateforme
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
Windows Server 2003 avec Service Pack 2, versions basées sur IA64
Nom du fichierVersion du fichierTaille du fichierDateHeurePlateforme
Ntdll.dll5.2.3790.42251,636,86428-Jan-200810:40IA-64
Ntkrnlmp.exe5.2.3790.42256,568,96028-Jan-200810:40IA-64

Solution de contournement


Vous pouvez utiliser l'une des méthodes suivantes pour contourner ce problème. Nous vous recommandons d'utiliser la méthode 1 parce que la fonction de procédure stockée étendue peut être supprimée dans les versions futures de SQL Server.

Méthode 1

  1. Utilisez la procédure sp_OACreate stockée pour déterminer les DLL que SQL Server charge dans le processus SQL Server. Pour ce faire, suivez les étapes suivantes :
    1. Ouvrez SQL Profiler, puis connectez-vous à l'instance de SQL Server.
    2. Dans la boîte de dialogue Trace Properties, spécifiez le nom de la trace, spécifiez l'endroit où SQL Profiler enregistre la trace, puis cliquez sur Exécuter.
    3. Après avoir exécuté SQL Profiler pendant un certain temps, analyser la trace pour localiser les occurrences de la procédure sp_OACreate stockée.
    4. Notez le premier paramètre de chaque occurrence de la procédure sp_OACreate stockée. Remarque Le premier paramètre indique l'identifiant programmatique (ProgID) de l'objet OLE ou l'identifiant de classe (CLSID) de l'objet OLE.
    5. Déterminez le DLL qui contient cet objet OLE.
    Remarque Vous pouvez utiliser SQL Profiler pour surveiller l'instance de SQL Server lorsque vous démarrez le service SQL Server.
  2. Assurez-vous d'avoir activé l'option des procédures d'automatisation OLE. Pour plus d'informations sur la façon de déterminer si l'option des procédures d'automatisation OLE est activée et comment activer l'option des procédures d'automatisation OLE, visitez le site Web suivant microsoft Develop Network (MSDN) :
  3. Dans SQL Server Management Studio de SQL Server 2008 R2, de SQL Server 2008, ou de SQL Server 2005 ou dans SQL Query Analyzer de SQL Server 2000, exécutez les instructions suivantes. Remarque  Par exemple, le code suivant montre comment charger le fichier 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
    Les instructions créent une procédure stockée. Les instructions permettent également à la procédure stockée de s'exécuter lorsque le service SQL Server démarre. Cette procédure stockée effectue les opérations suivantes :
    • Charge le fichier Wbemdisp.dll.
    • Conserve le fichier Wbemdisp.dll en mémoire parce que les instructions ne sortent pas.
    Tant que le fichier Wbemdisp.dll est en mémoire, d'autres instructions ne chargent plus le fichier Wbemdisp.dll. Par conséquent, SQL Server n'appelle pas la fonction TlsAlloc et la fonction TlsFree pour le fichier Wbemdisp.dll. Remarque Vous devez mettre à jour le code pour charger les DLL que vous avez déterminés à l'étape 1.
  4. Ajoutez les instructions à la procédure sp_Load_Dll stockée à l'étape 3. Ces instructions chargent les DLL que vous avez déterminés à l'étape 1.
  5. Redémarrez le service SQL Server.
  6. Vérifiez que SQL Server charge le fichier Wbemdisp.dll en mémoire. Pour ce faire, suivez les étapes suivantes :
    1. Ouvrez le fichier de journal d'erreur SQL Server.
    2. Rechercher le message suivant :
      wbemdisp.dll chargé dans l'espace d'adresse de sql par la procédure de démarrage sp_Load_Dll
      Remarque Ce message indique que SQL Server a chargé le fichier Wbemdisp.dll.
    3. Lors d'une invite de commande, exécutez la commande suivante :
      tasklist /m
    4. Dans le résultat que vous obtenez, localiser le processus Sqlservr.exe, puis vérifier que le fichier Wbemdisp.dll est répertorié. Remarque Si le fichier Wbemdisp.dll est répertorié, SQL Server a chargé le fichier Wbemdisp.dll.

Méthode 2

  1. Utilisez la procédure sp_OACreate stockée pour déterminer les DLL que SQL Server charge dans le processus SQL Server. Pour ce faire, suivez les étapes suivantes :
    1. Ouvrez SQL Profiler, puis connectez-vous à l'instance de SQL Server.
    2. Dans la boîte de dialogue Trace Properties, spécifiez le nom de la trace, spécifiez l'endroit où SQL Profiler enregistre la trace, puis cliquez sur Exécuter.
    3. Après avoir exécuté SQL Profiler pendant un certain temps, analyser la trace pour localiser les occurrences de la procédure sp_OACreate stockée.
    4. Notez le premier paramètre de chaque occurrence de la procédure sp_OACreate stockée. Remarque Le premier paramètre indique l'identifiant programmatique (ProgID) de l'objet OLE ou l'identifiant de classe (CLSID) de l'objet OLE.
    5. Déterminez le DLL qui contient cet objet OLE.
    Remarque Vous pouvez utiliser SQL Server Profiler pour surveiller l'instance de SQL Server lorsque vous démarrez le service SQL Server.
  2. Créez une procédure stockée étendue. La procédure stockée étendue contient une fonction qui charge les DLL que vous avez déterminés à l'étape 1.
  3. Ajoutez la procédure stockée étendue à SQL Server.
  4. Dans SQL Server, utilisez la procédure de stockage du système sp_addextendedproc pour enregistrer la fonction dans la procédure stockée étendue.
  5. Utilisez la procédure sp_procoption stockée pour permettre à la procédure stockée étendue de démarrer automatiquement lorsque le service SQL Server démarre.
  6. Redémarrez le service SQL Server.
Lorsque SQL Server exécute la fonction dans la procédure stockée étendue, SQL Server charge les DLL en appelant l'API LoadLibrary.

Statut


Ce n'est pas un problème dans SQL Server. C'est un problème dans Windows Server 2003 et dans Windows 2000. Ce problème ne se produit pas dans Windows Vista ou dans Windows Server 2008.

Références


Pour plus d'informations sur la fonction TlsAlloc, visitez le site Web suivant du Microsoft Developer Network (MSDN) :Pour plus d'informations sur la fonction TlsFree, visitez le site Web MSDN suivant :Pour de plus amples renseignements sur la procédure sp_OACreate stockée, visitez le site Web mSDN suivant :