Speicheroptimierte DLLs werden nicht entfernt

8

Nach meinem Verständnis von BOL müssen DBAs keine DLLs verwalten, die für speicheroptimierte Tabellen oder nativ kompilierte gespeicherte Prozeduren erstellt wurden, da sie beim Start des SQL Server-Dienstes automatisch neu kompiliert und entfernt werden, wenn sie nicht mehr benötigt werden. Ich sehe jedoch, dass die DLLs auch nach dem Löschen einer speicheroptimierten Tabelle und dem Neustart des Dienstes noch im Dateisystem vorhanden sind UND weiterhin in den SQL-Speicher geladen und an den Prozess angehängt werden. Dies lässt sich daran erkennen, dass sie in sys_dm_os_loaded_modules weiterhin sichtbar sind und im Dateisystem gesperrt sind, wenn Sie versuchen, sie zu löschen, während der SQL-Dienst ausgeführt wird.

Ist das ein Fehler? Oder werden sie zu einem späteren Zeitpunkt aufgeräumt? Wenn zu einem späteren Zeitpunkt, was löst die Bereinigung aus, wenn es sich nicht um einen Instanzneustart handelt?

Pete
quelle

Antworten:

4

Ist das ein Fehler?

Nein, es ist kein Fehler. Es ist beabsichtigt. Sie werden zur Fehlerbehebung und zur Unterstützung aufbewahrt.

Aus dem SQL_Server_2014_In-Memory_OLTP White_Paper

Datenbankadministratoren müssen die Dateien, die durch die native Kompilierung generiert werden, nicht verwalten. SQL Server entfernt automatisch generierte Dateien, die nicht mehr benötigt werden, z. B. beim Löschen von Tabellen und gespeicherten Prozeduren sowie beim Löschen der Datenbank, aber auch beim Neustart des Servers oder der Datenbank.

Ich habe versucht, Ihr Szenario auf dem SQL Server 2014 + RTM + (Build12.0.2000.8)Dev Edition-Server zu wiederholen, indem ich eine für den Testspeicher optimierte Tabelle erstellt und die mit geladene DLL überprüft habe

     SELECT name, description FROM sys.dm_os_loaded_modules
WHERE description = 'XTP Native DLL'

Nachdem ich meine Tabelle gelöscht habe, wird die dllnoch in der Ausgabe der obigen select-Anweisung angezeigt und die Dateien befinden sich noch im Ordner und nach dem Neustart auch noch dort.

Aus Online-Büchern -

Zum Verwalten dieser Dateien ist keine Benutzerinteraktion erforderlich ( .c, .obj, .xml, .pdb., .dll). SQL Server erstellt und entfernt die Dateien nach Bedarf.

Also denke ich, wir müssen nur den Aussagen von Microsoft folgen - SQL Server wird sie für uns verwalten :-)

NUR FÜR BILDUNGSZWECKE:

Ich habe es geschafft, die alten Dateien von zu bereinigen

  • Ausgabe eines Handbuchs CHECKPOINTzur Datenbank.
  • Datenbank offline schalten und dann online schalten.

Im Idealfall sollten Sie die Serverinstanz nicht neu starten. Durch manuellen Checkpoint und Offline / Online der Datenbank werden die Dateien gelöscht.

zB Repro:

USE master
GO
create database db1
GO
ALTER DATABASE db1 ADD FILEGROUP db1_mod CONTAINS memory_optimized_data
GO
-- adapt filename as needed
ALTER DATABASE db1 ADD FILE (name='db1_mod', filename='D:\SQLServer2014\MSSQL12.SQL2014\MSSQL\DATA\db1_mod') -- change here as per your need !!
 TO FILEGROUP db1_mod
GO
USE db1
GO
CREATE TABLE dbo.t1
(c1 int not null primary key nonclustered,
c2 int)
WITH (MEMORY_OPTIMIZED=ON)
GO

--- Überprüfen Sie nun, ob die DLL geladen ist oder nicht

SELECT Name, Beschreibung FROM sys.dm_os_loaded_modules WHERE description = 'XTP Native DLL'

Geben Sie hier die Bildbeschreibung ein

--- Lassen Sie jetzt die Tabelle fallen und führen Sie einen manuellen Checkpoint durch

use db1;
drop table dbo.t1;
checkpoint

Trotzdem ist das Modul im Speicher geladen (selbst ein Neustart des Servers lädt das Modul manchmal )

Geben Sie hier die Bildbeschreibung ein

Die ( .c, .obj, .xml, .pdb., .dll) sind noch im Ordner vorhanden:

Geben Sie hier die Bildbeschreibung ein

Nehmen Sie nun die Datenbank offline und schalten Sie sie online - die ( .c, .obj, .xml, .pdb., .dll) sind alle weg ...

Geben Sie hier die Bildbeschreibung ein

Kin Shah
quelle