如何减少日志文件的空间
我们在应用程序开发过程中经常会出现由于要经常插入,删除和更改文件而导致我们的日志文件过大,此时我们就希望能够把减少日志文件所占有的空间.这经常有以下场景:
1.我们的日志对我们进行数据的恢复非常重要,如果我们以后要用它进行对数据进行恢复的话,我们就应该首先对它进行备份.备份过之后日志数据所占有的空间是少了,但是在体现在文件系统上还是在备份以前的大小,这时我们就可以对日志进行收缩,以收回日志所占用的过多空间.
BACKUP DATABASE PUBS
TO DISK=
SP_HELPDB
USE PUBS
DBCC SHRINKFILE(
2,如果我们的日志没有什么用的话,我们一方面可以设计SQL Server的恢复模式为"简单"实现在日志的自动删除
ALTER DATABASE RESEARCH
SET RECOVERY SIMPLE
3.如果我们以前没有注意,现在日志已经很大, 但是日志对我们又没有什么用的话,此时可以使用两种方法来减少日志文件所占有的空间
1.直接删除日志文件
exec sp_helpdb
Name filename
pubs d:\Program Files\Microsoft SQL Server\MSSQL\data\pubs.mdf
pubs_log d:\Program Files\Microsoft SQL Server\MSSQL\data\pubs_log.ldf
EXEC SP_DETACH_DB
EXEC MASTER.DBO.XP_CMDSHELL
EXEC MASTER.DBO.XP_CMDSHELL
THE RESULT IS:
File Not Found
EXEC SP_ATTACH_SINGLE_FILE_DB N
@PHYSNAME=N
SQL SERVER PRINT THE FOLLOW MESSAGE:
Device activation error. The physical file name
New log file
NOW YOU CAN USE PUBS NORMALLY.
2.截断日志,然后收缩日志文件.可以把这引步骤放在一个存储过程中,请先执行下面的存储过程创建语句:
CREATE PROC Up_shrinkfile
@LogicalFileName sysname,---- Use sp_helpfile to identify the logical filename that you want to shrink.
@MaxMinutes INT,--Limit on time allowed to wrap log.
@NewSize INT -- in MB
as
Begin
DECLARE @OriginalSize int
SELECT @OriginalSize = size -- in 8K pages
FROM sysfiles
WHERE name = @LogicalFileName
SELECT
CONVERT(VARCHAR(30),@OriginalSize) +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) +
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
-- Wrap log and truncate it.
DECLARE
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog =
-- Try an initial shrink.
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) -- the log has not shrunk
AND (@OriginalSize * 8 /1024) > @NewSize -- The value passed in for new size is smaller than the current size.
BEGIN -- Outer loop.
WAITFOR DELAY
EXEC (@TruncLog) -- See if a trunc of the log shrinks it.
END -- outer loop
SELECT
CONVERT(VARCHAR(30),size) +
CONVERT(VARCHAR(30),(size*8/1024)) +
FROM sysfiles
WHERE name = @LogicalFileName
PRINT
SET NOCOUNT OFF
End
然后执行此存储过程,如:
exec sp_helpdb
EXEC Up_shrinkfile
-- 董晓涛