Sql-Server

刪除 Tempdb .ndfs

  • March 12, 2021

Tempdb 配置了 8 個文件,我們將它們減少到 4 個。我閱讀了許多部落格,其中 SQL Server 將允許您刪除多餘的 .ndf,如果您執行 4 個 dbcc drop 和 free 語句,然後dbcc shrinkfile使用 emptyfile 子句執行,然後帶有 remove file 子句的 alter db 命令。嘗試此操作時,錯誤

DBCC SHRINKFILE:無法移動頁面 9:364016,因為它是工作表頁面。

Msg 2555, Level 16, State 1, Line 19 無法將文件“tempdev8”的所有內容移動到其他地方以完成空文件操作。DBCC 執行完成。如果 DBCC 列印錯誤消息,請聯繫您的系統管理員。

我的問題:

我應該嘗試通過辨識它們來刪除鎖定的臨時表,然後重新執行 dbcc 語句,還是簡單地執行 alter 語句,然後重新啟動實例,或者重新啟動實例,然後重新執行 alter?我意識到 tempdb 一直使用臨時表的問題導致刪除文件不起作用。

根據Mike Rose在 Microsoft 社交網站上的回答,我相信這應該可行:

DBCC FREESYSTEMCACHE ('ALL');

DBCC FREEPROCCACHE;

由於 SQL Server 將重新創建查詢計劃,因此這會對性能造成一些影響,但它應該允許您縮小TEMPDB.

我首先執行以下命令,看看是否可以刪除文件而無需重新啟動 sql 服務。

USE [tempdb]
GO
DBCC DROPCLEANBUFFERS
GO
DBCC FREEPROCCACHE
GO
DBCC FREESESSIONCACHE
GO
DBCC FREESYSTEMCACHE ( 'ALL')
GO
DBCC SHRINKFILE (N'temp5' , EMPTYFILE)
GO
ALTER DATABASE [tempdb] REMOVE FILE [temp5]
GO

如果文件被阻止,那麼我會更改大小和文件增長。然後等待下一個服務視窗可以重新啟動sql服務。然後文件很小,空的,並且為增長而鎖定。然後,您可以輕鬆刪除它們。

--before the sql server restart
USE [master]
ALTER DATABASE TempDB MODIFY FILE
(NAME = temp5, SIZE = 1KB, FILEGROWTH = 0 )
GO

--then after the sql server restart
USE [TempDB]
DBCC SHRINKFILE (N'temp5' , EMPTYFILE)
GO
ALTER DATABASE [tempdb] REMOVE FILE [temp5]
GO

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