Sql-Server-2008

無法刪除其他 tempdb 文件

  • May 3, 2019

在我們的生產數據庫中,我們只有 1 個 tempdb 文件,它已經膨脹到 180GB。

我跑了:

Alter Database tempdb
modify file (name='tempdev', size=30gb);

調整主文件的大小,然後執行附加:

ALTER DATABASE tempdb
ADD FILE (NAME='tempdev2', FILENAME='M:\SQLData\tempdb2.ndf', Size=30GB);

添加其他 tempdb 文件。我遇到了驅動器空間錯誤,因為主數據庫沒有縮小到 30GB,並且操作在中途停止。

我現在剩下一個額外的 tempdb 文件,它是 30GB,而主文件是 180GB,我無法擺脫它。

我試過跑步

DBCC SHRINKFILE('tempdev2', EMPTYFILE)

但我收到一個錯誤:

在 sys.database_files 中找不到數據庫“tempdb”的文件“tempdev2”。

該文件不存在或已被刪除。

我覺得這個錯誤是因為操作無法成功完成。(我有腐敗嗎?)

當我嘗試跑步時

ALTER DATABASE tempdb
REMOVE FILE tempdev2;

我收到以下錯誤:

系統目錄中的文件“M:\SQLData\tempdb2.ndf”已被修改。下次啟動數據庫時將使用新路徑。

消息 5042,級別 16,狀態 1,第 35 行

文件 ’tempdev2’ 不能被刪除,因為它不是空的。

sys.database_files 看起來像這樣 在此處輸入圖像描述

tempdb.sys.all_objects 的結果 在此處輸入圖像描述

Sys.database_files

在此處輸入圖像描述

編輯:我能夠解決嘗試執行 EMPTYFILE Shrink 時收到的“找不到文件”文件名損壞問題。我使用文件 ID 而不是邏輯名稱。

DBCC SHRINKFILE(3,EMPTYFILE); -- File ID instead of logical name.

我發現另一種有效的方法是重命名文件。

ALTER DATABASE tempdb MODIFY FILE (NAME =tempdev2, NEWNAME =tempdev3);

所以你目前的情況是一個完整的驅動器,你有兩個 TempDB,你想修改舊的大小,而新創建的很難被刪除?

在 tempdb 數據庫上使用 DBCC SHRINKDATABASE 命令有一些限制。數據和日誌文件的目標大小不能小於創建數據庫時指定的大小,也不能小於使用文件大小更改操作(例如使用 MODIFY FILE 的 ALTER DATABASE )顯式設置的最後大小選項或命令。BCC SHRINKDATABASE 的另一個限制是計算 target_percentage 參數及其對目前使用空間的依賴性。

嘗試執行:

dbcc shrinkdatabase (tempddev, '70') 

這應該將您的文件設置為 ~54GB,考慮到我假設您的大小或型號為 30GB,這應該是一個安全的大小。相應地調整 %。

Microsoft - 如何縮小 tempdb

現在對於第二個文件,試試這個:

USE [tempdb]
GO
DBCC SHRINKFILE (N'tempdev2', EMPTYFILE)
GO

USE [tempdb]
GO
ALTER DATABASE [tempdb] REMOVE FILE [tempdev2]
GO

如果問題仍然存在,您將不得不重新啟動 SQL Server 以刪除該文件,因為 TempDB 正在使用中。

Microsoft 論壇 - 正在使用的文件

SQL 授權 - 收縮和刪除 Tempdb 文件

最後一點,您輸入了以下內容:

ALTER DATABASE tempdb 添加文件(NAME=‘tempdev2’,FILENAME=‘M:\SQLDatatempdb3.ndf’,大小=30GB);

您的螢幕截圖顯示tempdb2,請確保所有名稱准確無誤並仔細檢查它們。以防萬一有一個錯誤的輸入,這會導致你的頭痛。

在某些情況下執行

DBCC FREEPROCCACHE

可以幫助減輕痛苦並讓您縮小文件。

Ozar - 當 TempDB 不會收縮時。

如果您仍然遇到問題,請查看 tempdb 中的內容:

select * from tempdb.sys.all_objects
where is_ms_shipped = 0;

這將讓您查看 tempdb 文件的大小。

USE [tempdb]
SELECT
  [name]
  ,CONVERT(NUMERIC(10,2),ROUND([size]/128.,2))                                 AS [Size]
  ,CONVERT(NUMERIC(10,2),ROUND(FILEPROPERTY([name],'SpaceUsed')/128.,2))            AS [Used]
  ,CONVERT(NUMERIC(10,2),ROUND(([size]-FILEPROPERTY([name],'SpaceUsed'))/128.,2))      AS [Unused]
FROM [sys].[database_files]

從您的文章中,我們看到您在 TempDB 中使用了文件並且有可用空間。Daniel Hutmacher 的 SQLSunday有一個很好的連結,可以使用類似於 Ozar 的其他方法來縮小數據庫,我建議您也謹慎嘗試一下。

Mike Good - SQL Central發表了一篇關於通過調整 TempDB 的快照級別和回滾期來終止任何可能在您的數據庫上徘徊的連接來縮小您的 TempDB 的文章。

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