收缩SQL Server 数据库的几种方法

时间:2023-01-01 08:50:02

方法一:

Use 数据库名

Select NAME,size From sys.database_files

ALTER DATABASE 数据库名 SET RECOVERY SIMPLE WITH NO_WAIT

ALTER DATABASE 数据库名 SET RECOVERY SIMPLE

USE 数据库名

DBCC SHRINKFILE(N’日志文件名’,0,TRUNCATEONLY)

ALTER DATABASE 数据库名 SET RECOVERY FULL WITH NO_WAIT

ALTER DATABASE 数据库名 SET RECOVERY FULL

方法二:

backup log [你的数据库名称] WITH NO_LOG
backup log [你的数据库名称] WITH TRUNCATE_ONLY
DBCC SHRINKDATABASE([你的数据库名称])

说明:

backup log 指定仅备份事务日志。该日志是从上一次成功执行的 LOG 备份到当前日志的末尾。备份日志之后,可能会截断事务复制或活动事务不再需要的空间。

NO_LOG | TRUNCATE_ONLY

通过放弃活动日志以外的所有日志,无需备份复制日志即可删除不活动的日志部分,并截断日志。该选项会释放空间。因为并不保存日志备份,所以没有必要指定备份设备。NO_LOG 和 TRUNCATE_ONLY 是同义的。

这里有个问题,什么是活动日志,微软的解释是:

日志文件中从必须存在以确保数据库范围内成功回滚的第一条日志记录到最后写入的日志记录之间的部分称为日志的活动部分,即“活动日志”。这是进行数据库完整恢复所需的日志部分。永远不能截断活动日志的任何部分。

DBCC SHRINKDATABASE 收缩特定数据库的所有数据和日志文件,这个是最简单的方法了,也可以使用。

不过有个问题是:

在一些对数据安全性要求不高,或者备份频率很高的情况下,使用直接截断日志的方法不如使用 简单恢复模式。微软说:在简单恢复模式下,在每个数据备份后事务日志将自动截断,也就是说,不活动的日志将被删除。因为经常会发生日志截断,所以没有事务日志备份。这简化了备份和还原。但是,没有事务日志备份,便不可能恢复到失败的时间点。

也就是说:如果你不会使用日志来恢复数据(我自己不会用,我使用redgate 定时高频率备份),那么简单模式就是最佳的方案。