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

标签 sql-server

我有一个相当大的 SQL Server 数据库,它使用简单恢复模式。我们实际上不需要第二次恢复,所以我希望我们保持这种模式。

由于某种原因,该数据库的事务日志很大 (410 GB),其中 99% 的空间未分配。

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

有人知道为什么简单恢复模式数据库会有这么大的文件吗?我真的很想让它缩小。

最佳答案

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

另一种情况是,如果您在单个事务中更新了大约 200GB 的数据。日志将存储更改之前和之后的图像,从而消耗两倍的空间,并且无法重用,同样因为都是一个事务。

更新

我忽略了复制,这也是防止日志截断的一个因素。镜像也是如此,它是一种分布式事务(从技术上讲,它与“事件事务”相同,但 DTC 含义使其成为一种独特的情况)。完整列表和说明位于Factors That Can Delay Log Truncation .

关于sql-server - SQL Server 数据库在简单恢复模式下的巨大事务日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1195867/

相关文章:

mysql - 将 SQL Server 模式中的触发器转换为 MySQL 模式

sql-server - 在SQL Server中不断更新同一行是否不好?

sql - 合并复制错误: You do not have permission to run 'SP_TRACE_GENERATEEVENT'

sql - 如何旋转这个父子表?

mysql - 按 t1.date 连接不相关的表(t2.startdate 和 t2.enddate 之间)

sql - 如何在 SQL 中使用选择查询生成 csv 文件

sql-server - Azure Data Studio 不记得或保留连接

sql - 需要 SQL MIN MAX Group By 和 AGGREGATE 的帮助

sql-server - 如何列出给定 sql 查询的所有列

c# - 创建 Entity Framework 模型时忽略数据库默认值