如何截断日志文件?


事务日志文件过长,具体如何操作才能截断日志文件阿?我看到帮助文件,只有一些说明的东西但是具体该怎么做呢?

10 个解决方案

#1


到企业管理器里——》所有任务——》收缩数据库——》文件——》确定

#2


1:截断事务日志:
BACKUP LOG 数据库名 WITH NO_LOG

2:清空日志
DUMP  TRANSACTION  库名  WITH  NO_LOG    

再:
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了


3: 删除LOG
1:分离数据库   企业管理器->服务器->数据库->右键->分离数据库
2:删除LOG文件
3:附加数据库  企业管理器->服务器->数据库->右键->附加数据库
此法生成新的LOG,大小只有500多K
   再将此数据库设置自动收缩
 或用代码: 
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。

EXEC sp_detach_db @dbname = 'pubs'
EXEC sp_attach_single_file_db @dbname = 'pubs', 
   @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'


4.设置为自动收缩
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"


#3


转:
如何缩小MSSQL的日志文件已经是一个经常性的问题了,不过这个问题在精华区已经有不少答案了,我这里也不再赘述。
现在我们讨论一下治本的问题,即如何使日志文件不再增大?

先介绍一个简单的方法。
就是把数据库的故障还原模型设置为“简单”(SQL2K)。这样它就会在Checkpoint的时候截断日志。
具体操作方法是:
1、在Enterprise Manager中右键点数据库,“属性|选项|故障还原”,选择“简单”就可以了,如果是SQL7,在“属性|选项”中有一个“trunc. log on chkpt. ”,选中就可以了。
2、如果不想用Enterprise Manager,在Query Analyser或者isql里面执行
EXEC sp_dboption 'your_dbname', 'trunc. log on chkpt.', 'TRUE'
就可以了
但是,要注意的是,这样做了之后,虽然日志不会增大,但是也意味着你一旦出现误操作,将不会有利用日志恢复的机会。(如何利用日志来恢复请参见精华区的FAQ)
所以,绝对不建议在生产数据库上截断日志,除非你有充足的理由和足够的把握,或者……
承担责任的不是你。

既然这种方法不安全,下面我将介绍一种安全的方法。
大家都知道,SQL Server 在完成事务日志备份时将自动截断事务日志中的不活动部分。这些不活动的部分包含已完成的事务,因此在恢复过程中不再使用。相反,事务日志的活动部分包含仍在运行但尚未完成的事务。SQL Server 将重新使用事务日志中这些截断的非活动空间,而不是任由事务日志继续增大并占用更多的空间。 
所以,我们备份事务日志就可以使日志文件不再增大了。
但是呢,日志文件一直放着也不是个办法,删除呢,又会失去恢复的可能性。
我们可以结合完全备份来做。做过完全备份之前的事务日志就可以删除了。
比如说,一个备份计划,每天一次完全备份,保留7天内的,每15分钟一次事务日志备份,保留2天的。
用数据库维护计划向导可以很方便的建立备份计划,不过一定要记得设置保留多久的备份哦,否则硬盘空间被备份给占满了就坏事了。

#4


--压缩日志及数据库文件大小

/*--特别注意
请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.
--*/

1.清空日志
DUMP  TRANSACTION  库名  WITH  NO_LOG    

2.截断事务日志:
BACKUP LOG 数据库名 WITH NO_LOG

3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了

也可以用SQL语句来完成
--收缩数据库
DBCC SHRINKDATABASE(客户资料)

--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)

4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库

b.在我的电脑中删除LOG文件

c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库

此法将生成新的LOG,大小只有500多K

或用代码: 
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。

a.分离
EXEC sp_detach_db @dbname = 'pubs'

b.删除日志文件

c.再附加
EXEC sp_attach_single_file_db @dbname = 'pubs', 
   @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'

5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"

--SQL语句设置方式:
EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE'

6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)

--SQL语句的设置方式:
alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)

#5


use master  --注意,此存储过程要建在master数据库中
go

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_compdb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_compdb]
GO

/*--压缩数据库的通用存储过程

压缩日志及数据库文件大小
因为要对数据库进行分离处理
所以存储过程不能创建在被压缩的数据库中

--邹建 2004.3--*/

/*--调用示例
exec p_compdb 'test'
--*/
create proc p_compdb
@dbname sysname, --要压缩的数据库名
@bkdatabase bit=1, --因为分离日志的步骤中,可能会损坏数据库,所以你可以选择是否自动数据库
@bkfname nvarchar(260)='' --备份的文件名,如果不指定,自动备份到默认备份目录,备份文件名为:数据库名+日期时间
as
if @bkdatabase=1 --确定是否备份数据库
begin
if isnull(@bkfname,'')='' 
set @bkfname=@dbname+'_'+convert(varchar,getdate(),112)
+replace(convert(varchar,getdate(),108),':','')
select 提示信息='备份数据库到SQL 默认备份目录,备份文件名:'+@bkfname
exec('backup database ['+@dbname+'] to disk='''+@bkfname+'''')
end

--1.清空日志
exec('DUMP TRANSACTION ['+@dbname+'] WITH  NO_LOG')

--2.截断事务日志:
exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')

--3.收缩数据库文件(如果不压缩,数据库的文件不会减小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')

--4.设置自动收缩
--exec('EXEC sp_dboption '''+@dbname+''',''autoshrink'',''TRUE''')

/*--后面的步骤有一定危险,如果你无法确定它的危险性,请勿启用,而且会断开用户连接
--5.分离数据库

--进行分离处理
create table #t(fname nvarchar(260),type int)
exec('insert into #t select filename,type=status&0x40 from ['+@dbname+']..sysfiles')
exec('sp_detach_db '''+@dbname+'''')

--删除日志文件
declare @fname nvarchar(260),@s varchar(8000)
declare tb cursor local for select fname from #t where type=64
open tb 
fetch next from tb into @fname
while @@fetch_status=0
begin
set @s='del "'+rtrim(@fname)+'"'
exec master..xp_cmdshell @s,no_output
fetch next from tb into @fname
end
close tb
deallocate tb

--附加数据库
set @s=''
declare tb cursor local for select fname from #t where type=0
open tb 
fetch next from tb into @fname
while @@fetch_status=0
begin
set @s=@s+','''+rtrim(@fname)+''''
fetch next from tb into @fname
end
close tb
deallocate tb
exec('sp_attach_single_file_db '''+@dbname+''''+@s)
--*/
go

#6


--作者:不详
--缩小数据库日志文件
SET NOCOUNT ON
DECLARE @LogicaFILENAME SYSNAME,
        @MAXMINUTES INT,
        @NEWSIZE INI
USE MARIAS---要操作的数据库
SELECT @LOGICALFILENAME = 'MARIAS_LOG',---日志文件名
@MAXMINUTES = 10,---LIMIT ON TIME ALLOWED TO WRAP LOG.
@NEWSIZE = 100---你想设定的日志文件大小(M)
--SETUP /INITIALIZE
DECLARE @ORIGINALSIZE INT
SELECT @ORIGINALSIZE = SIZE
FROM SYSFILES
WHERE NAME = @LOGICALFILENAME
SELECT 'ORIGINAL SIZE OF' + DB_NAME() + 'LOG IS' +
CONVERT(VARCHAR(30),@ORIGINALSIZE)+'8K PAGES OR'+
CONVERT(VARCHAR(30,(@ORIGINALSIZE*8/1024))+'MB'
FROM SYSFILES
WHERE NAME = @LOGICALFILENAME
CREATE TABLE DUMMYTRANS
(DUMMYCOLUMN CHAR(8000) NOT NULL)
DECLARE @COUNTER INI,
@STARTTIME DATETIME,
@TRUNCLOG VARCHAR(255)
SELECT @STARTTIME = GETDATE(),
@TRUNCLOG = 'BACKUP LOG'+DB_NAME()+'WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LOGICALFILENAME,@NEWSIZE)
EXEC(@TRUNCLOG)
--WRAP THE LOG IF NECESSARY
WHILE @MAXMINUTES >DATEDIFF(MI,@STARTIME,GETDATE()) --TIME HAS NOE EXPIRED
AND @ORIGINALSIZE =(SELECT SIZE FROM SYSFILE WHERE NAME = @LOGICALFILENAME)
AND (@ORIGINALSIZE*8/1024)>@NEWSIZE
BEGIN --OUTER LOOP.
SELECT @COUNT = 0
WHILE((@COUNT<@ORIGINALSIZE/16) AND (@COUNTER<50000))
BEGIN -- UPDATE
INSERT DUMMYTRANS VALUES ('FILL LOG'
DELETE DUMMYTRANS
SELECT @COUNTER = @COUNTER + 1
END
EXEC (@TRUNCLOG)
END
SELECT 'FINAL SIZE OF' + db_NAME() +'LOG IS'+
CONVERT(VARCHAR(30,SIZE)+'8K PAGES OR'+
CONVER(VARCHAR(30,(SIZE*8/1024))+'MB'
FROM SYSFILES
WHERE NAME = @LOGICALFILENAME
DROP TABLE DUMMYTRANS
SET NOCUNT OFF

#7


trunc 全部都是这个关键词的帮助
自己看MSSQL2000的ONLINE HELP吧

#8


太感谢各位了,我会认真阅读各位的回贴。我用的应用程序要每分钟写n次数据库sql2000,不到一个月,数据不到1M,但是日志文件已经近4G,以至于无法写库,现在日志文件我几经截断了,但是还要定一个好的日志文件的维护计划,希望各位提供好的建议!

#9


思路:JOB调用'存储过程'...

#10


1)建存储过程
create proc proc_test
as
--缩小日志的语句...
2)创建一个JOB,定时执行exec proc_test
...
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告