当前位置:文档之家› 清除sql2000日志文件

清除sql2000日志文件

sql 2000 事务日志的介绍及收缩1、事务日志简介作为大型的关系型数据库,最重要的事情之一就是数据库完整性,也就是说数据必须是正确的,不能因为一些不可知的突发事件(如突然掉电)损坏数据。

为了避免这种情况,SQL数据库采用了两步写入磁盘的办法,第一步先写我做了什么,比如开了一个进货单,这一步完成后,再执行第二步,把这个进货单的内容写入数据库,这两步都成功了,才算完成,有一步有问题,这个单据都不会记到数据库中。

这样,您的事务操作(对数据库的修改操作,查询不记事务)的每一步都要记录进日志文件,如果您不注意经常截断事务日志的话,随着时间的增长,事务日志会很快的增长,最后要比您的数据量大的多。

可以经常看到,数据库文件只有几十兆,而日志文件却几千兆的情况。

2、截断事务日志事务日志分成两部分,一部分是不活动的,也就是说这部分的操作都已经成功的写入数据库了,而另一部分是活动的,也就是说,这部分日志,只是确认执行了上述第一步,还没有确信已经写入数据库的部分。

我们需要截断的就是不活动的部分。

这部分可以如下方法截断:Backup Log ‘数据库名’with truncate_only警告:在运行上述截断日志之后,强烈建议进行数据库完全备份。

3、缩小文件大小使用上述第2步就把不活动的日志删除了,但是文件并没有变小,只是把原先旧日志占用的空间释放了,又可以向里面记入新的日志了。

要想把物理文件也变小(比如已经几千兆了),请使用如下命令:DBCC Shrinkdatabase (数据库名)运行上述命令后就可以把日志文件缩小了(一般都缩为1M左右)4、把数据文件或日志文件的增长不受限制如果您做不到经常维护数据库,不能经常的截断日志,日志文件就会逐渐变大,一旦大到您设置的大小限制,日志就再也不能写入了,您对数据库的所有改变操作也就无法进行了,这时候您就需要用上面的方法把日志文件截断。

不过,您可以把文件的大小设置大一些或不受限制,请在企业管理器中设置数据库属性即可。

也可以运行下述命令:alter database 数据库名modify file (name = 逻辑文件名,Maxsize =Unlimited)此处的逻辑文件名就是您在企业管理器中看到的文件名。

说明:微软公司的SQL 2000有个小错误,有时候会报告逻辑文件名不存在的问题,这时候您就应该看看真正的逻辑文件名是什么,如果您的数据库是从一个备份文件中还原的,那么可以使用下面的命令看看逻辑文件名到底是什么,此处假设您已经把备份文件复制到C盘的根目录,备份文件名为Database.bak:restore filelistonly from disk = ‘c:\Database.bak’运行上述命令后,可以看出所有的逻辑文件名(LogicalName列的内容),取出这里的逻辑文件名,比如“真文件名”,运行如下命令alter database 数据库名modify file (name = 真文件名, Maxsize = Unlimited)这个命令就会成功,再到企业管理器中去看,就发现文件大小已经无限制了。

5、数据库日常维护为了让数据库更好的工作,不至于影响业务,日常需要对数据库进行维护,一般分为以下几个方面:a. 日常的备份。

建议每天进行备份,如果数据库太大,每天全库备份不现实,可以采用一周完全备份一次,每天差异备份一次或两次b. 维护索引。

索引能够大幅的提高查询性能,但是随着数据碎片的增加,性能会越来越差,所以要经常的维护索引,可以根据具体情况,每周或每月维护一次索引。

c. 截断日志。

根据业务量的大小,可以不定期的截断日志。

(方法参照下面)方法一:在SQL 2000中,每个数据库事实上存在两个物理文件,分别为.mdf和.ldf 的扩展名。

前者是数据文件,后者就是保存事务日志的文件。

事务日志是SQL 2000中用于记录数据库操作记录的功能,不过如果长时间不进行维护,这个文件就会越来越庞大,必须清除一下。

上次我的服务器上一个网站,因为数据库比较庞大(2G多),加上长时间没有维护,导致后来事务日志文件达到数十GB,把保存数据库文件的分区都给撑爆了。

当时我没有过清除事务日志的经验,上网找了一些资料,很多都把这事说得很复杂,要在查询分析器里运行若干个命令什么的。

其实后来我找到了一个最简单的方法,只要在查询分析器里运行一条命令,再在企业管理器里进行一点小操作就行了。

步骤如下:一、运行查询分析器,运行下面这条命令(把命令中的“数据库名”替换成要清除日志的数据库名称):DUMP TRANSACTION 数据库名WITH NO_LOG二、打开企业管理器,找到这个数据库,右键点击,选择“所有任务”->“收缩数据库”:如图:三、在“收缩数据库”的对话框中,点击下面的“文件”按钮:三、在接下来的对话框中,在顶部的“数据库文件”后面选择以“_log”结尾的文件,这个是数据库的日志文件。

然后直接点击下面的确定按钮。

四、出现收缩成功的提示之后,再次在企业管理器中在这个数据库上点击右键查看属性,选择“事务日志”标签页,可以看到事务日志已经被成功清空了。

方法二:1、首先备份数据库然后备份文件,备份日志文件,可改名在查询分析器里执行sp_attach_single_file_db,将生成新的日志文件具体怎么做,我也没做过,让有经验的人回答。

,我去收集一下这方面的资料从大洋网摘录的方法,未试过用bcp命令把数据库中的记录都导出来保存到另一台机器,然后用truncate table tablename的方式把所有记录都清空,然后执行dump transaction dbname with no_log,发现log文件已显著减少,再用bcp命令导入,导入后log文件又增大,但再用dump transaction dbname with no_log,效果不仅是使日志占的空间减少,日志文件的size也显著减少。

前几天也碰到日志文件过大的问题,数据库实际大小为600M, 日志文件实际大小为33M, 但日志文件占用空间为2.8G!!!试了多种方式,SHIRNK DATABASE,TRUNCATE LOG FILE, 都没办法将文件缩小。

无论如何,这应该算SQL SERVER的一个BUG吧。

后来找到下面的代码,就可以将日志文件缩小到自己想要的大小了。

把代码COPY到查询分析器里,,然后修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可(我已经用过多次了)-----SET NOCOUNT ONDECLARE @LogicalFileName sysname,@MaxMinutes INT,@NewSize INTUSE Marias -- 要操作的数据库名SELECT @LogicalFileName = 'Marias_log', -- 日志文件名@MaxMinutes = 10, -- Limit on time allowed to wrap log.@NewSize = 100 -- 你想设定的日志文件的大小(M)-- Setup / initializeDECLARE @OriginalSize intSELECT @OriginalSize = sizeFROM sysfilesWHERE name = @LogicalFileNameSELECT 'Original Size of ' + db_name() + ' LOG is ' +CONVERT(V ARCHAR(30),@OriginalSize) + ' 8K pages or ' +CONVERT(V ARCHAR(30),(@OriginalSize*8/1024)) + 'MB' FROM sysfilesWHERE name = @LogicalFileNameCREATE TABLE DummyTrans(DummyColumn char (8000) not null)DECLARE @Counter INT,@StartTime DATETIME,@TruncLog V ARCHAR(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, @StartTime, GETDATE()) -- time has not expiredAND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)AND (@OriginalSize * 8 /1024) > @NewSizeBEGIN -- Outer loop.SELECT @Counter = 0WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) BEGIN -- updateINSERT DummyTrans valueS ('Fill Log')DELETE DummyTransSELECT @Counter = @Counter + 1ENDEXEC (@TruncLog)ENDSELECT 'Final Size of ' + db_name() + ' LOG is ' +CONVERT(V ARCHAR(30),size) + ' 8K pages or ' +CONVERT(V ARCHAR(30),(size*8/1024)) + 'MB'FROM sysfilesWHERE name = @LogicalFileNameDROP TABLE DummyTransSET NOCOUNT OFF理解日志截断选项不同的备份日志截断选项经常被DBA新手所忽视。

DBA新手通常并不知道选项存在或了解它们的作用。

怎样使用或什么时候时候它们,以下的几小节详细解释每个选项的作用以及在什么时候使用它。

TRUNCATE_ONLYTRUNCATE_ONLY选项截掉事务日志的非活动部分,而不备份(拷贝)日志到备份设备上。

相关主题