帮酷LOGO
0 0 评论
文章标签:Server  事务日志  Truncation  log  transaction  

介绍

在 SQL Server 中截断事务日志时常常会出现不同的讨论。 截断常常作为处理日志文件填充或者已经填充的问题提供。 尽管 true 截断日志和收缩日志文件可以能有助于继续数据库使用,但是在它的他的步骤之前。

那么事务日志是什么

正如 NAME 所暗示的,事务日志用于存储持续和过去事务及它的状态的信息。 从恢复角度来看,这是数据库中最重要的文件之一。 在事务日志中,你可以将数据库恢复到最新情况,以防发生灾难。 此外,如果需要,还可以将数据库恢复到特定的point-in-time,忽略以后的操作。

日志文件本身的( 文件或者文件) 使用循环。 这意味着日志文件是从开始的,但是到达文件结束时,日志信息从文件开始开始。 只有在开始时有可用空间时才发生这种情况。 如果文件中没有空间,则会扩展文件,如果可能的话。 文件扩展受文件的自动增长设置限制,当然也受剩余磁盘空间的限制。

日志文件内容逻辑上分为三个不同类别:


  • 这包含写入事务日志但可以删除的日志记录
  • 活动部分
    这是事务日志的一部分,它由最早的活动事务定义。 这里信息在事务仍处于活动状态时无法删除
  • 未使用的部分
    这是空空间

从事务日志中删除日志记录时,将清除所使用的部分。 活动部分仍然保留,例如可以能的回滚 等等 将日志记录从日志或者日志备份操作中删除。

恢复模式

对于恢复模式,管理员基本上定义了在灾难发生时可以恢复什么。 有三种不同的恢复模式: Full Full bulk bulk bulk bulk Simple Simple Simple。 本文简要讨论了完整和简单的大容量日志恢复模型。

简单恢复模式

简单恢复模式是使用的'最容易'。 从备份角度看,完整备份需要在一段时间内运行。 这里上下文中的完整备份指的是整个数据库备份或者备份所有读写文件。 当恢复完成时,数据库的内容将在备份末尾的时刻还原。 对于简单恢复模型,这是可以实现的'最佳',因此获取完整数据库备份非常重要。

从事务日志角度使用简单恢复模式表示:

  • 每次发生检查点时都会清除事务日志
  • 无法执行日志备份

因此,如果使用简单恢复模型,事务日志经常清除,并且不会太长。 缺点当然没有实际恢复可以完成,数据库只能恢复。

完整恢复模式

此外,完整恢复模式最大差异是当检查点发生时,事务日志的开销为 cleared。 相反,新的日志记录不断地堆积到事务日志中,因为数据库中发生了更改。 清除事务日志的正确方法是定期执行日志备份。 日志备份操作结束时,成功的日志备份操作会清除事务日志的使用部分。 前面提到的检查点的区别在于,对数据的修改在备份时是安全的。

日志增长得太大了

这就是经常被提及的问题。 日志不断增长,或者已经过大,无法容忍。 根据前面的描述,你应该首先检查恢复模型。 下面是一个小清单:

  • 是否使用简单恢复模式?
    • 检查点中的事务日志应该自动清除
    • 你有长事务?
      记住,日志的活动部分从第一个活动事务的开始开始,即使是一周的旧事务。 无法清除日志的这一部分。
  • 是否使用完整恢复模式?
    • 是否已经定义事务日志备份?
    • 已经成功完成事务日志备份?
    • 事务日志备份是否经常运行?
    • 和前面的问题一样,你有过长的事务?

这些问题可以让你清楚地了解到什么是导致这种情况的原因。

如果日志文件未满,但已经增长过多,那么 truncate truncate truncate truncate。 相反,如果使用简单恢复模型,应该调查长期运行的事务,并使用数据库搜索应用程序中可能存在的缺陷。

如果你正在使用完整恢复模式集中于事务日志备份,可能是一些错误。 当然,一个自然的问题是,你需要完整的恢复模型? 如果是生产环境,那么答案很可能是。 但是,如果你不需要恢复到最后一个时间点( 或者特定的时间点),那么你可以考虑将恢复模型更改为简单模式。

日志已满

这是一个更严重的情况,特别是当你使用完整恢复模型。 当日志变满并且不能再增长时,通常会出现一个错误。<a href="http://msdn.microsoft.com/en-us/library/aa337278%28v%3Dsql.105%29.aspx">9002</a> 引发。例如:

Msg 9002, Level 17, State 4, Line 3The transaction log for database 'Database name'is full due to 'ACTIVE_TRANSACTION'. 

也就是说,只有事务日志中有足够可用空间时,才能成功执行更改数据库状态的操作。 但是英镑也意味着不能保证所有必要的信息都记录在事务日志中。

以前的检查列表同样适用,但是由于日志已经满了,你还应该检查日志 file(s)的自动增长设置。 它是否正确定义,或者应该让日志更长?

无论决定让日志增长多少,日志可以在这样的情况下被截断。 在 SQL Server的早期版本中,通过发出特殊的日志备份命令来完成这里操作:

BACKUP LOG WITH TRUNCATE_ONLY; 

基本上,这与简单恢复模型中的检查点相同;可以删除的内容被丢弃以获得可用空间。

在 SQL Server 2008和更新版本中,这个命令已经被停止,而你必须实际改变为简单恢复模式。 使用事务处理sql可以通过发出

ALTERDATABASE <database name> SET RECOVERY SIMPLE; 

截断日志( 一种方式或者另一种方式) 也意味着在完整恢复模式中,日志链被破坏为。 当日志成满时,日志链已经断开了。 但是,在完整恢复模式中,你不能在这里停止。

能够将数据库恢复到日志链必须完整的最后一点。 日志链意味着在事务日志中记录数据库文件内容的所有操作,因这里可以在日志备份中找到。 使用日志备份,可以使用日志记录恢复数据库。 由于事务日志已经满,因这里某些东西最有可以能丢失,因为日志被截断,某些东西绝对丢失。

下一步

如果你使用完全恢复模式,并且切换到简单的日志,不要忘记将它转换为完全恢复模式。 若要将更新模型设置为 SQL Server的较新版本中的完整模式,请发出

ALTERDATABASE <database name> SET RECOVERY FULL; 

截断事务日志后,请考虑是否应该收缩或者不收缩日志文件。 如果你使用完全恢复模式并决定让文件更进一步,那么将不会收缩日志。 另一方面,如果日志备份经常运行,则可以能有意义地缩小文件以获得更多磁盘空间。

特别是,如果决定永久地从完全恢复模式更改为简单恢复模式,那么日志将不会太大。

收缩日志文件是使用DBCC命令完成的。 简而言之,要缩小日志,请执行以下操作:

DBCC SHRINKFILE (<name of the logfile>, <target size>) 

最后,但是最重要的步骤是确保你在备份历史中有一个有效的情况。 如前所述,如果使用完全恢复模式,可以恢复数据库,则需要有一个有效的完整数据库备份。 现在,由于上一个日志备份链在日志满的地方无法使用,因此需要一个新的起始点以便可能恢复。

通常最简单的方法是使用全新的数据库备份。 如果任务有预定义的任务,则可以运行该任务或者手动发出命令。

完成所有这些步骤后,你应该再次有一个有效的情况,并且能够睡眠良好。 当某些特殊事件发生或者你对备份有任何疑问时,建议从最新备份中测试它们的完整性。

引用

有关本文中提到的命令的更多信息:

历史记录

  • 第八个 2012年05月: 已经创建。
  • 第九个 2012年08月: 次要更正和格式化


文章标签:Server  log  transaction  事务日志  Truncation  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语