未刪除記憶體優化的 DLL
根據 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
) 都消失了……