Sql-Server

僅將數據庫收縮到創建數據庫後設置的初始大小

  • January 23, 2018

在 SQL Server 中,每個數據庫都有一個屬性Initial Size (MB),可以在 SSMS 中的數據庫屬性中看到。預設情況下,mdf 為 3 MB,ldf 文件為 1 MB。

所以現在如果創建一個新數據庫,那麼它將被設置為預設大小(即 mdf 為 3 MB,ldf 文件為 1 mb)。但是在創建數據庫後,我將初始大小更改為其他值,例如對於 mdf 10 MB 和 ldf 5 MB。(實時某些數據庫管理員可能希望在創建數據庫後更改初始值)

但是現在如果縮小數據庫,它將縮小到我在創建後設置的初始大小(考慮數據庫中沒有數據,否則它將縮小到其實際內容大小)。它將縮小到創建數據庫期間的初始大小(即 mdf 為 3mb,ldf 為 1mb)。我希望縮小到我設置的初始大小(即 mdf 為 10 mb,ldf 為 5mb)。有可能做到嗎?如果可能,那怎麼辦?

在某些文章中,我看到 dbcc SHRINKFILE 可用於縮小超出初始大小,而 dbcc SHRINKDATABASE 不能縮小超出初始大小。但我只想縮小到我設置的初始大小。

注意:我知道收縮是不好的,不應該做。但我想知道怎麼做?如果 sql server 只考慮創建數據庫時設置的初始大小,那麼在創建數據庫後設置初始大小有什麼用?

編輯:

來自微軟收縮相關文章:使用 DBCC SHRINKDATABASE 您不能將數據庫收縮到其初始大小以下。

我的問題是我可以更改現有數據庫本身的初始大小嗎?

編輯:

我有大約 5 個 sql server 實例。所有創建的數據庫預設大小為 3 mb 的數據和 1 mb 的日誌(大約 3 年前)。現在所有的數據庫都在 100-1000 mb 的範圍內。我不會正常收縮數據庫,因為這不是一個好習慣。但是一些數據庫增長超過 10 GB(mdf 文件本身,因為我在其中插入了這麼多數據)。因此,當數據庫很大時,我會將不重要的舊內容從該數據庫轉移到另一台伺服器,因為該伺服器不需要我。因此,數據庫大小從 10 GB 減少到 1 GB。現在剩餘的 9 Gb 未使用。現在我想指定數據庫大小減少到 2 GB,這樣我將獲得 1 GB 可用空間(2 Gb 也是這個數據庫的理想大小),這可以用來避免自動增長,直到下一個 1 Gb 數據被填充. 我還為這種具有更多寫入的大型數據庫設置了 100 MB 的自動增長。因此,與其在 shrinkfile 命令中將大小指定為 2 GB,不如將初始大小更改為 2 GB(shrink 考慮),那麼它會更好。在這個數據庫創建期間,沒有關於大小、autogroth 等的計劃。因為它是在大約 3 年前創建的。現在我打算設置自動增長等。我不能再次使用新的初始大小和移位數據創建新數據庫。所以我問我是否可以更改現有數據庫的初始大小?因為它是大約 3 年前創建的。現在我打算設置自動增長等。我不能再次使用新的初始大小和移位數據創建新數據庫。所以我問我是否可以更改現有數據庫的初始大小?因為它是大約 3 年前創建的。現在我打算設置自動增長等。我不能再次使用新的初始大小和移位數據創建新數據庫。所以我問我是否可以更改現有數據庫的初始大小?

初始大小不僅僅是 3MB,它取自模型數據庫(如果在創建使用者數據庫期間未指定)。因此假設您在創建使用者數據庫期間沒有指定初始大小並且您沒有更改創建使用者數據庫後的模型數據庫文件大小,您可以執行以下操作:

--Create testDB
CREATE DATABASE [TEST_100]
GO


--grow your database file size
ALTER DATABASE [Test] MODIFY FILE ( NAME = N'Test', SIZE = 100MB )
GO


--switch context
USE [TEST_100]
GO



--Find size of modelDB mdf file, this is your initial file size used for the userdb
DECLARE @TargetFileSize int

SELECT  @TargetFileSize = (size * 8 / 1024)
FROM    sys.master_files 
WHERE   database_id = 3 --model database
AND     file_id= 1 --first file is mdf, assuming you have a model with just one mdf. If you have multiple files, change for the one you need to find.


--shrink the the first file of your current database to the target size that you just found.
DBCC SHRINKFILE (1,@TargetFileSize)

編輯

好的,在您的編輯和評論之後需要一些額外的資訊。

首先。我覺得您在 SSMS 中查看文件屬性時看到的“初始大小”標籤是用詞不當。基本上,您的初始尺寸只是一個概念。它是創建數據庫期間使用的第一個大小。您可以在CREATE DATABASE語句中顯式指定它,也可以通過在創建期間省略該資訊讓 SQL Server 從模型數據庫中隱式複制它。

但是,一旦創建了數據庫,從 DBA 的角度來看,就沒有“初始大小”之類的東西,只有一個屬性對 DBA 可見,那就是:實際大小。甚至 SSMS 中的“初始大小”屬性也只顯示實際大小,而不是初始大小。

那麼怎麼來DBCC SHRINKFILEDBCC SHRINKDATABASE“知道”初始大小呢?即使你改變了大小。有趣的問題。

數據庫文件的第一頁是文件頭頁。在那裡,您有 2 個屬性:size 和 minsize。

在創建文件時,兩個文件頭屬性都填充了初始值:

DBCC TRACEON(3604)
--parameters for DBCC PAGE: (Dbname, fileID, pageID, outputTypeID)
DBCC PAGE('Test_100',1,0,3)with tableresults

在此處輸入圖像描述

兩種大小都以數據頁的數量計。在這種情況下。288 個數據頁。

現在,如果我更改文件大小:

ALTER DATABASE [test_100] MODIFY FILE ( NAME = N'test', SIZE = 50MB )

在此處輸入圖像描述

您可以看到“大小”屬性已更改以反映新大小。但是,“MinSize”屬性仍包含“初始”大小。這是收縮命令將達到的最小尺寸。

不過,說了這麼多。我仍然不明白為什麼要通過首先更改初始大小然後縮小到初始大小來使事情複雜化。而不是直接縮小到目標大小。

無論如何,回答你的問題。“初始”大小不作為屬性公開給使用者/dba。

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