收缩数据库

作者:leen 来源:ITPOW 日期:2005-10-31

就如同图书馆定期要整理书架一样,数据库也需要收缩。本文先从SQL Server数据库收缩的方法谈起,进而谈谈如何利用T-SQL收缩数据库,自动收缩数据库不在本讨论之例。

一、数据库收缩可以分为数据文件收缩和日志文件收缩。

数据文件收缩比较好理解。SQL Server会要求你给出收缩后的可用空间大小,然后将此可用空间大小加上数据大小。如果所得值大于现在的文件大小,那么文件将不会被收缩;否则SQL Server将进行数据移动,重新组织数据,就像磁盘碎片整理一样腾出连续的空间。

日志文件的收缩比较麻烦些,我们从先两个概念入手就非常好理解了。
虚拟日志:每个事务日志文件都被逻辑地分成较小的段,这些段称为虚拟日志。虚拟日志是事务日志的截断单位,也就是说收缩时只能是收缩虚拟日志大小的整数倍,不能说“收缩了8.5个虚拟日志大小”。虚拟日志的最小大小为256KB。
最小恢复日志序号 (MinLSN) :日志中有一部分是不能被截断的,因为这些日志在数据库还原时必不可少,这些日志叫做活动日志活动日志的起始点叫做最小恢复日志序号。MinLSN以前的日志是不是可以随时被截断呢?当故障还原模型为简单时,这个答案是“是”;但如果故障还原模型为另外两种(完全和大容量日志记录),则MinLSN必须保留一定的事务日志量,为什么呢,我们知道完全还原模型和大容量日志记录还原模型的目的就是要使数据库可以还原到故障点,如果这些日志被删除了,就无法回滚,也就无法准确地还原到故障点了。

收缩事务日志.JPG

以上图片内容摘自 Microsoft SQL Server 联机丛书。

二、下面谈谈数据库收缩的相关命令


DBCC SHRINKDATABASE
    ( database_name [ , target_percent ]
        [ , { NOTRUNCATE | TRUNCATEONLY } ]
    )

第一个参数表要收缩的数据库名称。
第二个参数表收缩后的数据库文件中所要的剩余可用空间百分比,比如 10 表示收缩后可用空间要有现在数据文件的 10% 那么大。
NOTRUNCATE 指定此参数表示收缩后,所释放的空间仍属于数据库文件,数据库文件大小不变。如果没有指定,那么所释放的空间就被“切”下来给操作系统,数据库文件减少。
TRUNCATEONLY 仅仅将未使用的空间释放给操作系统,而不作数据移动操作,此时 target_percent 被忽略。
如果省略第三个参数,等价于先将空间“腾”出来,再将其释放给操作系统。
注意,收缩后的数据库不能比 model 数据库更小,也不能小于文件的最小大小,文件的最小大小是在数据库创立之初指定的大小或上一次显示设置的文件大小。

DBCC SHRINKDB
DBCC SHRINKDB 和 DBCC SHRINKDATABASE 英文意思一样,只是这个使用了缩写,它又是什么意思呢?它返回数据库可收缩到的最小值,或将指定数据库的大小收缩到指定值。属于 SQL Server 6.x 中的内容,SQL Server 2000 中已经不存在,所以 SQL Server 2000 用户可以不予理会。

DBCC SHRINKDATABASE 是收缩特定数据库的所有数据和日志文件。
那么收缩特定数据库中一个文件的命令是什么呢? DBCC SHRINKFILE

DBCC SHRINKFILE
    ( { file_name | file_id }
        { [ , target_size ]
            | [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ]
        }
    )

第一个参数即可以输入收缩文件的逻辑名称,也可以收缩文件ID。
第二个参数表示所期望的文件大小,单位兆字节,注意是整数,如果没有指定,则表示文件的默认大小。
EMPTYFILE 将这个文件中的内容移动到同一文件组中的其它文件,即“合并文件”。
NOTRUNCATE、TRUNCATEONLY 和 DBCC SHRINKDATABASE 中同义。

收缩数据库后,我们会得到一个结果表
DbId 数据库标识号,即(试图)收缩的数据库ID。
FileId 文件标识号,即(试图)收缩的文件ID。
CurrentSize 文件当前占用的 8KB 页数。
MinimumSize 文件可以占用的最小 8KB 页数。这与文件的最小大小或最初创建时的大小相对应。
UsedPages 文件当前使用的 8KB 页数.
EstimatedPages SQL Server 估计文件能够收缩到的 8KB 页数。

相关文章