环境:XP3,SQLSERVER 2008R2。已经为DB搭配好了mirror环境。
DB频繁出现事务日志不断增大,以致磁盘经常报警告。
比如:data只有300M,transcation log却有30G。因为有mirror环境,我无法将DB直接转换成SIMPLE。
所以我只好在principal上直接作shrink,运行:
USE [db_name]
GO
DBCC SHRINKFILE (N'db_name_log' , 0, TRUNCATEONLY)没有起到作用。在作shrink之前我先作了一次FULL备份。shrink完全没有将LOG减少。
后来,在FULL备份后做一次transaction log备份,然后再shrink,这次倒有减少一点点了。
dbcc sqlperf('logspace');
log space的使用空间也从原来的99%降到4%。
可是log却还是很大,只是减少了几百M而已。为什么?这个时候又该怎么做?
为什么FULL备份之后做SHRINK没有一点作用,反而是作了log备份后起到了一点点作用呢?备份SQL Servershrinkfiletransaction log事务日志

解决方案 »

  1.   

    快点清空日志吧,不要等到哪天运行不了再处理。请参考:
    SQL2008:
    '在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式。
    USE [master]
    GO
    ALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO_WAIT
    GO
    ALTER DATABASE DNName SET RECOVERY SIMPLE --简单模式
    GO
    USE DNName
    GO
    DBCC SHRINKFILE (N'DNName_Log' , 11, TRUNCATEONLY) GO '这里的DNName_Log 如果不知道在sys.database_files里是什么名字的话,可以用以下注释的语句进行查询'USE DNName'GO'SELECT file_id, nameFROM sys.database_files;'GO
    USE [master]
    GO
    ALTER DATABASE DNName SET RECOVERY FULL WITH NO_WAIT
    GO
    ALTER DATABASE DNName SET RECOVERY FULL --还原为完全模式
    GO
      

  2.   

    主数据库周期性做日志备份即可。mirror数据库无法访问,别弄那个库了,处理主数据库吧
      

  3.   


    log太大后不得已也只能如此处理了。
    可不能次次都这样啊,因为有mirror环境,无法改为SIMPLE模式。如果去掉mirror再清log,日志不同又得重新配置mirror了。这样很麻烦。
      

  4.   


    我已经弄了一个天天备份和shrinkfile计划了,是可以适当清一些log,可还是无法达到SIMPLE状态下的那种shrink。
    现在一天增加1G的log,不用多久,我又得转成SIMPLE再搭配mirror,这样不科学啊。
      

  5.   

    唯一你要做的....日志备份,不是shrinkfile。做日志备份,log文件就清空了很多,可以重用。不要改变恢复模式,mirror仅支持full模式,频繁切换你可以试试,死的心都有
      

  6.   

    补充一下,完整备份不清空日志,对log文件没有什么帮助,一定要定时,比如1小时做一次日志备份,这样你基本上不用修改任何东西。记住是主服务器,镜像服务器的库你改不了
      

  7.   

    你定期的备份主数据库日志这样可以避免日志增长的过大,在主数据库做的收缩动作可以同步到Mirror数据库的。
      

  8.   

    上面的回答有点错误,DBCC SHIRINKFILE是不会同步到MIRROR数据库的,不过可以考虑做一次FAILOVER然后再进行数据库收缩。
      

  9.   

    The shrink operation is not duplicated on the mirror database when you use database mirroring in SQL Server 2005
      

  10.   

    合理的log备份才是解决方案,SHRINKFILE 影响IO性能。 收掉它会马上在开。你接着在收。而且做过mirror的数据库应该不能alter database dbname set recovery simple 吧。 这不是日志断掉了。断掉了还咱们在 备机上继续redo。
      

  11.   


    我现在的log有3G,如果一小时备份一次,再大的硬盘也吃不消啊-_-
    都不知道APP在搞什么,搞得事务日志增长如此之快。
    我分析来分析去无非两点,事务等待提交,事务无法提交。所以越积越大。可是不知道怎么解决啊~~~
      

  12.   


    shrink出来的日志应该是可以同步到mirror的,2008R2,如果不行,那mirror的事务日志不断增长,那不折腾死人。
      

  13.   


    shrink出来的日志应该是可以同步到mirror的,2008R2,如果不行,那mirror的事务日志不断增长,那不折腾死人。
    2005不会,2008之后的可以。http://support.microsoft.com/kb/937531/en-us
      

  14.   

    2008R2有压缩备份的功能,我相信做了一次日志备份后,你的log backup不会太大,先用dbcc sqlperf(logspace)看看你那个库用了多少,做个日志备份,再看看有多少,加上你是每天一次完整备份的话,一天前的日志备份可以用维护计划定期清理,这样空间不会很大。
      

  15.   


    目前日志大小差不多2G,增长值10%。
    现在已经做了一个每天定时备份日志的计划。
    定时备份后再shrink,可就是日志大小没怎么减少,还是不断在增长。
      

  16.   


    现在就是用天天备份日志来尽量控制日志的增长。
    我查过,备份前使用率99%,备份shrink后,未使用空间百分比1%。我昨天日志大小,1.3G左右,今天2G,备份后清理变成1.9G,只减少了100M左右。
    今天看起来没怎么增长,明天再看看。
      

  17.   

    我建议你做日志备份,但是不建议你每次做都shrink,因为日志毕竟还是要增长的,收缩增长的非常大IO的操作,对你系统的响应速度会有很大的影响。按照你的日志增长,一天做一次是可以的,你备份后,收缩一次,假设dbcc sqlperf(logspace)在日志备份后,只有10%也就是30G是使用的,那么可以收缩到50G,然后日志增长不要用百分比,设为每次100M或者500M,然后再每天监控一下增长。适当调整。
    另外,一般来说,只有IO、网络会影响日志发送队列等队列,导致日志redo失败,主数据库日志不断增长,否则一般镜像是不会影响日志的,做好日常的日志备份、监控mirror是否有队列产生,一般就不会有问题。切记不要频繁收缩文件。
      

  18.   

    每次日志增长,你只需要备份就行了,这样被备份的日志就可以重用,比如:你的日志文件是2GB,备份日志后,这2GB又可以被重新利用,这样即使当天日志增长超过2GB,那么超过部分-2GB,就是当天日志物理文件增长的大小,日志文件的物理大小一旦增长了,就没有办法缩小的。
      

  19.   

    这个 过一会 在shrink 可能就会小了
      

  20.   


    请教下怎么看mirror是否有队列产生?
    我比较不解的是,日志备份后,DB的日志大小并没减少,同时硬盘还得存储日志备份。
    这是不是不合理啊-_-
      

  21.   

    这个直接打开镜像监控器就有显示的了。、
    我比较不解的是,日志备份后,DB的日志大小并没减少,同时硬盘还得存储日志备份。
    回答:ldf也就是你说的日志文件,虽然大小没小,这个需要用收缩来减小,但是里面有了很多空间可以重用,也就是合理的日志备份后,ldf一般都不会有明显的增大,如果你的镜像做得好,那么磁盘的日志备份文件生成之后就马上删除也没问题,不过建议你计划删除,你这个疑问是因为对日志的理解还没入门。去了解一下日志吧。不用太深入。
      

  22.   

    非常感谢大家。
    经过这段时间的折腾和大家的讨论,终于能够理解了事务日志、shrinkfile、备份对日志的作用等等。。从码农转到DBA,以前经常使用DB,以为已经很了解了。只是跨一小步,没想也只是门外汉啊。
      

  23.   

    做DBA需要考虑的东西和做开发不一样,有些做了3年开发,就说对数据库很熟悉,我一问日志满了怎么处理,他就说不懂。如果是专职DBA,就需要多学习更加专业的知识。另外记得结贴