Sql-Server

DBCC Shrinkfile 不適用於 SQL 2016

  • June 12, 2020

DBCC Shrinkfile('file1',emptyfile)在文件組中的第一個文件上成功執行並刪除了我縮小的文件。

對文件 2執行DBCC ShrinkFile('file2',emptyfile)不成功。文件 2 與 file1 位於同一文件組中。結果 2555 錯誤:

無法將文件“file2”的所有內容移動到其他地方以完成空文件操作。

重新啟動 SQL,從第 2 點執行腳本,結果相同。

我最終試圖刪除該文件所屬的文件組,並且該文件組中只有一個剩余文件。該文件的目前分配空間為 1 MB,可用空間為 0.81 MB

如果它說文件不為空,則它不為空。您需要弄清楚那裡有什麼,然後手動在另一個文件組上重建它,或者將其刪除。EMPTYFILE如果根本沒有對象,則僅適用於最後一個文件,當然這在文件組上是不可能的PRIMARY

我的第一個猜測是有一個表、索引或分區方案仍然與這個文件組相關聯:

DECLARE @fgid int;

SELECT @fgid = data_space_id
 FROM sys.filegroups
 WHERE name = N'smoochies';

SELECT [object] = o.name, [index] = i.name
 FROM sys.objects AS o
 INNER JOIN sys.indexes AS i
 ON o.[object_id] = i.[object_id]
 WHERE i.data_space_id = @fgid
   OR i.data_space_id IN 
   (
     SELECT partition_scheme_id
       FROM sys.destination_data_spaces AS ds
       WHERE data_space_id = @fgid
   );

SELECT ps.name
 FROM sys.destination_data_spaces AS ds
 INNER JOIN sys.partition_schemes AS ps
 ON ds.partition_scheme_id = ps.data_space_id
 WHERE ds.data_space_id = @fgid
 GROUP BY ps.name;

當你找到這個東西時(它可能是一個空表上的索引、一個空堆,或者只是一個仍在引用你要刪除的文件組的分區方案),你必須刪除/重建/轉移對像到一個新的分區方案。如果目前引用的分區是“永久”分區(先入RANGE RIGHT或後入RANGE LEFT),請參閱此答案

“emptyfile”選項實際上將所有數據從指定文件遷移到同一文件組中的其他文件。

換句話說,EMPTYFILE 將數據從指定文件遷移到同一文件組中的其他文件。

我的猜測是你的“file2”是這個文件組中唯一剩下的文件,這可能就是你不能清空它的原因。

在刪除它之前確保沒有任何東西在使用它

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