如何最好地维护SQL日志文件大小


13

我有点像是新的DBA,并且正在管理一个活动量很大的SQL Server 2012实例。我正在完全恢复模式下运行,因为我们需要时间点恢复。

现在,我每天凌晨5点对数据库和日志进行完整备份。一些日志文件已膨胀到300GB,即使备份后它们也不会减小大小。我可以通过运行类似于以下内容来减小它们的尺寸:

BACKUP LOG db1 TO DISK = '\\server\share\db1_log1.trn';
DBCC ShrinkFile([db1_log], 0);

BACKUP LOG db1 TO DISK = '\\server\share\db1_log2.trn';
DBCC ShrinkFile([db1_log], 0);

BACKUP LOG db1 TO DISK = '\\server\share\db1_log3.trn';
DBCC ShrinkFile([db1_log], 0);

当我检查备份文件的LSN时,会看到类似以下内容的内容:

RESTORE headeronly FROM DISK = N'\\server\share\db1_log1.trn'
FirstLSN:  15781000014686200001
SecondLSN: 15802000000665000001

RESTORE headeronly FROM DISK = N'\\server\share\db1_log2.trn'
FirstLSN:  15802000000665000001
SecondLSN: 15805000000004100001

RESTORE headeronly FROM DISK = N'\\server\share\db1_log3.trn'
FirstLSN:  15805000000004100001
SecondLSN: 15808000000004200001

我不认为我会通过缩小日志文件来破坏日志链。仔细阅读这一内容,我相信我会损害我的表现,因为那些缩小的日志文件必须重新增长。

问题:

  1. 为什么备份后日志文件没有缩小?是因为有未提交的交易吗?
  2. 最初,我想在每隔5:00 AM备份后就缩小日志文件。在阅读了这对性能造成的不利影响之后,我现在认为我需要在一天中的每两个小时进行一次常规日志备份。那是对的吗?
  3. 我的数据库/日志的常规完全备份每天发生在凌晨5:00,有时需要3个小时。如果我将日志备份安排为每小时进行一次,那么当日志备份与5:00 AM备份冲突时会发生什么?

Answers:


10
  1. 为什么备份后日志文件没有缩小?是因为有未提交的交易吗?

实际的NTFS日志文件不会从事务日志备份中“收缩”,但是事务日志中的VLF(虚拟日志文件)被标记为可重复使用(因为它们现在已备份并持久保存在介质上),从而可以对使用事务日志。如果您不备份事务日志,或者备份频率不够高,那么将没有可用的VLF,这将导致事务日志增长(假设已设置自动增长)以容纳其他事务日志条目。

2.起初我以为我应该在每隔5:00 AM备份后收缩日志文件。在阅读了这对性能造成的不利影响之后,我现在认为我需要在一天中的每两个小时进行一次常规日志备份。那是对的吗?

定期和计划的文件收缩不是一个好主意。仅当您需要收回急需的空间时,才考虑使用DBCC SHINKFILE。另外,当您不断增长事务日志时,可能会阻碍其他事情,例如数据库的恢复。如果事务日志中的VLF太多(当事务日志仅以很小的存储增量增长时,这是一个常见问题),则恢复数据库的时间可能会比所需的时间更长。

3.我的数据库/日志的常规完全备份每天发生在凌晨5:00,有时需要3个小时。如果我将日志备份安排为每小时进行一次,那么当日志备份与5:00 AM备份冲突时会发生什么?

什么都不会发生,那是完全合法的操作。请参见MSDN的以下图表。如果有黑点,则这两个操作不能同时发生。如您所见,同时允许数据库备份和事务日志。

在此处输入图片说明

这里的要点是您应该更频繁地备份事务日志。通过不更频繁地备份事务日志,NTFS文件增长不是您可能遇到的唯一问题。如果要发生存储故障并且事务日志丢失,则只能还原到上次事务日志备份的时间点。如果事务日志丢失,您将无法备份日志尾部并恢复到故障的时间点。就您而言,您可能会丢失价值24小时的数据。但是,如果每隔30分钟备份一次事务日志,那么最大的数据丢失将是30分钟。在这种情况下,如果您的事务日志不见了,并且您拥有完整的备份和完整的日志链,则可以还原到最后一个日志备份。

有关事务日志截断的TechNet文档


5

您要处理的主要问题是每天备份一次日志。引擎的行为是,仅在成功备份日志后,才会删除日志文件中的日志记录(已用空间)。当一个发生检查点时,,但是如果数据库处于完全/批量日志记录恢复中,则只有成功备份日志记录后,才会删除日志记录。

日志备份旨在与完全备份一起使用,并且应在完全备份之间定期运行。尽管我通常每15分钟运行一次日志备份,但是此间隔可以是任何时间段。您的时间间隔取决于恢复点目标(RPO)以及发生恢复时可能丢失的数据量。

如果要执行常规的日志备份,则不必执行常规的文件收缩,因为将在强制增大日志文件空间之前对其进行管理。


-1

我之前也遇到过同样的问题。我的日志文件总是增加,而我每晚都使用完整的数据库备份。所以这是我的解决方案:

  1. 备份当前的日志文件。

  2. 将数据库设置为简单恢复

    • 因为在完全恢复中->日志文件不会删除已提交的事务,它只是重新排列您的数据->刷新文件并不会太大影响->反之亦然。
  3. 将您的日志文件压缩到1 MB或更小(取决于您)

  4. 将数据库设置回完全恢复。

希望对你有帮助

丰陈

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.