收缩没有活动服务器的事务日志

时间:2018-10-12 08:52:26

标签: sql-server

目前,我有几个不再处于活动状态的数据库(没有新条目),但是我的公司不想删除该数据库,因为他们希望保留该数据库以供参考。

但是由于数据库巨大,我很难备份和还原。 (公司政策,必须不时备份和还原以测试数据库是否可行)。

所以我在想,我想缩小事务日志以减少处理所需的时间,这样做是否明智?强调,因为没有新条目。

仅供参考,事务文件(ldf)比实际数据库大小(mdf)大得多。

无论是建议还是不建议,甚至有更好的方法,请告诉我。

2 个答案:

答案 0 :(得分:0)

我使用此脚本

DECLARE @DBName varchar(255)
DECLARE @LogName varchar(255)
DECLARE @DATABASES_Fetch int
DECLARE DATABASES_CURSOR CURSOR FOR
    select distinct
        name, db_name(s_mf.database_id) dbName 
    from
        sys.master_files s_mf
    where
        s_mf.state = 0 and -- ONLINE
        has_dbaccess(db_name(s_mf.database_id)) = 1 -- Only look at databases to which we have access
    and db_name(s_mf.database_id) not in ('master','tempdb','model','msdb','distribution')
    and db_name(s_mf.database_id) not like 'MSDB%'
    and db_name(s_mf.database_id) not like 'Report%'
    and type=1
    order by 
        db_name(s_mf.database_id)
OPEN DATABASES_CURSOR
FETCH NEXT FROM DATABASES_CURSOR INTO @LogName, @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
 exec ('USE [' + @DBName + '] ; DBCC SHRINKFILE (N''' + @LogName + ''' , 0, TRUNCATEONLY)')
 FETCH NEXT FROM DATABASES_CURSOR INTO @LogName, @DBName
END
CLOSE DATABASES_CURSOR
DEALLOCATE DATABASES_CURSOR

答案 1 :(得分:0)

是的,这是个好主意。最简单的方法是先将“恢复模型”更改为“简单”,如下所示:

enter image description here

然后您可以使用任务;收缩;将事务日志空间减少到零的文件。有很多资源可以向您展示如何缩小文件,但是本文对它进行了很好的解释:

How to shrink the transaction log

通常不建议收缩文件,但是如果您不希望进行更多事务,则建议这样做。这样可以节省您的备份时间,并占用更少的磁盘空间。