我有点困惑。SQL 2012 中的参数是否已TRUNCATEONLY
更改,或者 SQL 2008 R2 中的文档是否错误?
2008 R2
将文件末尾的所有可用空间释放给操作系统,但不执行文件内的任何页面移动。数据文件仅收缩到最后分配的范围。如果使用 TRUNCATEONLY 指定,则忽略 target_percent。
TRUNCATEONLY 仅适用于数据文件。日志文件不受影响。
最后一条语句让我觉得这对日志文件根本没有影响?
2012
将文件末尾的所有可用空间释放给操作系统,但不执行文件内的任何页面移动。数据文件仅收缩到最后分配的范围。如果使用 TRUNCATEONLY 指定,则忽略 target_percent。
TRUNCATEONLY 影响日志文件。要仅截断数据文件,请使用 DBCC SHRINKFILE。
最后一条语句现在告诉我它只影响日志文件?
那么功能是否发生了变化,或者文档中是否存在错误,或者我的解释是否错误?
TRUNCATEONLY 影响 2008 年的 LOG 和 DATA 文件。在 SQL Server 2012 的 BOL 上,该消息仅表明如果您只想收缩数据库文件,那么您应该使用 DBCC SHRINKFILE,它允许您收缩数据或日志文件。
对于 2008 年,明确指出 TRUNCATEONLY 仅影响 DATA 文件。
让我们测试一下。为了可视化使用
TRUNCATEONLY
with会发生什么,下面是我在本地安装SHRINKDATABASE
的名为数据库的情况的简要说明。performance
我
DBCC LOGINFO
只是为了在事务日志中取一个峰值,发现大约 200 之后的所有虚拟日志文件都处于非活动状态,状态 = 0。在我的性能数据库中,所有那些不活动的 VLF 都可以被截断,并且可以将空间还给操作系统。这是 LOGINFO 的一些示例输出。
然后我运行
DBCC SQLPERF(LOGSPACE)
并得到以下输出然后我跑了
并得到以下结果
接下来,我重新运行
并得到
SHRINKDATABASE
TRUNCATEONLY
将事务日志文件中超过9 GB的可用空间返还给操作系统。我用另一个名为的数据库尝试了相同的实验
performance2
这将20 MB还给了操作系统。使用 SQL Server 2008,
SHRINKDATABASE TRUNCATEONLY
收缩数据和事务日志文件。我刚刚使用临时数据库进行了测试,并且使用 TRUNCATEONLY 选项导致数据文件和日志文件都被缩小。
我相信他们试图澄清的是 TRUNCATEONLY 选项会在收缩数据文件时改变行为(即不重新排列任何数据页,只是在最后切掉未使用的空间),但日志文件仍然是正常收缩。
如果我对该选项的理解是正确的,那么这可能是描述它的更好方式: