SQL Server 事务日志收缩小结

对于每一个数据库来讲,都需要至少一个事务日志文件。事务日志文件是整个数据库的血液,如果没有事务日志的话,那么将无法进行任何操作。 
  • 事务日志有什么东西?

  事务日志记录着在相关数据库上的操作,同时还存储数据库恢复(recovery)的相关信息。

 

  事务日志与数据库恢复(recovery)是密切相关的,其实数据库在启动时,便会进行相关的恢复(recovery)操作,如下所示。当然,在数据库还原时,也可以指定手工恢复(recovery).任何在数据库上的改变,如果在事务日志内被标记为已提交,并用一个LSN(LOG SEQUENCE NUMBER)来标识,同时相关改变就会体现在数据文件上,而被标记为未提交的改变将不会体现在数据文件上。

 

  2010-01-12 18:31:48.72 spid7s      Recovery is complete. This is an informationa message only. No user action is required.

 

 

  事务日志文件还存储着数据库需要回滚的相关信息。在SQL Server数据库上,默认是隐式提交的,也就是说在查询分析器里面进行的每一个操作,在操作完成后,都是默认已经commit,但如果通过指定begin tran 和rollback tran的命令来标识事务时,rollback tran就需要使用事务日志内的相关信息才可以回滚。当然,如果SQL Server遇到相关错误时,如死锁,那么也会产生一个内部回滚,这些都需要用到事务日志文件。

  • 为什么要收缩事务日志?

  收缩日志的原因有很多种,有些则是考虑空间不足,有些则是应用程序限制导致的,一般情况下,是不建议对事务日志进行其他改变的,如需要控制事务日志的大小,则可以通过安排事务日志备份来解决。如果确定事务日志包含将不再使用的未使用空间,则可以通过减少事务日志的大小,以便回收过多空间。但这种情况对于一个DBA来讲,应该要尽量避免。

 

  仅当数据库处于联机状态,而且至少一个虚拟日志文件可用时,收缩才会发生。在某些情况下,直到下一个日志截断后,才能收缩日志。

  • 事务日志收缩的原理

 

  每个事务日志由多个虚拟日志文件组成(virtual log file).虚拟日志文件没有固定的大小,也没有固定的个数。在创建事务日志文件或者扩展事务日志文件时,SQL SERVER便会自动创建合适大小的虚拟日志文件,DBA无法控制虚拟日志文件的大小和个数。在扩展日志文件后,虚拟文件的大小是现有日志大小和新文件增量大小之和。因此,如果在创建数据库时,对数据库指定了比较小的初始大小,又指定了比较小的日志增长量,随着事务日志的自动扩展,虚拟日志文件个数会越来越多,从而影响了数据库性能。因此,在创建数据库时,尽量指定比较合适的初始事务日志大小,同时指定合理的事务日志增长量,这点可以参考数据文件的标准。如果大于10G或者更大的话,则指定固定的增长量,如果比较小,则指定按百分比的增长量来进行。

 

  以下部分引用文档:

 

对于日志文件,当前大小与虚拟日志文件使用的页的总大小相同。不能释放包含任何逻辑日志部分的虚拟日志文件。如果日志文件中的所有虚拟日志文件都包含逻辑日志部分,则此日志文件不能收缩。通过日志截断将一个或多个虚拟日志文件标记为非活动之后,才能进行收缩。

收缩文件操作只能删除不活动的虚拟日志文件。如果未指定目标大小,收缩文件操作仅删除文件中最后一个活动虚拟日志文件后面的不活动虚拟日志文件。如果指定目标大小,则给定收缩文件操作仅删除足够多的不活动虚拟日志文件,以接近但不超过目标大小。收缩之后,日志文件通常稍大于目标大小,但永远不会小于目标大小。由于虚拟日志文件的存在,因此很难预测日志文件的实际收缩程度。

在收缩任何文件时,必须从文件的末端开始释放空间。在收缩事务日志文件时,将从日志文件的末端释放足够的虚拟日志文件,以便将日志减小到用户所要求的大小。用户指定的 target_size 将圆整为下一个最大的虚拟日志文件边界。例如,如果用户为包含六个 100 MB 虚拟日志文件的 600 MB 的示例文件指定 325 MB 的 target_size,则最后两个虚拟日志文件将删除,新的文件大小为 400 MB。

 也就是说有时候虽然截断了事务日志,但有可能仍然无法将事务日志收缩至自己预期的大小。

  • 如何收缩日志文件?

  收缩日志文件,在不同版本上有着不同的方法,但本文只研究SQL Server2008的,其它版本暂不讨论。

 

 

  1、当数据库恢复模式为简单时。可以直接通过图形界面或者使用dbcc shrinkfile (logfile_name,target_size)命令来完成。如

 

     

[c-sharp] view plain copy
  1. use mydb  
  2. dbcc shrinkfile (mydb_log,10) --将mydb_log收缩至10m  

 

   2、当数据库恢复模式为完全时。可以先将数据库模式改为简单模式,再使用上述方法来进行。

 

     

[c-sharp] view plain copy
  1. use master  
  2. alter database mydb set recovery simple  
  3. dbcc shrinkfile (mydb_log,10) --将mydb_log收缩至10m  

 

也可以直接备份事务日志文件后再收缩:

 

     

[c-sharp] view plain copy
  1. use master  
  2. backup log mydb to disk='d:/dd.bak'  
  3. use mydb  
  4. dbcc shrinkfile (mydb_log,10) --将mydb_log收缩至10m;  

 

   3、通过分离数据库,然后再删除事务日志文件,再附加mdf数据文件,也可以达到某种意义上的事务日志收缩。

猜你喜欢

转载自blog.csdn.net/tan88881111/article/details/80623821