在简单恢复模式下使用SQL Server数据库的巨大事务日志

25 sql-server

我有一个相当大的SQL Server数据库正在使用SIMPLE恢复模式.我们真的不需要第二次恢复,所以我希望我们保持这种模式.

由于某种原因,此数据库的事务日志非常庞大(410 GB),其中99%的空间未分配.

我试图使用(DBCC SHRINKFILE(MyDatabase_log,20000))缩小文件,但它似乎不起作用.

任何人都有关于为什么SIMPLE恢复模式数据库会有如此庞大的文件的任何提示?我真的很想让它缩小.

Rem*_*anu 25

这意味着你曾经有一个持续时间太长的单一事务,它迫使日志增长410GB.如果存在活动事务,则无法重用日志,因为无法删除回滚信息.这样的例子是,如果有人打开SSMS查询,启动事务,更新记录然后去度假.事务将处于活动状态并强制日志增长,直到最终提交或回滚.当事务最终结束时,最终可以回收使用的空间,留下一个巨大的空日志文件.

另一种情况是,如果您在单个事务中更新了大约200GB的数据.日志将存储更改的前后映像,因此占用了两倍的空间,并且无法重复使用,因为所有单个事务都是如此.

更新

我忽略了提到复制,它也是一个可以阻止日志截断的因素.镜像是一种分布式交易(技术上与"活动交易"相同,但DTC含义使其成为一个独特的案例).完整的列表和解释是可以延迟日志截断的因素.

  • 是的 现在,关闭复制功能使我可以使用NOTRUNCATE缩小日志。感谢Eric和Remus! (2认同)

Eri*_*ric 6

你错过了一个论点dbcc shrinkfile:

dbcc shrinkfile (MyDatabase_log, 20000, TRUNCATEONLY)
Run Code Online (Sandbox Code Playgroud)

NOTRUNCATE是默认值,它将已分配的块移动到未分配空间的开头.TRUNCATEONLY删除未分配的空间.因此,如果您执行a NOTRUNCATE后跟a TRUNCATEONLY,则会获得一个精简日志.