Las DLL optimizadas para memoria no se eliminan


8

Desde BOL, entiendo que los DBA no necesitan administrar DLL creadas para tablas con memoria optimizada, o procedimientos almacenados compilados de forma nativa, ya que se vuelven a compilar automáticamente, cuando se inicia el servicio SQL Server y se eliminan cuando ya no se necesitan. Pero soy testigo de que, incluso después de que una tabla de memoria optimizada se haya descartado y se haya reiniciado el servicio, las DLL aún existen en el sistema de archivos Y aún se cargan en la memoria SQL y se adjuntan al proceso. Esto se puede observar por el hecho de que todavía están visibles en sys_dm_os_loaded_modules y están bloqueados en el sistema de archivos si intenta eliminarlos, mientras se ejecuta el Servicio SQL.

¿Es esto un error? ¿O se limpian en una fecha posterior? Si en una fecha posterior, ¿qué desencadena la limpieza, si no es un reinicio de instancia?

Respuestas:


4

¿Es esto un error?

No, no es un error. Es por diseño. Se conservan con fines de resolución de problemas y compatibilidad.

Del SQL_Server_2014_In-Memory_OLTP White_Paper

Los administradores de bases de datos no necesitan mantener los archivos generados por la compilación nativa. SQL Server elimina automáticamente los archivos generados que ya no son necesarios, por ejemplo, en la eliminación de tablas y procedimientos almacenados, y en la caída de la base de datos, pero también en el reinicio del servidor o la base de datos.

Traté de reproducir su escenario en el SQL Server 2014 + RTM + (Build12.0.2000.8)servidor Dev Edition creando una tabla optimizada de memoria de prueba y verificando el dll cargado usando

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

Después de que solté mi tabla, dlltodavía aparece en el resultado de la instrucción select anterior y los archivos todavía están en la carpeta y después del reinicio todavía están allí.

De libros en línea -

No se necesita interacción del usuario para administrar estos archivos ( .c, .obj, .xml, .pdb., .dll). SQL Server creará y eliminará los archivos según sea necesario.

Entonces, supongo que solo tenemos que seguir lo que dice Microsoft: el servidor SQL los administrará por nosotros :-)

SOLO PARA PROPÓSITO EDUCATIVO:

Me las arreglé para limpiar los archivos viejos por

  • Emitir un manual CHECKPOINTen la base de datos.
  • Desconectar la base de datos y luego ponerla en línea.

Idealmente, no debería reiniciar la instancia del servidor, solo el punto de control manual y fuera de línea de la base de datos borrará los archivos.

por ejemplo, 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

--- ahora verifique si el dll está cargado o no

SELECCIONE el nombre, la descripción DESDE sys.dm_os_loaded_modules WHERE description = 'XTP Native DLL'

ingrese la descripción de la imagen aquí

--- ahora suelte la tabla y haga un punto de control manual

use db1;
drop table dbo.t1;
checkpoint

Todavía el módulo se carga en la memoria (incluso el reinicio del servidor cargará el módulo a veces )

ingrese la descripción de la imagen aquí

Los ( .c, .obj, .xml, .pdb., .dll) todavía están presentes en la carpeta:

ingrese la descripción de la imagen aquí

Ahora desconecte la base de datos y luego conéctela: los ( .c, .obj, .xml, .pdb., .dll) se han ido ...

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.