DLL ottimizzate per la memoria non rimosse


8

Da BOL, la mia comprensione è che i DBA non devono amministrare DLL create per tabelle ottimizzate per la memoria o procedure memorizzate compilate in modo nativo, poiché vengono ricompilate automaticamente quando viene avviato il servizio SQL Server e rimosse quando non sono più necessarie. Ma sto assistendo, anche dopo che una tabella ottimizzata per la memoria è stata eliminata e il servizio è stato riavviato, le DLL esistono ancora nel file system E vengono ancora caricate nella memoria SQL e associate al processo. Ciò può essere testimoniato dal fatto che sono ancora visibili in sys_dm_os_loaded_modules e sono bloccati nel file system se si tenta di eliminarli mentre il servizio SQL è in esecuzione.

è un insetto? O vengono ripuliti in un secondo momento? Se in un secondo momento, cosa attiva la pulizia, se non è un riavvio dell'istanza?

Risposte:


4

è un insetto?

No, non è un bug. È di design. Sono conservati per scopi di risoluzione dei problemi e di supporto.

Da SQL_Server_2014_In-Memory_OLTP White_Paper

Gli amministratori del database non devono conservare i file generati dalla compilazione nativa. SQL Server rimuove automaticamente i file generati non più necessari, ad esempio l'eliminazione di tabelle e stored procedure e il rilascio del database, ma anche al riavvio del server o del database.

Ho provato a riproporre il tuo scenario sul SQL Server 2014 + RTM + (Build12.0.2000.8)server - Dev Edition creando una tabella ottimizzata per la memoria di prova e controllando la dll caricata usando

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

Dopo che ho lasciato cadere la mia tabella, dllappare ancora nell'output dell'istruzione select sopra e i file sono ancora nella cartella e dopo il riavvio sono ancora lì.

Da libri online -

Non è necessaria alcuna interazione dell'utente per gestire questi file ( .c, .obj, .xml, .pdb., .dll). SQL Server creerà e rimuoverà i file se necessario.

Quindi immagino, dobbiamo solo seguire ciò che dice Microsoft - SQL Server li gestirà per noi :-)

SOLO A SCOPO EDUCATIVO:

Sono riuscito a ripulire i vecchi file da

  • Emissione di un manuale CHECKPOINTsul database.
  • Portare il database offline e quindi portarlo online.

Idealmente, non dovresti riavviare l'istanza del server, solo il checkpoint manuale e offline / online del database cancelleranno i file.

ad es. 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

--- ora controlla se la dll è caricata o meno

SELEZIONA nome, descrizione DA sys.dm_os_loaded_modules DOVE descrizione = 'XTP Native DLL'

inserisci qui la descrizione dell'immagine

--- ora rilascia la tabella ed esegui un checkpoint manuale

use db1;
drop table dbo.t1;
checkpoint

Tuttavia il modulo è caricato in memoria (anche il riavvio del server caricherà il modulo a volte )

inserisci qui la descrizione dell'immagine

I ( .c, .obj, .xml, .pdb., .dll) sono ancora presenti nella cartella:

inserisci qui la descrizione dell'immagine

Ora porta il database offline e poi portalo online - i ( .c, .obj, .xml, .pdb., .dll) sono andati tutti ...

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.