Sql-Server

MS SQL Server:DBCC ShrinkDatabase - 它真的不會將數據庫縮小到最小大小以下嗎?

  • June 25, 2018

根據 Microsoft 關於DBCC ShrinkDatabase命令的文件,它不應將數據庫縮小到其“最小大小”以下。

但是當我執行命令時,我的數據庫數據文件的初始文件大小縮小到更小的大小。雖然我認為初始文件大小是“最小大小”。還是我誤解了微軟的措辭/意圖,DBCC ShrinkDatabase 被認為是“改變大小的操作”?

縮小數據庫

數據庫不能小於數據庫的最小大小。最小大小是最初創建數據庫時指定的大小,或者是使用文件大小更改操作(例如 DBCC SHRINKFILE)設置的最後一個顯式大小。例如,如果最初創建的數據庫大小為 10 MB,然後增長到 100 MB,那麼即使數據庫中的所有數據都已刪除,該數據庫可以減小到的最小大小為 10 MB。

即當微軟說“數據庫不能小於數據庫的最小大小”時,這是一個重言式,我只是想多了?

  1. 你不應該使用DBCC SHRINKDATABASE. 縮小文件是一個非常特殊的事件,應該非常謹慎地使用,即使那樣,也只能使用針對單個文件的精心計劃的命令(DBCC SHRINKFILESHRINKDATABASE的友好,不那麼瘋狂的表親。)

有關此問題的大量建議,請參閱這篇文章。通常縮小文件只是一種非常臨時的措施,而且完全是浪費精力,因為文件會再次增長。 2. 最小尺寸和初始尺寸是不同的東西,並且被SHRINKFILE和區別對待SHRINKDATABASESHRINKDATABASE絕對不會讓您低於初始文件大小,無論您是明確設置它們還是繼承自model- 如果您看到這種情況發生,請出示完整的複製品,因為我無法做到這一點。我創建了與下面相同的 4GB 文件,嘗試了SHRINKDATABASE99% 的目標,但它沒有讓步。我的猜測是你得到它低於目前大小,但這不是初始大小。

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 數據/日誌增長原因的更多資訊:

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