Sql-Server

未刪除記憶體優化的 DLL

  • April 18, 2016

根據 BOL,我的理解是 DBA 不需要管理為記憶體優化表或本地編譯的儲存過程創建的 DLL,因為它們會在 SQL Server 服務啟動時自動重新編譯,並在不再需要時被刪除。但我目睹,即使在刪除記憶體優化表並重新啟動服務之後,DLL 仍然存在於文件系統中,並且仍然載入到 SQL 記憶體中並附加到程序。這可以通過以下事實來證明:它們在 sys_dm_os_loaded_modules 中仍然可見,並且如果您在 SQL 服務執行時嘗試刪除它們,它們會被鎖定在文件系統中。

這是一個錯誤嗎?還是他們在以後清理?如果在以後的日期,如果不是實例重啟,是什麼觸發了清理?

這是一個錯誤嗎?

不,這不是錯誤。它的設計。保留它們以用於故障排除和可支持性目的。

來自SQL_Server_2014_In-Memory_OLTP White_Paper

數據庫管理員不需要維護原生編譯生成的文件。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'

刪除表後,dll仍然出現在上述 select 語句的輸出中,文件仍在文件夾中,重新啟動後它們也仍然存在。

從線上書籍-

管理這些文件 ( ) 無需使用者互動.c, .obj, .xml, .pdb., .dll。SQL Server 將根據需要創建和刪除文件。

所以我想,我們只需要遵循微軟所說的 - 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

— 現在檢查 dll 是否已載入

選擇名稱,描述 FROM sys.dm_os_loaded_modules WHERE description = ‘XTP Native DLL’

在此處輸入圖像描述

現在刪除表並做一個手動檢查點

use db1;
drop table dbo.t1;
checkpoint

模組仍然載入到記憶體中(即使伺服器重啟有時也會載入模組)

在此處輸入圖像描述

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

在此處輸入圖像描述

現在使數據庫離線,然後使其聯機 - ( .c, .obj, .xml, .pdb., .dll) 都消失了……

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/82662