mirror环境下作shrinkfile不起作用

levelquan 2013-07-17 06:35:47
环境: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备份后起到了一点点作用呢?
...全文
253 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-07-19
  • 打赏
  • 举报
回复
这个直接打开镜像监控器就有显示的了。、 我比较不解的是,日志备份后,DB的日志大小并没减少,同时硬盘还得存储日志备份。 回答:ldf也就是你说的日志文件,虽然大小没小,这个需要用收缩来减小,但是里面有了很多空间可以重用,也就是合理的日志备份后,ldf一般都不会有明显的增大,如果你的镜像做得好,那么磁盘的日志备份文件生成之后就马上删除也没问题,不过建议你计划删除,你这个疑问是因为对日志的理解还没入门。去了解一下日志吧。不用太深入。
levelquan 2013-07-19
  • 打赏
  • 举报
回复
引用 24 楼 DBA_Huangzj 的回复:
我建议你做日志备份,但是不建议你每次做都shrink,因为日志毕竟还是要增长的,收缩增长的非常大IO的操作,对你系统的响应速度会有很大的影响。按照你的日志增长,一天做一次是可以的,你备份后,收缩一次,假设dbcc sqlperf(logspace)在日志备份后,只有10%也就是30G是使用的,那么可以收缩到50G,然后日志增长不要用百分比,设为每次100M或者500M,然后再每天监控一下增长。适当调整。 另外,一般来说,只有IO、网络会影响日志发送队列等队列,导致日志redo失败,主数据库日志不断增长,否则一般镜像是不会影响日志的,做好日常的日志备份、监控mirror是否有队列产生,一般就不会有问题。切记不要频繁收缩文件。
请教下怎么看mirror是否有队列产生? 我比较不解的是,日志备份后,DB的日志大小并没减少,同时硬盘还得存储日志备份。 这是不是不合理啊-_-
黄_瓜 2013-07-19
  • 打赏
  • 举报
回复
这个 过一会 在shrink 可能就会小了
最爱午夜 2013-07-19
  • 打赏
  • 举报
回复
每次日志增长,你只需要备份就行了,这样被备份的日志就可以重用,比如:你的日志文件是2GB,备份日志后,这2GB又可以被重新利用,这样即使当天日志增长超过2GB,那么超过部分-2GB,就是当天日志物理文件增长的大小,日志文件的物理大小一旦增长了,就没有办法缩小的。
發糞塗牆 2013-07-19
  • 打赏
  • 举报
回复
引用 29 楼 levelquan 的回复:
非常感谢大家。 经过这段时间的折腾和大家的讨论,终于能够理解了事务日志、shrinkfile、备份对日志的作用。。。等等。。 从码农转到DBA,以前经常使用DB,以为已经很了解了。只是跨一小步,没想也只是门外汉啊。
做DBA需要考虑的东西和做开发不一样,有些做了3年开发,就说对数据库很熟悉,我一问日志满了怎么处理,他就说不懂。如果是专职DBA,就需要多学习更加专业的知识。另外记得结贴
levelquan 2013-07-19
  • 打赏
  • 举报
回复
非常感谢大家。 经过这段时间的折腾和大家的讨论,终于能够理解了事务日志、shrinkfile、备份对日志的作用。。。等等。。 从码农转到DBA,以前经常使用DB,以为已经很了解了。只是跨一小步,没想也只是门外汉啊。
發糞塗牆 2013-07-18
  • 打赏
  • 举报
回复
补充一下,完整备份不清空日志,对log文件没有什么帮助,一定要定时,比如1小时做一次日志备份,这样你基本上不用修改任何东西。记住是主服务器,镜像服务器的库你改不了
發糞塗牆 2013-07-18
  • 打赏
  • 举报
回复
唯一你要做的....日志备份,不是shrinkfile。做日志备份,log文件就清空了很多,可以重用。不要改变恢复模式,mirror仅支持full模式,频繁切换你可以试试,死的心都有
levelquan 2013-07-18
  • 打赏
  • 举报
回复
忘了谢谢几位大牛了
levelquan 2013-07-18
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
主数据库周期性做日志备份即可。mirror数据库无法访问,别弄那个库了,处理主数据库吧
我已经弄了一个天天备份和shrinkfile计划了,是可以适当清一些log,可还是无法达到SIMPLE状态下的那种shrink。 现在一天增加1G的log,不用多久,我又得转成SIMPLE再搭配mirror,这样不科学啊。
levelquan 2013-07-18
  • 打赏
  • 举报
回复
引用 1 楼 hdhai9451 的回复:
快点清空日志吧,不要等到哪天运行不了再处理。 请参考: 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
log太大后不得已也只能如此处理了。 可不能次次都这样啊,因为有mirror环境,无法改为SIMPLE模式。如果去掉mirror再清log,日志不同又得重新配置mirror了。这样很麻烦。
發糞塗牆 2013-07-18
  • 打赏
  • 举报
回复
引用 3 楼 delphigbg 的回复:
应该是改为完全日志模式才可以清理
Mirror仅支持FULL,
蝈蝈(GuoGuo) 2013-07-18
  • 打赏
  • 举报
回复
应该是改为完全日志模式才可以清理
發糞塗牆 2013-07-18
  • 打赏
  • 举报
回复
主数据库周期性做日志备份即可。mirror数据库无法访问,别弄那个库了,处理主数据库吧
發糞塗牆 2013-07-18
  • 打赏
  • 举报
回复
我建议你做日志备份,但是不建议你每次做都shrink,因为日志毕竟还是要增长的,收缩增长的非常大IO的操作,对你系统的响应速度会有很大的影响。按照你的日志增长,一天做一次是可以的,你备份后,收缩一次,假设dbcc sqlperf(logspace)在日志备份后,只有10%也就是30G是使用的,那么可以收缩到50G,然后日志增长不要用百分比,设为每次100M或者500M,然后再每天监控一下增长。适当调整。 另外,一般来说,只有IO、网络会影响日志发送队列等队列,导致日志redo失败,主数据库日志不断增长,否则一般镜像是不会影响日志的,做好日常的日志备份、监控mirror是否有队列产生,一般就不会有问题。切记不要频繁收缩文件。
levelquan 2013-07-18
  • 打赏
  • 举报
回复
引用 21 楼 DBA_Huangzj 的回复:
2008R2有压缩备份的功能,我相信做了一次日志备份后,你的log backup不会太大,先用dbcc sqlperf(logspace)看看你那个库用了多少,做个日志备份,再看看有多少,加上你是每天一次完整备份的话,一天前的日志备份可以用维护计划定期清理,这样空间不会很大。
现在就是用天天备份日志来尽量控制日志的增长。 我查过,备份前使用率99%,备份shrink后,未使用空间百分比1%。 我昨天日志大小,1.3G左右,今天2G,备份后清理变成1.9G,只减少了100M左右。 今天看起来没怎么增长,明天再看看。
levelquan 2013-07-18
  • 打赏
  • 举报
回复
引用 20 楼 jack11430 的回复:
首先,你必须知道每天日志增长的大小,然后设定日志增长值,然后每天定时备份日志。
目前日志大小差不多2G,增长值10%。 现在已经做了一个每天定时备份日志的计划。 定时备份后再shrink,可就是日志大小没怎么减少,还是不断在增长。
發糞塗牆 2013-07-18
  • 打赏
  • 举报
回复
2008R2有压缩备份的功能,我相信做了一次日志备份后,你的log backup不会太大,先用dbcc sqlperf(logspace)看看你那个库用了多少,做个日志备份,再看看有多少,加上你是每天一次完整备份的话,一天前的日志备份可以用维护计划定期清理,这样空间不会很大。
最爱午夜 2013-07-18
  • 打赏
  • 举报
回复
首先,你必须知道每天日志增长的大小,然后设定日志增长值,然后每天定时备份日志。
KevinLiu 2013-07-18
  • 打赏
  • 举报
回复
2008 R2的是可以的,你确定你的主数据库收缩成功了吗?
加载更多回复(10)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧