有一个大表,删除了其中很多记录,用sp_mstablespace看,从5G到2G了。但是整个数据库的mdf文件没有变小,用了shrink也没有发现mdf变小,请各位大侠帮忙看看,谢过!

解决方案 »

  1.   

    DBCC SHRINKFILE
    收缩相关数据库的指定数据文件或日志文件大小。语法
    DBCC SHRINKFILE
        ( { file_name | file_id }
            { [ , target_size ]
                | [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ] 
            }
        )参数
    file_name是已收缩文件的逻辑名称。文件名必须符合标识符的规则。有关更多信息,请参见使用标识符。 file_id是要收缩的文件的标识 (ID) 号。若要获得文件 ID,请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles。target_size是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,DBCC SHRINKFILE 将文件大小减少到默认文件大小。如果指定 target_size,DBCC SHRINKFILE 将试图将文件收缩到指定大小。将要释放的文件部分中的已使用页将重新定位到保留的文件部分中的可用空间。例如,如果数据文件为 10MB,则带有 target_size 为 8 的 DBCC SHRINKFILE 将导致文件最后 2 MB 中所有已用页重新分配到文件前 8 MB 中的任何可用槽中。DBCC SHRINKFILE 不会将文件收缩到小于存储文件中的数据所需要的大小。例如,如果使用 10MB 数据文件中的7 MB,带有 target_size 为 6 的 DBCC SHRINKFILE 语句只能将该文件收缩到 7 MB,而不能收缩到 6 MB。EMPTYFILE将所有数据从指定文件中迁移到同一文件组中的其它文件。Microsoft® SQL Server™ 不再允许将数据放在用于 EMPTYFILE 选项的文件上。该选项允许使用 ALTER DATABASE 语句除去文件。NOTRUNCATE导致将释放的文件空间保留在文件中。当与 target_size 一起指定 NOTRUNCATE 时,释放的空间不会释放给操作系统。DBCC SHRINKFILE 的唯一影响是将已使用的页从 target_size 行上面重新定位到文件的前面。当未指定 NOTRUNCATE 时,所有释放的文件空间返回给操作系统。TRUNCATEONLY导致文件中的任何未使用的空间释放给操作系统,并将文件收缩到上一次分配的大小,从而减少文件大小,而不移动任何数据。不尝试将行重新定位到未分配页。如果使用 TRUNCATEONLY,将忽略 target_size。注释
    DBCC SHRINKFILE 适用于当前数据库中的文件。将上下文切换到数据库,以发出引用该特定数据库中文件的 DBCC SHRINKFILE 语句。有关更改当前数据库的更多信息,请参见 USE。 所生成的数据库不能比 model 数据库更小。使用 DBCC SHRINKFILE 以将文件减小到比其最初创建时更小。之后,文件的最小大小重置为新指定的大小。若要删除在文件中可能出现的任何数据,请在执行ALTER DATABASE 之前执行 DBCC SHRINKFILE('file_name', EMPTYFILE)。要收缩的数据库不必在单用户模式下;收缩文件时,同时其他用户可以在数据库中工作。不必在单用户模式下运行 SQL Server 以对系统数据库进行收缩。对于日志文件,SQL Server 使用 target_size 以计算整个日志的目标大小;因此,target_size 是收缩操作完成后日志中的可用空间大小。之后,整个日志的目标大小可以解释为每个日志文件的目标大小。DBCC SHRINKFILE 尝试立即将每个物理日志文件收缩至其目标大小。如果虚拟日志中的所有逻辑日志部分都没有超出日志文件的目标大小,该文件将成功截断,DBCC SHRINKFILE 完成且不显示任何消息。然而,如果虚拟日志中的逻辑日志部分超出目标大小,则 SQL Server 释放尽可能多的空间并发出一条消息。该信息告诉您需要执行什么操作来移动文件末尾超出虚拟日志的逻辑日志部分。执行完该操作后,可以重新发出 DBCC SHRINKFILE 命令以释放剩余的空间。有关收缩事务日志的更多信息,请参见收缩事务日志。因为日志文件只能收缩到虚拟日志文件边界,所以不可能将日志文件收缩到比虚拟日志文件更小(即使现在没有使用该文件)。例如,可以将数据库的 1 GB 日志文件收缩到只有 128 MB。有关截断的更多信息,请参见截断事务日志。有关确定虚拟日志文件大小的更多信息,请参见虚拟日志文件。 结果集
    下表描述结果集内的列。列名 描述 
    DbId SQL Server 试图收缩的文件的数据库标识号。 
    FileId SQL Server 试图收缩的文件的文件标识号。 
    CurrentSize 文件当前占用的 8KB 页数。 
    MinimumSize 文件可以占用的最小 8KB 页数。这与文件的最小大小或最初创建时的大小相对应。 
    UsedPages 文件当前使用的 8KB 页数。 
    EstimatedPages SQL Server 估计文件能够收缩到的 8KB 页数。 
    权限
    DBCC SHRINKFILE 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。示例
    下例将 UserDB 用户数据库中名为 DataFil1 的文件收缩到 7 MB。USE UserDB
    GO
    DBCC SHRINKFILE (DataFil1, 7)
    GO
      

  2.   

    ldf我定时做备份,不会特别大的。收缩文件会有什么影响吗?这个数据库是一个ERP数据库,很多用户联在上面。shrink database和shrink file有什么区别吗?操作的时候应该注意些什么?谢谢
      

  3.   

    特定数据库的所有数据和日志文件。执行 DBCC SHRINKDATABASE。
    一次一个特定数据库中的数据或日志文件。执行 DBCC SHRINKFILE。