Pet*_*ete 8 sql-server sql-server-2014 memory-optimized-tables
从 BOL 来看,我的理解是 DBA 不需要管理为内存优化表创建的 DLL 或本机编译的存储过程,因为它们会在 SQL Server 服务启动时自动重新编译,并在不再需要时删除。但我亲眼目睹,即使在删除内存优化表并重新启动服务之后,DLL 仍然存在于文件系统中,并且仍然加载到 SQL 内存中并附加到进程中。这可以通过以下事实来证明:它们在 sys_dm_os_loaded_modules 中仍然可见,并且在 SQL 服务运行时如果您尝试删除它们,它们会被锁定在文件系统中。
这是一个错误吗?或者他们会在以后清理?如果在以后的日期,如果不是实例重启,是什么触发了清理?
这是一个错误吗?
不,这不是一个错误。这是设计使然。保留它们是为了故障排除和支持目的。
来自SQL_Server_2014_In-Memory_OLTP 白皮书
数据库管理员不需要维护本机编译生成的文件。SQL Server 会自动删除生成的不再需要的文件,例如删除表和存储过程、删除数据库以及重新启动服务器或数据库时。
我尝试SQL Server 2014 + RTM + (Build12.0.2000.8)通过创建测试内存优化表并检查使用加载的 dll 在开发版服务器上重现您的场景
SELECT name, description FROM sys.dm_os_loaded_modules
WHERE description = 'XTP Native DLL'
Run Code Online (Sandbox Code Playgroud)
在我删除表后,dll仍然出现在上面 select 语句的输出中,并且文件仍然在文件夹中,并且重新启动后它们也仍然在那里。
管理这些文件不需要用户交互 (
.c, .obj, .xml, .pdb., .dll)。SQL Server 将根据需要创建和删除文件。
所以我想,我们只需要遵循 Microsoft 所说的 - SQL 服务器将为我们管理它们:-)
我设法清理了旧文件
CHECKPOINT发布数据库手册。理想情况下,您不应重新启动服务器实例,只需手动检查点和数据库脱机/联机即可清除文件。
例如重现:
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
Run Code Online (Sandbox Code Playgroud)
--- 现在检查 dll 是否已加载
选择名称、描述 FROM sys.dm_os_loaded_modules WHERE 描述 = 'XTP Native DLL'

---现在删除表并执行手动检查点
use db1;
drop table dbo.t1;
checkpoint
Run Code Online (Sandbox Code Playgroud)
模块仍然加载到内存中(即使服务器重新启动有时也会加载模块)

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

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

| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |