SQL Server的实例恢复解析

栏目: 数据库 · SQL Server · 发布时间: 6年前

内容简介:SQL Server的实例恢复解析

在SQL Server数据库中,事务日志用于记录事务在Buffer Cache中的做的页更改。

当我们更新一些数据时,数据库会把相关数据页的前镜像和后镜像都记录在事务日志中,并为每个事务生成一个唯一的LSN(log seq number),在检查点发生时SQL Server确保检查点LSN之前的脏块被全部写入到磁盘。因此SQL Server的事务日志兼有redo和undo的作用。

但是,如果我们的 数据库被强制关闭或者服务器异常掉电重启,数据库就将处于非一致性的状态 (没业务的库除外),这意味检查点之后的所有事务(无论是提交还是未提交的),都出现了异常,提交的事务可能脏块未被写入磁盘,未提交的长事务可能有一部分脏块已经被写入到磁盘,数据库必须处于一致状态才能被正常打开,因此 此时必须进行实例恢复

SQL Server的实例恢复分两个阶段:

1.前滚

此阶段只处理已提交的事务,根据boot page中记录的检查点和事务日志的记载,SQL Server重构检查点之后的内存脏块并按正常机制提交已提交事务的脏块。

对未提交事务的脏块暂时不做操作。

2.回滚

此阶段处理未提交的事务,SQL Server根据事务日志中记载的更改块前镜像,去覆盖硬盘上那些未提交事务涉及的数据块。

总结一下:

1)实例恢复的目的:

  • 将所有已提交事务的脏块写入磁盘。
  • 回滚未提交的事务。
  • 将检查点推进至已被写入磁盘的事务LSN。

2)实例崩溃之前:

  • 一些已提交的事务被事务日志记录,但是脏块未被写入到磁盘
  • 一些未提交的长事务中的脏块已经被写入到磁盘
  • 一些未提交的事务,其日志还留在log buffer中未被写入到磁盘中的事务日志文件。

3)实例恢复阶段:

  • Log buffer中所有未提交事务的日志在掉电时全部被清空。(已提交事务的日志默认被写入了磁盘事务日志文件)
  • 从boot page中识别出上一个检查点,作为实例恢复的起点。
  • 在前滚阶段,SQL Server根据事务日志的记录对所有脏块进行重现。(无论是提交还是未提交的事务)然后将已提交事务的脏块写入磁盘,对未提交事务的脏块暂不作操作。
  • 在回滚阶段,SQL Server根据事务日志中记载的前镜像对所有未提交的事务进行回滚。
  • 更新boot page中的检查点LSN和事务日志中的LSN。

在以上的介绍中我们提到了boot page,那么什么是boot page呢?

每个数据库都会有一个记录数据库重要信息的页,只有一页一般是   PRIMARY filegroup的第9个页。我们可以使用如下命令查看这一页的信息:

DBCC TRACEON (3604);
go
DBCC PAGE ( 'test' ,1,9,0)
go
关于DBCC PAGE的用法这里解释一下:
dbcc page ( { 'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
The printopt parameter has the following meanings:
0 - print just the page header
1 - page header plus per-row hex dumps and a dump of the page slot array (unless its a page that doesn't have one, like allocation bitmaps)
2 - page header plus whole page hex dump
3 - page header plus detailed per-row interpretation

检查点LSN被记录在boot page中,这是实例恢复的起点,如果这个page无法被访问,那么数据库就不能被附加,打开,或者做其他任何操作。检查点LSN只会被记录在bootpage中,因此这是一个对于实例恢复来说不可或缺的页。

对于SQL Server中检查点的解释:

当检查点发生时,无论这个检查点是如何触发的(手动执行检查点命令,或者数据库执行差异差异备份,或者数据库自动生成的检查点),数据库都会做以下操作:

  • 所有的脏块都被写入磁盘,无论事务是否已提交。
  • 在这些脏块被写入磁盘之前,所有关于这些脏块更改的事务日志也要被从log buffer中写入到磁盘,这样可以确保实例恢复的有效性和有序性,这个操作被称作write-ahead logging(日志先写),日志被写入硬盘的操作是严格按时间序列化的,不可能以事务为单位来离散的写入到磁盘,因此某个脏块的写入磁盘操作,可能引发log buffer中一些之前的、与本脏块无关的事务日志也被写入磁盘。但这是有好处的,事务日志总是被越早写入磁盘越好。
  • 检查点的LSN会被记录到数据库boot page中的 dbi_checkptLSN���域。

这里可以复习一些Oracle的检查点机制,也是CKPT进程触发DBWR写脏块,同时如果要写的脏块的scn大于LGWR的scn,DBWR也会触发LGWR把要写的脏块的相关log buffer写入redo文件中,与SQL Server日志先写的机制相似。


以上所述就是小编给大家介绍的《SQL Server的实例恢复解析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Producter 让产品从0到1

Producter 让产品从0到1

周楷雯 / 人民邮电出版社 / 2016-12-25 / CNY 69.00

这是一本以App Store首页推荐的成功App为例阐述如何完成一款App产品的设计、开发和营销的书。在这本书之后,作者的《一炷香》和《字里行间》两款产品也接连被App Store首页推荐。 《Producter 让产品从0到1》从产品的设计、产品的实现、产品的迭代、产品的营销、产品的进阶等几个角度,全面讲解了产品设计的基本原则、设计的重要性、设计的感觉、实用的设计工具、简单的iOS开发、产......一起来看看 《Producter 让产品从0到1》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试