仅将数据库收缩到创建数据库后设置的初始大小

IT *_*her 5 sql-server maintenance shrink sql-server-2008-r2

在 SQL Server 中,每个数据库都有一个属性Initial Size (MB),可以在 SSMS 的数据库属性中看到。默认情况下,mdf 文件为 3 MB,ldf 文件为 1 MB。

所以现在如果创建一个新数据库,那么它将被设置为默认大小(即 mdf 为 3 MB,ldf 文件为 1 MB)。但是在创建数据库后,我将初始大小更改为其他一些值,例如 For 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 考虑),那么它会更好。在这个数据库创建期间,没有关于大小、自动增长等的计划。因为它是大约 3 年前创建的。现在我打算设置自动增长等。我不能再次创建具有新初始大小和移位数据的新数据库。所以我问我是否可以更改现有数据库的初始大小?因为它是大约 3 年前创建的。现在我打算设置自动增长等。我不能再次创建具有新初始大小和移位数据的新数据库。所以我问我是否可以更改现有数据库的初始大小?因为它是大约 3 年前创建的。现在我打算设置自动增长等。我不能再次创建具有新初始大小和移位数据的新数据库。所以我问我是否可以更改现有数据库的初始大小?

Edw*_*and 9

初始大小不仅仅是 3MB,它取自模型数据库(如果在创建用户数据库期间未指定。)因此假设您在创建用户数据库期间没有指定初始大小并且您没有更改创建 userdb 后的模型数据库文件大小,您可以执行以下操作:

--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)
Run Code Online (Sandbox Code Playgroud)

编辑

好的,在您的编辑和评论之后需要一些额外的信息。

首先。我觉得您在 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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

两种大小都以数据页的数量为单位。在这种情况下。288 个数据页。

现在,如果我改变文件大小:

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

在此处输入图片说明

您可以看到“size”属性已更改以反映新的大小。但是,“MinSize”属性仍包含“Initial”大小。这是收缩命令将达到的最小尺寸。

不过,说了这么多。我仍然不明白为什么要通过首先更改初始大小然后缩小到初始大小来使事情复杂化。而不是直接缩小到目标大小。

无论如何,回答你的问题。“初始”大小不会作为属性公开给用户/dba。