DBCC SHRINKFILE (Transact-SQL)

来源:互联网 发布:香港 二线 知乎 编辑:程序博客网 时间:2024/06/05 19:14

DBCC SHRINKFILE (Transact-SQL)

file_name

要收缩的文件的逻辑名称。

file_id

要收缩的文件的标识 (ID) 号。若要获得文件 ID,请使用 FILE_IDEX 系统函数,或查询当前数据库中的 sys.database_files 目录视图。

target_size

用兆字节表示的文件大小(用整数表示)。如果未指定,则 DBCC SHRINKFILE 将文件大小减少到默认文件大小。默认大小为创建文件时指定的大小。

如果指定了 target_size,则 DBCC SHRINKFILE 尝试将文件收缩到指定大小。将要释放的文件部分中的已使用页重新定位到保留的文件部分中的可用空间。例如,如果数据文件为 10 MB,则 target_size 为 8 的 DBCC SHRINKFILE 操作会将文件最后 2 MB 中所有的已使用页重新分配到文件前 8 MB 中的任何未分配页中。DBCC SHRINKFILE 不会将文件收缩到小于存储文件中的数据所需要的大小。例如,如果使用 10 MB 数据文件中的 7 MB,则带有 target_size 为 6 的 DBCC SHRINKFILE 语句只能将该文件收缩到 7 MB,而不能收缩到 6 MB。

EMPTYFILE

将指定文件中的所有数据迁移到同一文件组中的其他文件。由于数据库引擎不再允许将数据放在空文件内,因此可以使用 ALTER DATABASE 语句来删除该文件。

NOTRUNCATE

在指定或不指定 target_percent 的情况下,将已分配的页从数据文件的末尾移动到该文件前面��未分配页。文件末尾的可用空间不会返回给操作系统,文件的物理大小也不会更改。因此,指定 NOTRUNCATE 时,文件看起来未收缩。

NOTRUNCATE 只适用于数据文件。日志文件不受影响。

TRUNCATEONLY

将文件末尾的所有可用空间释放给操作系统,但不在文件内部执行任何页移动。数据文件只收缩到最后分配的区。

如果随 TRUNCATEONLY 指定了 target_size,则会忽略该参数。

TRUNCATEONLY 只适用于数据文件。

WITH NO_INFOMSGS

取消显示所有信息性消息。

DBCC SHRINKFILE 适用于当前数据库中的文件。有关如何更改当前数据库的详细信息,请参阅 USE (Transact-SQL)

可在进程中的任一点停止 DBCC SHRINKFILE 操作,任何已完成的工作都将保留。

当 DBCC SHRINKFILE 操作失败时,将引发错误。

要收缩的数据库不必在单用户模式下;收缩文件时,其他用户也可使用该数据库。不必在单用户模式下运行 SQL Server 实例以对系统数据库进行收缩。

收缩日志文件

最佳做法

故障排除

本部分介绍如何诊断和更正在运行 DBCC SHRINKFILE 命令时可能发生的问题。

文件不收缩

收缩操作被阻塞

基于行版本控制的隔离级别下运行的事务可能会阻塞收缩操作。例如,执行 DBCC SHRINK DATABASE 操作时,如果在基于行版本控制的隔离级别下运行的大型删除操作正在进行中,则收缩操作将等到删除操作完成才会收缩文件。出现这种情况时,DBCC SHRINKFILE 和 DBCC SHRINKDATABASE 操作会在第一个小时每五分钟将信息性消息(对于 SHRINKDATABASE 为 5202,对于 SHRINKFILE 为 5203)输出到 SQL Server 错误日志,之后每一个小时输出一次。例如,如果错误日志包含以下错误消息:

这意味着收缩操作被时间戳早于 109 的快照事务阻塞,它是收缩操作所完成的上一事务。它还说明 sys.dm_tran_active_snapshot_database_transactions 动态管理视图中的 transaction_sequence_numfirst_snapshot_sequence_num 列包含值 15。如果该视图中的 transaction_sequence_numfirst_snapshot_sequence_num 列包含的数字小于收缩操作完成的上一事务 (109),则收缩操作将等待这些事务完成。

若要解决此问题,请执行下列任务之一:

有关 SQL Server 错误日志的详细信息,请参阅查看 SQL Server 错误日志

A. 将数据文件收缩到指定的目标大小

B. 将日志文件收缩到指定的目标大小

C. 截断数据文件

D. 清空文件

原创粉丝点击