昨天遇到一个SQL server日志文件太大,收缩报错的问题在此记录一下。
问题的起因是,执行SQL的时候出现下面的提示:
1、、查看一下数据库文件所在的磁盘,已经爆掉了。查看数据库日志文件大小,有70多个G,第一反应是先做数据库日志收缩,依然报错。
2、百度了一下,大部分帖子都说是CDC导致的,但是我的服务器没有使用CDC,排除了这种可能
3、考虑到收缩日志可能需要一定的空间,移出磁盘部分文件,再进行收缩,此时不再提示错误(毕竟磁盘未满),但是收缩没有生效,空间未改变(数据库恢复模式确认为简单)
4、查看数据库和日志的状态
数据库:
select name,log_reuse_wait_desc from sys.databases where name='ais20190906130330_0403'
日志重用的等待状态是replication状态
--删除数据库中复制对象
EXEC sp_removedbreplication TESTB
再次查询依然是replication状态
查询DBCC loginfo()
发现所有日志的状态都是status=2,即活动的状态,这是因为项目中每次批量写入数据的过程都是异常中断结束,导致所产生的日志都是活跃的状态。
遇到以上情况,直接对数据库做一次完整备份,之后这些日志的状态会自动更新为可以重用的状态,就可以直接收缩掉了。
5、其他场景
将日志中所有复制的事务将标记为已分发有时候也可以解决日志无法收缩问题
EXEC sp_repldone @xactid = NULL,@xact_segno = NULL,@numtrans = 0,@time = 0,@reset = 1
推荐阅读