(2.18)备份与还原--还原的原理与总结

一、还原的过程
还原过程主要分为3个阶段。
1. 数据复制
  此阶段将从数据库的备份介质将所有数据、日志和索引页复制到数据库文件中。完成这个阶段后,数据库被恢复到备份介质所包含的最后一个检查点。
2. 重做(前滚)
  此阶段将记录的事务应用到从备份复制的数据,以将这些数据前滚到恢复点。此阶段将使数据库从最后一个检查点前滚到恢复点(recovery point)的最后一笔交易。
重做(前滚)阶段阶段后,数据库通常有未提交的事务,并处于“正在恢复,不可用”的状态。
3. 撤消(回滚)
  此阶段将撤消(回滚)任何未提交的事务。撤消(回滚)阶段后,数据库可供用户使用。

  


二、还原的过程示例
以下是一个事务的示例
  LSN01 提交事务1 LSN02 检查点 LSN03 执行事务2 LSN04 执行“完整备份1”(备份导致检查点) LSN05 执行事务3 LSN06 检查点 LSN07 提交事务2 LSN08 执行“事务日志备份1”(恢复点)
恢复过程如下:
(1)第一阶段:将通过备份介质“完整备份1”,恢复到LSN04(即备份介质所包含的最后一个检查点)。这个过程主要是以“区”为单位直接将数据页面复制到数据库文件中。
(2)第二阶段:根据备份介质“事务日志备份1”的记录,前滚到LSN08(即数据库的“恢复点”)。此阶段后,LSN05和LSN07都被执行,被回写到数据页面,但此时尚不确定LSN05事务是否被提交,因此,此时数据库的状态为“正在恢复,不可使用”,需要等待后续阶段。
(3)第三阶段,在备份介质“事务日志备份1”中没有发现LSN05被提交的日志记录,因此需要回滚未提交的事务,即撤消LSN05。此阶段后,数据库可正常使用,且恢复到“恢复点”。
完成上述3个阶段后,事务2被提交(根据根据LSN07),事务3被回滚(因为事务3在LSN08时未提交)。

三、还原的操作方法
1. T-SQL
示例:

RESTORE DATABASE [db01] FROM DISK = N'C:\backup\DB01_Data_BAK.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10 GO 

RESTORE LOG [db01] FROM DISK = N'C:\backup\DB01_Log_BAK.bak' WITH FILE = 2, NOUNLOAD, STATS = 10 GO

2.SSMS

  

三、还原的恢复状态  

在一个或多个备份已还原后,恢复通常会包含重做和撤消两个阶段。
  在重做阶段已前滚所有日志事务后,数据库中通常包含在恢复点处未提交的事务所做的更改。这会导致前滚数据在事务上不一致。恢复过程通过打开事务日志来标识未提交的事务。通过回滚未提交的事务以将它们撤消。撤消的方式可能会受到以下目标的影响。
(1)目标1:为了使数据库立即可用,需要马上回滚未提交的事务。
(2)目标2:未提交的事务应由下一个备份中的事务日志来标识。
根据上述不同的目标,数据库的恢复状态就会有3种:
1. 已还原(RESTORE ... WITH RECOVERY)
  WITH RECOVERY 包含重做和撤消两个阶段,并可以恢复数据库。这是默认设置。恢复完成后,数据库联机。
2. 正在还原(RESTORE ... WITH NORECOVERY)
  WITH NORECOVERY 省略撤消阶段以保留未提交的事务。省略撤消阶段允许还原其他备份以将数据库进一步前滚。
3. 备用(RESTORE ... WITH STANDBY)
  第三种方法 WITH STANDBY 指定一个允许撤消恢复效果的备用文件(在 SQL Server 2000 中,该文件被称为“撤消文件”)。
备用文件用于为 RESTORE WITH STANDBY 的撤消过程中修改的页面保留一个“写入时副本”预映像。备用文件允许用户在事务日志还原期间以只读方式访问数据库,并允许数据库用于备用服务器情形,或用于需要在日志还原操作之间检查数据库的特殊恢复情形。
  该文件与其它数据库文件不同,数据库引擎仅在活动还原操作过程中持续打开该文件。当数据库处于 STANDBY 状态时,您应将这个备用文件视为和任何其他数据库文件同样重要。执行完 RESTORE WITH STANDBY 操作之后,下一个 RESTORE 操作会自动删除撤消文件。如果在下一个 RESTORE 操作之前手动删除了这个备用文件,则必须重新还原整个数据库。SSMS中如下。

  

四、恢复路径示例
以下是一组连续备份示例:

00:00 事务日志备份LOG1 
01:00 完整备份FULL1
04:00 事务日志备份LOG2
08:00 事务日志备份LOG3
09:00 差异备份DIFF1
12:00 事务日志备份LOG4
16:00 事务日志备份LOG5
19:00 差异备份DIFF2
20:00 事务日志备份LOG6


如果要恢复点设为20:00,那么可以有很多种恢复路径。
恢复路径1:FULL1(WITH NORECOVERY) - DIFF2(WITH NORECOVERY) - LOG6(WITH RECOVERY)
恢复路径2:FULL1 (WITH NORECOVERY)- LOG2(WITH NORECOVERY) - LOG3 (WITH NORECOVERY)- LOG4 (WITH NORECOVERY)- LOG5(WITH NORECOVERY) - LOG6(WITH RECOVERY)
恢复路径3:FULL1(WITH NORECOVERY) - DIFF1(WITH NORECOVERY) - LOG4(WITH NORECOVERY) - LOG5(WITH NORECOVERY) - LOG6(WITH RECOVERY)
  恢复路径的建议
1. 一般情况下,尽量使用完整备份与差异备份的介质集恢复到最近的一次备份时点。这是因为,完整备份和差异备份基本上是以“区”为单位的直接复制,通常认为这种恢复方式的速度最快。
2. 如果使用事务日志备份的介质集进行恢复,那么数据库引擎将根据日志记录对你的业务进行一次“重演”直到恢复点,这个过程可能非常漫长。如果日志增长较快(例如,事务日志备份的介质集非常大),请考虑在完整备份的计划期间增加一个或多个差异备份,以提升恢复的速度。
3. 对于数据文件非常大的数据库,如果频繁发生大量数据页面的修改(例如,差异备份的介质集非常大),使用事务日志备份的介质集进行恢复也是一个不错的选择。

五、还原到时间点与时间线

1、确认恢复模式
只有完整恢复模式才可以恢复到某个时间点。如果是其它恢复模式(简单恢复模式,或者大容量日志恢复模式),都只能恢复到备份的最后时间(完成时间),即只可以恢复到“最近状态”。

  

2.时间点还原

  (1)指定时间点(前提是先选好备份集,一般只能是全备加事务备才有)

  

  其实现时点还原的原理是依次实现以下步骤:

1. SQL Server 首先通过完整备份(或者加上差异备份)的备份集,恢复到该备份集的最后一个检查点(此处记为A)。
2. 再使用事务日志备份的备份集,从A开始重做之后的日志,直到指定的时间点为止(此处记为B)。
3. 如果让数据库立即可用,则从B开始将未提交的事务回滚(撤销)。否则,保持数据库为“正在恢复状态”,不可访问。

   (2)备份时间线

  

SQL Server 2012提供了一个“数据库恢复顾问”,此功能可以实现以下功能:
1. 提供图形界面,以“备份时间线”的图形方便用户选择。同时,还显示当前有哪些备份可用。

  

猜你喜欢

转载自www.cnblogs.com/gered/p/9204726.html