MS SQL Server:DBCC ShrinkDatabase - 它真的不會將數據庫縮小到最小大小以下嗎?
根據 Microsoft 關於DBCC ShrinkDatabase命令的文件,它不應將數據庫縮小到其“最小大小”以下。
但是當我執行命令時,我的數據庫數據文件的初始文件大小縮小到更小的大小。雖然我認為初始文件大小是“最小大小”。還是我誤解了微軟的措辭/意圖,DBCC ShrinkDatabase 被認為是“改變大小的操作”?
數據庫不能小於數據庫的最小大小。最小大小是最初創建數據庫時指定的大小,或者是使用文件大小更改操作(例如 DBCC SHRINKFILE)設置的最後一個顯式大小。例如,如果最初創建的數據庫大小為 10 MB,然後增長到 100 MB,那麼即使數據庫中的所有數據都已刪除,該數據庫可以減小到的最小大小為 10 MB。
即當微軟說“數據庫不能小於數據庫的最小大小”時,這是一個重言式,我只是想多了?
- 你不應該使用
DBCC SHRINKDATABASE
. 縮小文件是一個非常特殊的事件,應該非常謹慎地使用,即使那樣,也只能使用針對單個文件的精心計劃的命令(DBCC SHRINKFILE
是SHRINKDATABASE
的友好,不那麼瘋狂的表親。)有關此問題的大量建議,請參閱這篇文章。通常縮小文件只是一種非常臨時的措施,而且完全是浪費精力,因為文件會再次增長。 2. 最小尺寸和初始尺寸是不同的東西,並且被
SHRINKFILE
和區別對待SHRINKDATABASE
。SHRINKDATABASE
絕對不會讓您低於初始文件大小,無論您是明確設置它們還是繼承自model
- 如果您看到這種情況發生,請出示完整的複製品,因為我無法做到這一點。我創建了與下面相同的 4GB 文件,嘗試了SHRINKDATABASE
99% 的目標,但它沒有讓步。我的猜測是你得到它低於目前大小,但這不是初始大小。
SHRINKFILE
會讓你低於初始大小。這裡我們創建一個 4GB 的數據文件,然後嘗試將其縮小到 1MB。CREATE DATABASE floo ON ( name = floo_data, SIZE = 4096MB, filename = 'C:\...\floo.mdf' ) LOG ON ( name = floo_log, SIZE = 1024MB, filename = 'C:\...\floo.ldf' ); GO USE floo; GO SELECT name,[size_on_disk] = size*8. FROM sys.database_files; GO DBCC SHRINKFILE(floo_data, 1); GO SELECT name,[size_on_disk] = size*8. FROM sys.database_files; GO
結果顯示我們還沒有達到 1MB,但我們遠遠低於我們的初始大小和模型中設置的大小(在大多數現代系統中為 8MB):
一個操作使文件小於
model
(在我的系統上為 8MB),這是人們可能期望的最小或初始大小,具體取決於數據庫的創建方式(有或沒有明確指定文件大小)。繼承文件大小
model
也允許我將文件縮小到初始大小以下(在這種情況下應該是最小值的兩倍):CREATE DATABASE blar; -- inherit file specs from model GO USE blar; GO SELECT name,[size_on_disk] = size*8. FROM sys.database_files; GO DBCC SHRINKFILE(blar, 1); GO SELECT name,[size_on_disk] = size*8. FROM sys.database_files; GO
結果再次表明我們可以低於“最小”大小和初始大小:
我再次強烈建議您真正研究一下您是否真的應該縮小這些文件。這真的應該是一個非常特殊的事件。
有關分析 tempdb 數據/日誌增長原因的更多資訊: