故障报告
收缩日志操作提示异常
1. 问题(故障)描述
DBCC SHRINKFILE (N’zfl_log’ , 1);
2. 问题(故障)原因
1、 查询日志使用情况,日志文件大小为8.99M,未被收缩到1M:
DBCC SQLPERF(LOGSPACE)
2、查询日志的等待状态:
SELECT NAME,DATABASE_ID, LOG_Reuse_Wait, Log_Reuse_Wait_Desc FROM Sys.DATABASES WHERE Name = ‘ZFL’
问题分析:
因为日志空间几乎被完全使用了(92.8%),那么观察一下日志的等待状态,是Replication状态,此时尝试收缩也是无效的,因为日志都是出于活动状态,活动状态的日志是无法收缩的。既然是日志堵塞了,就想办法清理到这部分活动日志,尝试将事务日志标记为已分发。
3. 解决
–将日志中复制的事务标识改为已分发:
EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
然后执行收缩日志操作:
DBCC SHRINKFILE (N’zfl_log’ , 1);
再次查询日志使用情况:
日志被收缩。
4. 总结
当开启了CDC之后,在相关表上的变化会写入事务日志(日志状态为Replication状态),代理任务会解析日志,解析完日之后标记日志为可重建状态(如果是简单还原模式,是可重用,如果是完整还原模式,日志备份也无法截断Replication状态的日志),这种状态下如果限制了日志的最大大小比较小,或者没有限制,存储日志的磁盘空间不足,在大批量写入数据(增删改)的时候,有可能产生的日志占满日志文件的情况,会导致释放日志的代理作业无法进行,代理作业无法进行又无法释放日志,仿佛是死循环。
此时要么新增日志文件或者增加日志文件的最大大小,要么通过执行系统存储过程sp_repldone来标记事务为已分发(标记事务日志可重用)来解决这一问题。