缩小事务日志?

缩小事务日志?

为什么不建议收缩事务日志?

答案1

你为什么要这样做?在正常情况下,它会再次增长,直到下一次备份。此外,它还会使文件碎片化,这对性能不利。最佳实践是不要使用自动增长,这自动意味着不要缩减内容,这样它就需要增长。

答案2

这完全取决于你这个问题的意思。

一般来说,您不需要定期缩小事务日志。

然而,有时需要对其进行碎片整理,或者在失控事务后恢复空间。

碎片化

此代码将显示您的交易日志的内部结构。

-- get list of VLFs
use AdventureWorks2008R2
go
dbcc loginfo
go

您希望看到所有 VLF 都具有相同的大小。如果您设置了百分比或非常小的增长设置,那么您最终会得到一个碎片化的事务日志。

另外,数量不能太多,也不能太少。请参阅此文章:http://www.sqlskills.com/blogs/kimberly/post/Transaction-Log-VLFs-too-many-or-too-few.aspx

那么,您有数百或数千个 VLF 吗?它们的大小都不同吗?如果是这样,您的事务日志就会变得碎片化。

修复它

收缩数据文件会使其碎片化。收缩事务日志会对其进行碎片整理。

再次运行此代码:

-- get list of VLFs
use AdventureWorks2008R2
go
dbcc loginfo
go

状态为 2 的行是活动 VLF。它可能位于中间某处,我们希望它位于开头。您无法将日志缩小到活动 VLF 的位置之外。

多次运行 LOG 备份作业。然后再次运行上述代码。继续执行此操作,直到活动 VLF 位于或接近事务日志的开头。

缩小它

运行此代码来缩小您的日志文件。

-- 收缩文件,减少 VLF 的数量,从而对事务日志进行碎片整理 dbcc shrinkfile('AdventureWorks2008R2_Log', 1) go

然后返回并运行上述代码来检查您的 VLF。您应该会看到 VLF 数量有所减少。

您可能需要重复日志备份/收缩文件例程几次。

尺寸

在您的系统运行了几个业务周期后,您应该对其自然大小有了一个很好的了解。这就是您在缩小/碎片整理后将其大小调整为多少。

首先设定增长:

-- manually set the growth
use master
go
alter database AdventureWorks2008R2
modify file (name = 'AdventureWorks2008R2_Log', filegrowth = 512000kb)
go

然后调整大小:

-- manually set the log size
use master
go
alter database AdventureWorks2008R2
modify file (name = 'AdventureWorks2008R2_log', size = 4096000kb)
go

当然,您的数字会有所不同。有一点是,如果您的日志很大,例如 32G,请不要一次性将其设置为这个大小。而是将其增加到 8G,然后是 16G、24G、32G。

还有一件事,避免使用 4G 的倍数以避免 4G 漏洞。参考这里:http://www.sqlskills.com/BLOGS/PAUL/post/Bug-log-file-growth-broken-for-multiples-of-4GB.aspx

所以我使用 4000MB 或 8000MB 等等。

自动增长和 MaxSize

当您确实想要手动调整文件大小时,请保持“自动增长”处于开启状态,这样您就不会被恶意进程捕获。

一般来说,我不建议设置 MaxSize,除非您有多个事务日志共享同一个 LUN,或者您的数据库定期运行填满驱动器的疯狂查询。

答案3

如果您在完整恢复模式下对数据库使用事务日志备份,您将保持事务日志处于受控状态,而不需要缩小它。您会发现特殊情况下您可能需要这样做,但从不定期这样做。

答案4

日志收缩并不像数据文件收缩那么糟糕。只有当数据库处于简单恢复模式并且文件在某个操作后增长过多到您知道不会再次增长的值时才执行此操作。您可以将其收缩到给定值,这样它就不会在下一个事务中再次分配空间,从而导致性能下降。不要定期执行此操作。

如果数据库已满,您应该定期备份日志。

相关内容