内存优化的DLL不会被删除


8

从BOL,我的理解是DBA不需要管理为内存优化表或本机编译的存储过程创建的DLL,因为它们在SQL Server服务启动时会自动重新编译,而在不再需要时会被删除。但是我正在见证,即使在删除内存优化表并重新启动服务之后,这些DLL仍然存在于文件系统中,并且仍会加载到SQL内存中并附加到进程中。这可以通过以下事实证明:它们仍然在sys_dm_os_loaded_modules中可见,并且如果您尝试在运行SQL Service的同时将其删除,则它们将锁定在文件系统中。

这是一个错误吗?还是稍后再清理?如果以后没有启动实例,那么是什么触发清除工作?

Answers:


4

这是一个错误吗?

不,这不是错误。其设计。保留它们是为了进行故障排除和支持目的。

来自SQL_Server_2014_In-Memory_OLTP White_Paper

数据库管理员不需要维护由本机编译生成的文件。SQL Server自动删除不再需要的生成文件,例如,在删除表和存储过程以及删除数据库时,以及在服务器或数据库重新启动时,都不再需要。

我试图SQL Server 2014 + RTM + (Build12.0.2000.8)通过创建测试内存优化表并检查使用

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

放下表格后,dll仍然在上面的select语句的输出中显示,并且文件仍然在文件夹中,并且在重新启动后它们也仍然在文件夹中。

从在线书籍 -

无需用户交互即可管理这些文件(.c, .obj, .xml, .pdb., .dll)。SQL Server将根据需要创建和删除文件。

所以我想,我们只需要遵循Microsoft所说的-SQL Server将为我们管理它们:-)

仅用于教育目的:

我设法通过清理旧文件

  • CHECKPOINT在数据库上发布手册。
  • 使数据库脱机,然后使其联机。

理想情况下,您不应该重新启动服务器实例,只需手动检查点和数据库的脱机/联机即可清除文件。

例如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

---现在检查dll是否已加载

选择名称,描述来自sys.dm_os_loaded_modules,其中描述=“ XTP本机DLL”

在此处输入图片说明

--- 现在放表格并做一个手动检查点

use db1;
drop table dbo.t1;
checkpoint

仍然将模块加载到内存中(即使服务器重新启动有时也会加载模块)

在此处输入图片说明

.c, .obj, .xml, .pdb., .dll)仍然存在于文件夹中:

在此处输入图片说明

现在使数据库脱机,然后使其联机-(.c, .obj, .xml, .pdb., .dll)都消失了...

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.