我有一個數據庫21 Gb;其中20 Gb是文件(FileStream),我已經從表中刪除所有文件,但是當我做備份時,備份文件仍然是21 GB。DBCC SHRINKFILE的進展
爲了解決這個問題,我成了idee「釋放未使用的空間」。
所以我想收縮我的數據庫如下所示:
USE Db;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE Db
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (Db, 100);
GO
-- Reset the database recovery model.
ALTER DATABASE Db
SET RECOVERY FULL;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);
如果我爲XX分鐘後,數據庫備份,然後將備份文件的大小爲1GB這樣,我可以看到未使用的空間已被成功清理。換句話說,上面的Sql代碼正常工作(XX分鐘後的數據庫是schrunk)。
我需要等到這個查詢(收縮操作)的問題完成,所以我努力做到以下幾點:
SELECT percent_complete, start_time, status, command, estimated_completion_time, cpu_time, total_elapsed_time
FROM sys.dm_exec_requests
我無法找到有關SHRINKFILE的任何信息命令在上述查詢的結果中。
難道我做錯了什麼?爲什麼我看不到DB收縮操作的進度?
而我的主要quesiton是:我怎樣才能等到SHRINKFILE完成? 例如,我可以從我的C#代碼查詢發送,並在這個查詢的結果中,我會得到SHRINKFILE操作是否被清除的信息?
你知道,這既碎片你的數據庫和打破日誌鏈,對吧?這不是你應該*自動化的東西,因爲1)你永遠不應該*自動縮小數據庫,2)在你完成下一次完整備份之前,你的數據庫恢復能力處於危險之中。您應該只能手動執行此操作,並且在例外情況下親自關注它,直到完成爲止。否則,你會招致許多問題,其中一些是災難性的。 – RBarryYoung
我同意;這就是爲什麼我需要阻止所有更改數據庫的同時收縮,例如添加刪除條目備份等。問題是這是我們的客戶需求,他們需要硬盤上未使用的空間我必須這樣做。 –
對我來說也夠了,當這個過程結束,只是不知道一個進度條,所有我需要知道什麼時候SHRINKFILE操作是在例如SQL語句的處理結束SPID不再可用,我可以集中,從C# –