假設你創建一個資料庫時,指定其初始化大小(SIZE )非常大。例如,如下測試案例所示 USE [master]GO CREATE DATABASE [TEST] ON PRIMARY ( NAME = N'TEST_Data', FILENAME = N'D:\SQL_DATA\TEST_Data.... ...
假設你創建一個資料庫時,指定其初始化大小(SIZE )非常大。例如,如下測試案例所示
USE [master]
GO
CREATE DATABASE [TEST] ON PRIMARY
( NAME = N'TEST_Data', FILENAME = N'D:\SQL_DATA\TEST_Data.mdf' , SIZE = 11527027KB , MAXSIZE = UNLIMITED, FILEGROWTH = 102400KB )
LOG ON
( NAME = N'TEST_log', FILENAME = N'D:\SQL_LOG\TEST_log.ldf' , SIZE = 40350KB , MAXSIZE = 2048GB , FILEGROWTH = 32768KB )
GO
此時我們檢查資料庫的空間使用情況如下所示:
USE TEST;
GO
EXEC SP_SPACEUSED;
然後你使用DBCC SHRINKDATABASE去收縮資料庫時,就會遇到“DBCC SHRINKDATABASE: xxx was skipped because the file does not have enough free space to reclaim”這樣的錯誤。
USE TEST;
GO
DBCC SHRINKDATABASE('TEST', 5);
DBCC SHRINKDATABASE: File ID 1 of database ID 8 was skipped because the file does not have enough free space to reclaim.
DBCC SHRINKDATABASE: File ID 2 of database ID 8 was skipped because the file does not have enough free space to reclaim.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
是不是有點納悶,明明資料庫有大量空閑空間,但是提示“DBCC SHRINKDATABASE: File ID 1 of database ID 8 was skipped because the file does not have enough free space to reclaim" 沒有足夠剩餘空間回收。我們先用DBCC SHRINKFILE將資料庫的數據文件收縮一下,如下所示
USE TEST;
GO
DBCC SHRINKFILE('TEST_Data', 20);
如上所示,DBCC SHRINKFILE可以收縮資料庫文件,但是DBCC SHRINKDATABASE為什麼不行呢?
DBCC SHRINKDATABASE ( database_name | database_id | 0 [ , target_percent ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ) [ WITH NO_INFOMSGS ]
這個是因為DBCC SHRINKDATABASE是數據文件/日誌對象的百分比來收縮資料庫,並且這個收縮後的值不能小於數據文件/日誌文件的最小大小(minimum file size). 但是DBCC SHRINKFILE收縮時,可以小於數據文件/日誌文件的minimum file size。官方文檔介紹如下:
收縮後的資料庫不能小於資料庫的最小大小。 最小大小是在資料庫最初創建時指定的大小,或是使用文件大小更改操作(如 DBCC SHRINKFILE 或 ALTER DATABASE)顯式設置的最後大小。 例如,如果資料庫最初創建時的大小為 10 MB,後來增長到 100 MB,則該資料庫最小隻能收縮到 10 MB,即使已經刪除資料庫的所有數據也是如此。
所以上面DBCC SHRINKDATABASE命令不能收縮資料庫,因為上圖的Mimimum Size和 CurrentSize大小相同。而使用DBCC SHRINKFILE可以收縮資料庫文件.
參考資料:
https://msdn.microsoft.com/zh-cn/library/ms190488.aspx