Update: Fehlermeldungen, nachdem SQL Server seit einiger Zeit auf Windows Server 2003 oder unter Windows 2000 ausgeführt wird: "FileName.dll konnte nicht geladen werden" und "Versuche, eine beliebige DLL-Datei zu laden, können innerhalb des SQL Server-Prozesses fehlschlagen"

Gilt für: SQL Server 2008 R2 StandardSQL Server 2008 R2 WorkgroupSQL Server 2008 R2 Developer

Problembeschreibung


Wenn Sie Microsoft SQL Server auf einem Windows Server 2003-Computer oder auf einem Windows 2000-Computer ausführen, wird möglicherweise eine Fehlermeldung angezeigt, die die folgenden Fehlermeldungen enthält:
  • Fehler beim Laden von FileName.dll
  • Versuche, eine beliebige DLL-Art zu laden, schlagen möglicherweise innerhalb des SQL Server-Prozesses fehl, da Fehler auf LoadLibrary-Fehler hinweisen.
Dieses Problem tritt in der Regel auf, nachdem SQL Server seit einiger Zeit ausgeführt wird. Die vollständige Fehlermeldung, die Sie erhalten, ähnelt der folgenden:
Ausnahmetyp: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseExceptionMessage: Der Lesefehler in der Datenbank ist fehlgeschlagen. Grund: Msxmlsql.dll.Data: System.Collections.ListDictionaryI,4092,NULL,04-13 09:44:11.640,DB-SQLServer5,warning,2007-04-13 09:44:13.153,The activated proc [dbo] konnte nicht geladen werden. [sp_sysmail_activate] in der Warteschlange msdb.dbo.ExternalMailQueue gibt Folgendes aus: 'Die Dienstwarteschlange "ExternalMailQueue" ist derzeit deaktiviert.'Versuche, XML-bezogene Aktivität in TSQL zu verwenden, schlägt fehl. Msg 6610, Ebene 16, Status 1, Prozedur sp_xml_preparedocument, Zeile 1Fehler beim Laden von Msxmlsql.dll.Msg 6607, Ebene 16, Zustand 3, Proceduresp_xml_removedocument, Zeile 1 sp_xml_removedocument: Der für Parameter Nummer 1 angegebene Wert ist ungültig. Versuche, eine beliebige DLL-Art zu laden, schlagen möglicherweise innerhalb des SQL Server-Prozesses fehl, da Fehler auf LoadLibrary-Fehler hinweisen. Versuche, erweiterte gespeicherte Prozeduren zu verwenden, führen zu Msg 0, Level 16, State 0, Procedure xp_ss_backup, Line 1Kann nicht die DLL-Datei C:-Programmdateien, Microsoft SQL Server, MSSQL, Binn, SQLsafe_ExtendedStoredProc.dll oder eine der DLLs laden, auf die sie verweist. Grund: 1114(Eine DLL-Initialisierungsroutine (Dynamic Link Library) fehlgeschlagen.). Fehler: 18210, Schweregrad: 16, Status: 1.BackupVirtualDeviceSet::Initialize: CoCreateInstance-Fehler auf dem Sicherungsgerät 'd4630f27-03a1-47ae-b7a7-4813a6809908'. Betriebssystemfehler 0x8007045a(Eine DLL-Initialisierungsroutine (Dynamic Link Library) ist fehlgeschlagen.). Fehler: 6512, Schweregrad: 16, Status: 27.Fehler beim Initialisieren der Common Language Runtime (CLR) v2.0.50727 mit HRESULT 0x80004005. Sie müssen SQL Server neu starten, um CLR-Integrationsfeatures zu verwenden.

Ursache


Dieses Problem tritt auf, weil für den SQL Server-Prozess (Sqlservr.exe) kein TLS-Steckplatz (Thread Local Storage) verfügbar ist. Dies ist ein Problem in Windows Server 2003 und in Windows 2000. Wenn SQL Server eine DLL entlädt, werden die von der DLL verwendeten TLS-Steckplätze möglicherweise aufgrund eines Problems in der TlsFree-Funktion nicht freigegeben. Wenn SQL Server häufig verschiedene DLLs lädt und diese DLLs entlädt, verbrauchen diese DLLs alle verfügbaren TLS-Steckplätze. Schließlich kann SQL Server keine DLL mehr laden, die TLS-Slots erfordert.

Fehlerbehebung


Hinweis Diese Auflösung gilt nur für Windows Server 2003. Wenn Sie Windows 2000 verwenden, führen Sie die Schritte im Abschnitt "Problemumgehung" aus."

Hotfixinformationen für Windows Server 2003

Ein unterstützter Hotfix ist von Microsoft verfügbar. Mit diesem Hotfix soll jedoch nur das in diesem Artikel beschriebene Problem behoben werden. Wenden Sie diesen Hotfix nur auf Systeme an, auf denen dieses spezifische Problem auftritt. Dieser Hotfix wird möglicherweise zusätzliche Tests erhalten. Wenn Sie von diesem Problem nicht ernsthaft betroffen sind, sollten Sie daher auf das nächste Softwareupdate warten, das diesen Hotfix enthält. Wenn der Hotfix zum Download verfügbar ist, finden Sie oben in diesem Knowledge Base-Artikel einen Abschnitt "Hotfix-Download verfügbar". Wenn dieser Abschnitt nicht angezeigt wird, wenden Sie sich an den Microsoft-Kundendienst und -Support, um den Hotfix zu erhalten. Hinweis Wenn zusätzliche Probleme auftreten oder eine Fehlerbehebung erforderlich ist, müssen Sie möglicherweise eine separate Dienstanforderung erstellen. Die üblichen Supportkosten gelten für zusätzliche Supportfragen und Probleme, die nicht für diesen speziellen Hotfix in Frage kommen. Eine vollständige Liste der Telefonnummern des Microsoft-Kundendienstes und des Supports oder zum Erstellen einer separaten Dienstanforderung finden Sie auf der folgenden Microsoft-Website:Hinweis Das Formular "Hotfix-Download verfügbar" zeigt die Sprachen an, für die der Hotfix verfügbar ist. Wenn Ihre Sprache nicht angezeigt wird, liegt dies daran, dass für diese Sprache kein Hotfix verfügbar ist.
Voraussetzungen
Sie müssen Windows Server 2003 Service Pack 2 auf dem Server installiert haben. Weitere Informationen erhalten Sie, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
889100 So erhalten Sie das neueste Service Pack für Windows Server 2003
Informationen zum Neustart
Sie müssen den Computer nach der Installation dieses Hotfixes neu starten.
Ersetzte Hotfixes
Dieser Hotfix ersetzt keine anderen Hotfixes.
Dateiinformationen
Die englische Version dieses Hotfixes weist die Dateiattribute (oder höher Dateiattribute) auf, die in der folgenden Tabelle aufgeführt sind. Die Daten und Uhrzeiten für diese Dateien sind in Der koordinierten Weltzeit (UTC) aufgeführt. Wenn Sie die Dateiinformationen anzeigen, werden sie in die lokale Zeit konvertiert. Um den Unterschied zwischen UTC und Ortszeit zu ermitteln, verwenden Sie die Registerkarte Zeitzone im Element Datum und Uhrzeit in der Systemsteuerung.Windows Server 2003 mit Service Pack 2, x86-basierten Versionen
DateinameDateiversionDateigrößeDatumUhrzeitPlattform
Ntkrpamp.exe5.2.3790.41772,348,03229-Oct-200719:01x86
Windows Server 2003 mit Service Pack 2, x64-basierten Versionen
DateinameDateiversionDateigrößeDatumUhrzeitPlattform
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 mit Service Pack 2, IA64-basierten Versionen
DateinameDateiversionDateigrößeDatumUhrzeitPlattform
Ntdll.dll5.2.3790.42251,636,86428-Jan-200810:40IA-64
Ntkrnlmp.exe5.2.3790.42256,568,96028-Jan-200810:40IA-64

Problemumgehung


Sie können eine der folgenden Methoden verwenden, um dieses Problem zu umgehen. Es wird empfohlen, Methode 1 zu verwenden, da die Funktion für erweiterte gespeicherte Prozeduren in zukünftigen Versionen von SQL Server entfernt werden kann.

Methode 1

  1. Verwenden Sie die sp_OACreate gespeicherten Prozedur, um die DLLs zu bestimmen, die SQL Server in den SQL Server-Prozess lädt. Führen Sie hierzu die folgenden Schritte aus:
    1. Öffnen Sie SQL Profiler, und stellen Sie dann eine Verbindung mit der Instanz von SQL Server her.
    2. Geben Sie im Dialogfeld Ablaufverfolgungseigenschaften den Namen der Ablaufverfolgung an, geben Sie den Speicherort an, an dem SQL Profiler die Ablaufverfolgung speichert, und klicken Sie dann auf Ausführen.
    3. Nachdem Sie SQL Profiler einige Zeit lang ausgeführt haben, analysieren Sie die Ablaufverfolgung, um die Vorkommen der gespeicherten sp_OACreate zu finden.
    4. Beachten Sie den ersten Parameter jedes Vorkommens der sp_OACreate gespeicherten Prozedur. Hinweis Der erste Parameter gibt den programmatischen Bezeichner (ProgID) des OLE-Objekts oder den Klassenbezeichner (CLSID) des OLE-Objekts an.
    5. Bestimmen Sie die DLL, die dieses OLE-Objekt enthält.
    Hinweis Sie können SQL Profiler verwenden, um die Instanz von SQL Server zu überwachen, wenn Sie den SQL Server-Dienst starten.
  2. Stellen Sie sicher, dass Sie die Option OLE-Automatisierungsprozeduren aktiviert haben. Weitere Informationen zum Bestimmen, ob die Prozeduren für OLE-Automatisierung aktiviert sind, und zum Aktivieren der Ole-Automatisierungsprozeduren finden Sie auf der folgenden Microsoft Develop Network (MSDN)-Website:
  3. Führen Sie in SQL Server Management Studio von SQL Server 2008 R2, SQL Server 2008 oder SQL Server 2005 oder in SQL Query Analyzer von SQL Server 2000 die folgenden Anweisungen aus. Hinweis  Der folgende Code zeigt beispielsweise, wie die Datei Wbemdisp.dll geladen wird.
    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
    Die Anweisungen erstellen eine gespeicherte Prozedur. Die Anweisungen ermöglichen auch die Ausführung der gespeicherten Prozedur beim Starten des SQL Server-Dienstes. Diese gespeicherte Prozedur führt die folgenden Vorgänge aus:
    • Lädt die Datei Wbemdisp.dll.
    • Behält die Datei Wbemdisp.dll im Speicher, da die Anweisungen nicht beendet werden.
    Solange sich die Datei Wbemdisp.dll im Arbeitsspeicher befindet, laden andere Anweisungen die Datei Wbemdisp.dll nicht erneut. Daher ruft SQL Server die TlsAlloc-Funktion und die TlsFree-Funktion für die Datei Wbemdisp.dll nicht auf. Hinweis Sie müssen den Code aktualisieren, um die DLLs zu laden, die Sie in Schritt 1 festgelegt haben.
  4. Fügen Sie die Anweisungen der gespeicherten sp_Load_Dll in Schritt 3 hinzu. Diese Anweisungen laden die DLLs, die Sie in Schritt 1 festgelegt haben.
  5. Starten Sie den SQL Server-Dienst neu.
  6. Stellen Sie sicher, dass SQL Server die Datei Wbemdisp.dll in den Arbeitsspeicher lädt. Führen Sie hierzu die folgenden Schritte aus:
    1. Öffnen Sie die SQL Server-Fehlerprotokolldatei.
    2. Suchen Sie nach der folgenden Meldung:
      wbemdisp.dll durch Startprozedur in sql-Adressraum geladen sp_Load_Dll
      Hinweis Diese Meldung gibt an, dass SQL Server die Datei Wbemdisp.dll geladen hat.
    3. Führen Sie an einer Eingabeaufforderung den folgenden Befehl aus:
      tasklist /m
    4. Suchen Sie im erhaltenen Ergebnis den Prozess Sqlservr.exe, und überprüfen Sie dann, ob die Datei Wbemdisp.dll aufgeführt ist. Hinweis Wenn die Datei Wbemdisp.dll aufgeführt ist, hat SQL Server die Datei Wbemdisp.dll geladen.

Methode 2

  1. Verwenden Sie die sp_OACreate gespeicherten Prozedur, um die DLLs zu bestimmen, die SQL Server in den SQL Server-Prozess lädt. Führen Sie hierzu die folgenden Schritte aus:
    1. Öffnen Sie SQL Profiler, und stellen Sie dann eine Verbindung mit der Instanz von SQL Server her.
    2. Geben Sie im Dialogfeld Ablaufverfolgungseigenschaften den Namen der Ablaufverfolgung an, geben Sie den Speicherort an, an dem SQL Profiler die Ablaufverfolgung speichert, und klicken Sie dann auf Ausführen.
    3. Nachdem Sie SQL Profiler einige Zeit lang ausgeführt haben, analysieren Sie die Ablaufverfolgung, um die Vorkommen der gespeicherten sp_OACreate zu finden.
    4. Beachten Sie den ersten Parameter jedes Vorkommens der sp_OACreate gespeicherten Prozedur. Hinweis Der erste Parameter gibt den programmatischen Bezeichner (ProgID) des OLE-Objekts oder den Klassenbezeichner (CLSID) des OLE-Objekts an.
    5. Bestimmen Sie die DLL, die dieses OLE-Objekt enthält.
    Hinweis Sie können SQL Server Profiler verwenden, um die Instanz von SQL Server zu überwachen, wenn Sie den SQL Server-Dienst starten.
  2. Erstellen Sie eine erweiterte gespeicherte Prozedur. Die erweiterte gespeicherte Prozedur enthält eine Funktion, die die DLLs lädt, die Sie in Schritt 1 ermittelt haben.
  3. Fügen Sie die erweiterte gespeicherte Prozedur zu SQL Server hinzu.
  4. Verwenden Sie in SQL Server die gespeicherte sp_addextendedproc Systemprozedur, um die Funktion in der erweiterten gespeicherten Prozedur zu registrieren.
  5. Verwenden Sie die sp_procoption gespeicherten Prozedur, damit die erweiterte gespeicherte Prozedur beim Starten des SQL Server-Dienstes automatisch gestartet wird.
  6. Starten Sie den SQL Server-Dienst neu.
Wenn SQL Server die Funktion in der erweiterten gespeicherten Prozedur ausführt, lädt SQL Server die DLLs, indem die LoadLibrary-API aufgerufen wird.

Status


Dies ist in SQL Server kein Problem. Dies ist ein Problem in Windows Server 2003 und in Windows 2000. Dieses Problem tritt nicht in Windows Vista oder Windows Server 2008 auf.

Informationsquellen


Weitere Informationen zur TlsAlloc-Funktion finden Sie auf der folgenden MsDN-Website (Microsoft Developer Network):Weitere Informationen zur TlsFree-Funktion finden Sie auf der folgenden MSDN-Website:Weitere Informationen zum sp_OACreate gespeicherten Verfahrens finden Sie auf der folgenden MSDN-Website: