收缩
收缩数据文件通过将数据页从文件末尾移动到更靠近文件开头的未占用的空间来恢复空间。 在文件末尾创建足够的可用空间后,可以取消对文件末尾的数据页的分配并将它们返回给文件系统。
限制和局限
1 收缩后的数据库不能小于数据库的最小大小。 最小大小是在数据库最初创建时指定的大小,或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)设置的显式大小。 例如,如果数据库最初创建时的大小为 10 MB,后来增长到 100 MB,则该数据库最小只能收缩到 10 MB,即使已经删除数据库的所有数据也是如此。2 不能在备份数据库时收缩数据库。 反之,也不能在数据库执行收缩操作时备份数据库。
3 遇到 xVelocity 内存优化的列存储索引时,DBCC SHRINKDATABASE 将会失败。 遇到 columnstore 索引之前完成的工作将会成功,因此数据库可能会较小。 若要完成 DBCC SHRINKDATABASE,请在执行 DBCC SHRINKDATABASE 前禁用所有列存储索引,然后重新生成列存储索引。
建议
1 若要查看数据库中当前的可用(未分配)空间量。 有关详细信息,请参阅显示数据库的数据和日志空间信息(https://msdn.microsoft.com/zh-cn/library/ms190674.aspx)。2 当您计划收缩数据库时,请考虑以下信息:
2.1 在执行会产生许多未使用空间的操作(如截断表或删除表操作)后,执行收缩操作最有效。
2.2 大多数数据库都需要一些可用空间,以供常规日常操作使用。 如果反复收缩数据库并注意到数据库大小变大,则表明收缩的空间是常规操作所必需的。 在这种情况下,反复收 缩数据库是一种无谓的操作。
2.3 收缩操作不会保留数据库中索引的碎片状态,通常还会在一定程度上增加碎片。 这是不要反复收缩数据库的另一个原因。
除非有特定要求,否则不要将 AUTO_SHRINK 数据库选项设置为 ON。
日志文件收缩
1. 截断日志
当数据库的恢复模式为“简单”的时候,日志文件会在以下情况被截断:
(1)完整备份
(2)遇到检查点(checkpoint)
2. 手动收缩日志文件
当日志被截断后,日志文件的内部空间就会标记为“可复用”,因此日志文件就不需要持续增长。在此不详细
二、完整恢复模式日志收缩
在完整恢复模式下,对数据进行完整备份或者遇到检查点,都不会对日志造成影响。因此,可能会导致日志文件不能被截断,也就是说,这些空间不能被循环使用。于是,日志文件将持续增长,甚至直逼硬盘空间的极限。此时,即使手动收缩日志文件,也不会减小文件空间,因为空间都被占用着。
备注:大容量日志恢复模式与完整恢复模式的日志处理方法一致。
1. 确认恢复模式
以下是使用SQL Server Management Studio检查数据库的恢复模式
2. 完整备份
日志备份之前,必须做过完整备份。
备注:不要勾选“仅复制备份”选项。“仅复制备份”不会影响日志。
3. 事务日志备份
做过完整备份之后,可以随时进行事务日志备份。
默认的选项,是备份后截断事务日志。
注意:有很多情况会阻止日志截断,没有备份事务日志只是其中一种情况,也是最常见的情况。
4. 手动收缩日志文件
做过日志备份之后,日志被截断,大量空间被标记为“可复用”。一般情况下,这时候就可以进行“收缩文件”操作,以将“可复用”的空间从日志文件中移出,从而减小日志文件。
三、其他非官方的操作方法
1、临时改用简单恢复模式
临时改为简单恢复模式,然后做一次完整备份,或者运行checkpoint执行检查点。当日志被截断后,再收缩日志文件,最后再改回完整恢复模式。
注意:改回完整恢复模式后,请务必再做事务日志备份。
2、with no_log选项
在旧版本里,可以使用 BACKUP LOG WITH NO_LOG,或者 WITH TRUNCATE_ONLY。但SQL Server 2008 已经删除这些选项。
下面以SQL Server2005为例
Step1
--[DBName]是指要收缩哪个DB的LDF文件,先执行上面两行,得到[logname]了,再替换下面两行并执行。
use [DBName];
select name from sysfiles where groupid=0; --- 此处得到的name就是下面[LogName]处需要替换的内容。
Step2
backup log [DBName] with truncate_only;
DBCC ShrinkFile ([LogName]);
--note:黄色部分为需要替换的部分。
再查询select name,* from sysfiles where groupid=0;
发现 size列的数据已经变小了,说明 ldf文件被收缩了。
3、分离后再附加
分离这个数据库,然后删除日志文件。然后重新附加这个数据库,SQL Server 就会警告丢失了日志文件,如果忽略这个警告,系统会自动创建一个空的日志文件。
数据文件收缩
--首先看看数据文件还有多少空余空间可以进行收缩。
USE [DatabaseName];
SELECT name ,size*1.0/128, size*1.0/128 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.sysfiles;
--如果上述结果发现有空间可以,可以进行收缩。
--收缩某一数据文件到指定大小
--The following example shrinks the size of a data file named DataFile1 in the UserDB user database to 7 MB.
DBCC SHRINKFILE (DataFile1, 7);
以translog数据库为例:
USE translog;
SELECT name ,size*1.0/128, size*1.0/128 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.sysfiles;
以上结果,发现translog的数据文件只有0.125M的空余可用空间,因此不需要收缩。(translog_log为日志文件,知悉。)
以PerfmonDB为例
DBCC SHRINKFILE(PerfmonDB, 22);
以上,PerfmonDB的数据文件,从23MB收缩到了22MB。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26435490/viewspace-1425011/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26435490/viewspace-1425011/