博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

日志文件如何影响我数据库的启动

Posted on 2012-02-03 16:56  nzperfect  阅读(408)  评论(0编辑  收藏  举报

原文:http://blogs.msdn.com/b/apgcdsd/archive/2011/12/30/10251946.aspx

截取一段,备查
日志文件如何影响我数据库的启动?

无论你的SQL Server启动,或者你将某数据库重备份中恢复,或者其他的一些情况,总之在你的数据库能够被正常使用之前,你的数据库都会进入 Recovery的状态。http://msdn.microsoft.com/en-us/library/ms190442.aspx 如果这一个步失败,那么你的数据库就会进入Suspect状态而无法正常使用。在一些特殊情况下,这个Recovery所花费的时间会很长。在数据库进入Online状态之前,我们都不能认为SQL Server可以被正常使用了。

那么在Recovery中做了什么呢?

我们可以在你的SSMS中运行如下语句。在运行之前,你可以先按下Ctrl+T来把结果转化成Plain Text格式。

 

sp_readerrorlog会返回自从最近一次SQL Server服务启动,或者Error Log被回收开始的SQL Server的Error Log信息。这里有两个词汇可能会让你感到疑惑。首先,这里的Log和我们上文所说的日志文件(Transaction Log)中的Log不是一件事情。其次,所谓的Error Log,并不是说这里出现了ErrorSQL Server使用这个Error Log记录了很多诊断信息。所以,你可以认为这只是一个普通的记录了很多SQL Server相关信息的日志文件。

 

在结果返回中,你可能会找到上面的这些信息。引号中为在你当前数据库实例下的各个数据库名。

 

以数据库‘CaseLync’为例。由于Error Log会记录当前SQL Server实例下的所有数据库的相关信息,所以你可能会看到和这个数据库相关的日志被顺序地分布在日志的不同地方。在上图中,第一和第二行提及两个词:rolled forward和rolled back。这两个词和我们本文中所提及的Transaction Log息息相关。

在前文中,我们提到过数据修改的过程:先同步的被写入Transaction Log,然后再Checkpoint发生的时候被同步到Data File里。那么,如果我的事物(Transaction)没有被提交(Commit)或者回滚(Rollback),那么这个数据修改是否也在日志文件(Transaction Log)还是在数据文件里(Data File)?

答案是:都在!

SQL Server在记录数据改变时,并不会区分该语句是否有显示的进行事物操作(Begin Transaction,Commit / Rollback Transaction), 或者该事务是否有完成。SQL Server会忠实地记录所有的修改操作。而Begin Transaction和Commit / Rollback Transaction本身也是日志文件需要记录的操作之一。

由于对于事物日志的修改要先于对于数据文件的修改,所以当你的数据库处于Recovery的状态时,那么Transaction Log就会从最近的一个Checkpoint点开始做如下操作:

  1. 如果该操作已在在Transaction Log中,而不在Data File之中,并且如果它使用显式的Transaction操作符而且处于Commit状态,则会发生一次Rolled Forward操作,将该操作同步到Data File之中。
  2. 如果该操作已在在Transaction Log中,而不在Data File之中,并且如果它使用显式的Transaction操作符而且处于Rollback Transaction状态,则会发生一次Rolled back操作,将Data File之中的相关数据修改回滚到Transaction发生之前。
  3. 如果该操作已在在Transaction Log中,而不在Data File之中,并且如果它使用显式的Transaction在日志文件中即没有Commit操作,也没有Rollback操作,则会发生一次Rolled back操作,将Data File之中的相关数据修改回滚到Transaction发生之前。
  4. 如果该操作已在在Transaction Log中,而不在Data File之中,并且如果它没有使用显式的Transaction操作符(Begin Transaction), 则被认为是一个Rolled Forward操作。
  5. 如上步骤都完成后,SQL Server会对该数据库做一个Checkpoint的标识,并写入Transaction Log,表示Data File和Transaction Log已经同步。这表明了数据库的Recovery完成。数据库将进入Online状态,并被正常使用。如果你的数据库在最近的一次Checkpoint到现今的修改操作足够多,在Error Log中也会看到SQL Server用百分比标识Recovery完成的进展。