Les DLL optimisées en mémoire ne sont pas supprimées

8

D'après BOL, je crois comprendre que les administrateurs de base de données n'ont pas besoin d'administrer les DLL créées pour les tables à mémoire optimisée ou les procédures stockées compilées en mode natif, car elles sont recompilées automatiquement, lorsque le service SQL Server démarre et sont supprimées lorsqu'elles ne sont plus nécessaires. Mais je constate que même après la suppression d'une table optimisée en mémoire et le redémarrage du service, les DLL existent toujours dans le système de fichiers ET sont toujours chargées dans la mémoire SQL et attachées au processus. Cela peut être constaté par le fait qu'ils sont toujours visibles dans sys_dm_os_loaded_modules et sont verrouillés dans le système de fichiers si vous essayez de les supprimer pendant que le service SQL est en cours d'exécution.

Est-ce un bug? Ou sont-ils nettoyés à une date ultérieure? Si à une date ultérieure, qu'est-ce qui déclenche le nettoyage, s'il ne s'agit pas d'un redémarrage d'instance?

Pete
la source

Réponses:

4

Est-ce un bug?

Non ce n'est pas un bug. C'est par conception. Ils sont conservés à des fins de dépannage et de prise en charge.

À partir du SQL_Server_2014_In-Memory_OLTP White_Paper

Les administrateurs de base de données n'ont pas besoin de gérer les fichiers générés par la compilation native. SQL Server supprime automatiquement les fichiers générés qui ne sont plus nécessaires, par exemple lors de la suppression de tables et de procédures stockées et lors de la suppression d'une base de données, mais également lors du redémarrage du serveur ou de la base de données.

J'ai essayé de reprocher votre scénario sur SQL Server 2014 + RTM + (Build12.0.2000.8)- serveur Dev Edition en créant une table optimisée pour la mémoire de test et en vérifiant la DLL chargée à l'aide

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

Après avoir déposé ma table, le dllapparaît toujours dans la sortie de l'instruction select ci-dessus et les fichiers sont toujours dans le dossier et après le redémarrage, ils sont toujours là aussi.

Des livres en ligne -

Aucune interaction utilisateur n'est nécessaire pour gérer ces fichiers ( .c, .obj, .xml, .pdb., .dll). SQL Server créera et supprimera les fichiers si nécessaire.

Donc je suppose que nous devons juste suivre ce que dit Microsoft - SQL Server les gérera pour nous :-)

UNIQUEMENT À DES FINS ÉDUCATIVES:

J'ai réussi à nettoyer les anciens fichiers en

  • Publication d'un manuel CHECKPOINTsur la base de données.
  • Mettre la base de données hors ligne, puis la mettre en ligne.

Idéalement, vous ne devriez pas redémarrer l'instance de serveur, juste un point de contrôle manuel et hors ligne / en ligne de la base de données effacera les fichiers.

par exemple 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

--- vérifiez maintenant si la dll est chargée ou non

SELECT nom, description FROM sys.dm_os_loaded_modules WHERE description = 'DLL native XTP'

entrez la description de l'image ici

--- maintenant déposer la table et faire un point de contrôle manuel

use db1;
drop table dbo.t1;
checkpoint

Le module est toujours chargé en mémoire (même le redémarrage du serveur chargera parfois le module )

entrez la description de l'image ici

Les ( .c, .obj, .xml, .pdb., .dll) sont toujours présents dans le dossier:

entrez la description de l'image ici

Maintenant, mettez la base de données hors ligne, puis mettez-la en ligne - les ( .c, .obj, .xml, .pdb., .dll) sont tous partis ...

entrez la description de l'image ici

Kin Shah
la source