Sql-Server
刪除 Tempdb .ndfs
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