设为首页 收藏本站
查看: 692|回复: 0

[经验分享] SQL Server 2008 事务日志物理文件尺寸无法减小的解决办法(含日志收缩(shrink)技巧)

[复制链接]

尚未签到

发表于 2015-7-4 10:10:35 | 显示全部楼层 |阅读模式
前言
  SQLServer2008中如何收缩日志文件,在邀月工作室的日志已经详细描述(点击查看),这里不再赘述。本文的重点是与大家分享日志截断、收缩后,物理文件的尺寸依然没有减小到期望尺寸的问题。
解决方案

  我的一个数据库,数据文件10+G ,事务日志达20+G,而且使用常规的截断、收缩方法均无法减小日志物理文件的尺寸,经过一番寻找,终于找到了解决方法。

查看日志信息
  在查询分析器中执行如下代码来查看日志信息:


1 DBCC LOGINFO('数据库名称')   我们看到status=0的日志,代表已经备份到磁盘的日志文件;而status=2的日志还没有备份。当我们收缩日志文件时,收缩掉的空间其实就是status=0的空间,如果日志物理文件无法减小,这里一定能看到非常多status=2的记录。接下来分析为什么会有这么多status=2的记录
查看日志截断延迟原因

  活跃(active)的日志无法通过收缩来截断,有各种原因会使日志截断延迟,具体表现就是事务日志的物理文件无法通过截断、收缩来减小,通过下面的代码可以看到实例上每个数据库的日志截断延迟原因:


1 USE [master]
2 SELECT [name] ,[database_id] ,[log_reuse_wait] ,[log_reuse_wait_desc] FROM [sys].[databases]  各种原因及解释如下:
log_reuse_wait_desc 值  说明   NOTHING
  当前有一个或多个可重复使用的虚拟日志文件。
  CHECKPOINT
  自上次日志截断之后,尚未出现检查点,或者日志头部尚未跨一个虚拟日志文件移动(所有恢复模式)。
  这是日志截断延迟的常见原因。有关详细信息,请参阅检查点和日志的活动部分。
  LOG_BACKUP
  需要日志备份,以将日志的头部前移(仅适用于完整恢复模式或大容量日志恢复模式)。



http://i.msdn.microsoft.com/ms345414.note%28zh-cn,SQL.100%29.gif注意:
日志备份不会妨碍截断。  
  完成日志备份后,日志的头部将前移,一些日志空间可能变为可重复使用。
  ACTIVE_BACKUP_OR_RESTORE
  数据备份或还原正在进行(所有恢复模式)。
  数据备份与活动事务的运行方式相同。数据备份在运行时,将阻止截断。有关详细信息,请参阅本主题后面的“数据备份操作与还原操作”部分。
  ACTIVE_TRANSACTION
  事务处于活动状态(所有恢复模式)。

  • 一个长时间运行的事务可能存在于日志备份的开头。在这种情况下,可能需要进行另一个日志备份才能释放空间。有关详细信息,请参阅本主题后面的“长时间运行的活动事务”部分。
  • 事务被延迟(仅适用于 SQL Server 2005 Enterprise Edition 及更高版本)。“延迟的事务”是有效的活动事务,因为某些资源不可用,其回滚受阻。有关导致事务延迟的原因以及如何使它们摆脱延迟状态的信息,请参阅延迟的事务。
  DATABASE_MIRRORING
  数据库镜像暂停,或者在高性能模式下,镜像数据库明显滞后于主体数据库(仅限于完整恢复模式)。
  有关详细信息,请参阅本主题后面的“数据库镜像与事务日志”部分。
  REPLICATION
  在事务复制过程中,与发布相关的事务仍未传递到分发数据库(仅限于完整恢复模式)。
  有关详细信息,请参阅本主题后面的“事务复制与事务日志”部分。
  DATABASE_SNAPSHOT_CREATION
  正在创建数据库快照(所有恢复模式)。
  这是日志截断延迟的常见原因,通常也是主要原因。
  LOG_SCAN
  正在进行日志扫描(所有恢复模式)。
  这是日志截断延迟的常见原因,通常也是主要原因。
针对延迟日志截断原因的部分解决方案


  • LOG_BACKUP
    备份日志后再执行收缩即可
  • REPLICATION
    这是我遇到的情况,但我根本没有启用过REPLICATION,据查,这好像是SQLSERVER2008的一个BUG,解决方法是给标有“REPLICATION”的数据库任意一个表创建数据库事务复制(TRANSACTION REPLICATION),然后再删除,执行数据库与日志备份后,就可以收缩了。
小技巧
  一般收缩日志的代码中都要求指定日志的文件名称,下面的代码则可以自动获取日志文件名称:


1 USE [数据库名称]
2 DECLARE @LogFileLogicalName sysname
3 SELECT @LogFileLogicalName=Name FROM sys.database_files WHERE Type=1
4 PRINT @LogFileLogicalName
5 DBCC SHRINKFILE (@LogFileLogicalName, 1);  
参考资料

  • FAQ : How to truncate and shrink Transaction Log file in SQL Server
  • 可能延迟日志截断的因素
  • log_reuse_wait_desc = replication but there's no replication
  • How to truncate Mirrored Database Log File
  • SQL2008如何压缩日志(log)文件?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83021-1-1.html 上篇帖子: SQL Server 2008 打SP1 补丁遇到的问题 下篇帖子: 推荐一个.net下学习水晶报表的好程序兼ms sql server的好助手
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表