(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 BY 操作之后,下一个 RESTORE 操作会自动删除撤消文件。如果在下一个 RESTORE 操作之前手动删除了这个备用文件,则必须重新还原整个数据库。SSMS中如下。

RESTORE DATABASE TestDB4 
WITH  STANDBY = N'D:\ROLLBACK_UNDO_TestDB4.BAK'

 

  

 

五、恢复路径示例

以下是一组连续备份示例:

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. 提供图形界面,以“备份时间线”的图形方便用户选择。同时,还显示当前有哪些备份可用。

  

 

 

 

本文主要来源于Microsoft《SQL Server 2008 R2联机丛书》。转裁请注明出处。

一、还原用户数据库

1、“还原数据库”基本操作

121117895.png

(1)目标数据库

  在该列表中输入要还原的数据库。您可以输入新的数据库,也可以从下拉列表中选择现有的数据库。该列表包含了服务器上除系统数据库 master 和 tempdb 之外的所有数据库。

  注意: 若要还原带有密码保护的备份,必须使用 RESTORE 语句。  

(2)目标时间点

  将数据库还原到备份的最近可用时间,或还原到特定时间点。默认为“最近状态”。若要指定特定的时间点,请单击“浏览”按钮。

121551138.png

 

  日期和时间按客户端的区域设置指定。

(3)源

   “还原的源”面板中的选项可标识数据库的备份集的位置以及要还原的备份集。

  • 源数据库

  从该列表框中选择要还原的数据库。此列表仅包含已根据 msdb 备份历史记录进行备份的数据库。

  • 源设备

  选择包含要恢复的一个或多个备份的逻辑或物理备份设备(磁带或文件)。

  若要选择一个或多个逻辑或物理备份设备,请单击浏览按钮,这将打开“指定备份”对话框。在此,最多可以选择属于一个介质集的 64 个设备。磁带机必须与运行 SQL Server 实例的计算机进行物理连接。备份文件可以位于本地或远程磁带设备上。

  退出“指定备份”对话框时,选择的设备将在“源设备”列表中显示为只读值。

(4)备份集

  “选择用于还原的备份集”网格中显示可用于指定位置的备份集。每个备份集(单个备份操作的结果)分布在介质集的所有设备上。默认情况下,会建议制定一个恢复计划,以实现基于所选必需备份集执行的还原操作目标。SQL Server Management Studio 使用 msdb 中的备份历史记录来标识还原数据库所需的备份并创建还原计划。例如,为了进行数据库还原,还原计划将选择最近的完整数据库备份,然后选择最近的后续差异数据库备份(如果有)。在完整恢复模式下,还原计划随后将选择所有后续日志备份。

  若要覆盖建议的恢复计划,可以更改网格中的选择。如果备份所依赖的备份已取消选择,将自动取消对它们的选择。

 

2、还原选项

120349994.png

(1)覆盖现有数据库

  还原一般会防止意外使用一个数据库覆盖另一个数据库。如果 RESTORE 语句中指定的数据库已存在于当前服务器上,并且指定的数据库名称与备份集中记录的数据库名称不同,则不还原该数据库。这是一项重要的安全保护措施。

  注意:应尽可能避免使用 REPLACE,而且在使用该选项之前必须仔细考虑。

  使用 REPLACE 选项后,就会忽略还原时通常执行的几项重要安全检查。忽略的检查如下:

  • 还原时使用其他数据库的备份覆盖现有数据库。

  使用 REPLACE 选项后,即使指定的数据库名称与备份集中记录的数据库名称不同,还原也允许您使用备份集中任何一个数据库覆盖现有数据库。这会导致一个数据库意外覆盖另一个数据库。

  • 在没有获取结尾日志备份并也没有使用 STOPAT 选项的情况下,使用完整恢复模式或大容量日志恢复模式对数据库进行还原。

  使用 REPLACE 选项后,由于没有备份最近写入的日志,您会丢失提交的作业。

  • 覆盖现有文件。

  例如,可能会错误地覆盖错误类型的文件,如 .xls 文件或非联机状态的其他数据库正在使用的文件等。如果覆盖现有文件,则即使所还原的数据库是完整的,也有可能丢失某些数据。

2) 保留复制设置

  将已发布的数据库还原到创建该数据库的服务器之外的服务器时,保留复制设置。此选项只适用于在创建备份时对数据库进行了复制的情况。选择此选项等效于在 RESTORE 语句中使用 KEEP_REPLICATION 选项。

  仅在选择“回滚未提交的事务,使数据库处于可以使用的状态”选项(在本表的后面部分中说明)时,此选项才可用,其功能等效于使用 RECOVERY 选项还原备份。

(3)还原每个备份之前进行提示

  指定在还原了每个备份之后,将显示“继续还原”对话框,询问您是否要继续还原顺序。该对话框将显示下一个介质集(如果已知)的名称以及下一个备份集的名称和说明。

  此选项允许您在还原了任何备份后暂停还原顺序。如果必须为不同介质集更换磁带,例如在服务器仅具有一个磁带设备时,此选项非常有用。准备就绪后,请单击“确定”以继续。

  可以通过单击“否”中断还原顺序。这样可以使数据库保持还原状态。在日后方便的时候,可以通过恢复执行“继续还原”对话框中所列出的下一个备份,继续该还原顺序。还原下一个备份的过程取决于其是否包含数据或事务日志,如下所示:

  • 如果下一个备份是完整备份或差异备份,请再次使用“还原数据库”任务。

  • 如果下一个备份是文件备份,请使用“还原文件和文件组”任务。

  • 如果下一个备份是日志备份,请使用“还原事务日志”任务。

(4)限制访问还原的数据库

  使还原的数据库仅供 db_owner、dbcreator 或 sysadmin 的成员使用。选择此选项等效于在 RESTORE 语句中使用 RESTRICTED_USER 选项。

(5)将数据库文件还原为

  显示一个网格,列出数据库的每个数据文件或日志文件的原始完整路径和每个文件的还原目标。可以通过为文件指定新的还原目标,移动您要还原的数据库。

 

3、注意事项

  将 SQL Server 2005 或 SQL Server 2000 数据库还原到 SQL Server 2008 R2 后,该数据库将立即变为可用,然后自动升级。

  如果数据库具有全文索引,升级过程将导入、重置或重新生成它们,具体取决于“全文升级选项”服务器属性的设置。如果升级选项设置为“导入”或“重新生成”,则全文索引将在升级过程中不可用。导入可能需要数小时,而重新生成所需的时间最多时可能十倍于此,具体取决于要编制索引的数据量。另请注意,如果将升级选项设置为“导入”,并且全文目录不可用,则会重新生成关联的全文索引。

 

4、“还原文件和文件组”基本操作

  可以指定数据库文件或文件组还原操作。

142425558.png

 

二、恢复系统数据库

  SQL Server 维护一组系统级数据库(称为“系统数据库”),这些数据库对于服务器实例的运行至关重要。

1、系统数据库的成员

(1) master 记录 SQL Server 系统的所有系统级信息的数据库。若要还原任何数据库,必须运行 SQL Server 实例。只有在 master 数据库可供访问且至少部分可用时,才能启动 SQL Server 实例。

  可以将 master 数据库的恢复模式设置为 FULL 或 BULK_LOGGED。但是,master 数据库不支持 BACKUP LOG。

(2) msdb 是SQL Server 代理用来安排警报和作业以及记录操作员信息的数据库。msdb 还包含历史记录表,例如备份和还原历史记录表。

  如果要在恢复用户数据库时使用 msdb 数据库中的备份与还原历史记录信息,则建议对 msdb 数据库使用完整恢复模式。此外,请考虑将 msdb 事务日志放在容错存储设备上。

(3)model 保存在 SQL Server 实例上为所有数据库创建的模板。

  新创建的用户数据库与 model 数据库使用相同的恢复模式。若希望新数据库使用简单恢复模式,请将 model 的恢复模式更改为 SIMPLE。

  最佳做法: 推荐您根据需要只创建 model 的完整数据库备份。由于 model 小且很少更改,因此无需备份日志。

(4)tempdb 用于保存临时或中间结果集的工作空间。服务器实例关闭时,将永久删除 tempdb 中的所有数据。

  需要使用简单恢复模式,以便始终自动回收 tempdb 日志空间。不能备份 tempdb 数据库。每次启动 SQL Server 实例时都会重新创建此数据库。

(5) Resource 包含 Microsoft SQL Server 2005 或更高版本附带的所有系统对象副本的只读数据库。这是一个隐藏数据库,位于 mssqlsystemresource.mdf 文件中,该文件仅包含代码。因此,SQL Server 不能备份 Resource 数据库。

  恢复模式无关紧要。SQL Server 备份不能备份 Resource 数据库。

(6)如果有任何数据库在服务器实例上使用了复制,则还会有 distribution 系统数据库。 此数据库存储元数据、各种复制的历史记录数据以及用于事务复制的事务。

 

2、还原 master 数据库

可以通过下列两种方式之一将该数据库返回到可用状态:

(1)从当前数据库备份还原 master。

  如果可以启动服务器实例,则应能够从完整数据库备份还原 master。只能从对 SQL Server 2008 实例创建的备份中还原 master 数据库。

  如果创建数据库备份后更改了 master 数据库,则那些更改在还原备份时将丢失。若要恢复这些更改,必须执行可以恢复已丢失更改的语句。例如,如果自执行备份后创建了一些 SQL Server 登录名,则这些登录在还原 master 数据库后会丢失。必须使用 SQL Server Management Studio 或创建登录名时使用的原始脚本,重新创建这些登录名。

  重要提示:如果有些数据库已不存在,但在还原的 master 数据库备份中引用了那些数据库,则 SQL Server 可能会由于找不到那些数据库而在启动时报告错误。还原备份后应删除那些数据库。

  还原 master 数据库后,SQL Server 实例将自动停止。如果需要进一步修复并希望防止多重连接到服务器,应以单用户模式启动服务器。否则,服务器会以正常方式重新启动。如果决定以单用户模式重新启动服务器,应首先停止所有 SQL Server 服务(服务器实例本身除外),并停止所有 SQL Server 实用工具(如 SQL Server 代理)。停止服务和实用工具可以防止它们尝试访问服务器实例。

(2)完全重新生成 master。

  如果由于 master 严重损坏而无法启动 SQL Server,则必须重新生成 master。接下来,应该还原最新的 master 完整数据库备份,因为重新生成数据库将导致所有数据丢失。

  重要提示:重新生成 master 将重新生成所有系统数据库。重新生成 master、model、msdb 和 tempdb 系统数据库时,将删除这些数据库,然后在其原位置重新创建它们。如果在重新生成语句中指定了新排序规则,则将使用该排序规则设置创建系统数据库。用户对这些数据库所做的所有修改都会丢失。例如,您在 master 数据库中的用户定义对象、msdb 中的预定作业或 model 数据库中对默认数据库设置的更改都会丢失。

  将 SQL Server 2008 安装介质插入到磁盘驱动器中,或者在本地服务器上,从命令提示符处将目录更改为 setup.exe 文件的位置。在服务器上的默认位置为 C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release。

  在命令提示符窗口中,输入以下命令。方括号用来指示可选参数。不要输入括号。在使用 Windows Vista 操作系统且启用了用户帐户控制 (UAC) 时,运行安装程序需要提升的特权。必须以管理员身份运行命令提示符。

Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts /[ SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]

  分析:

    INSTANCENAME:实例名~一般默认是MSSQLSERVER

    SQLSYSADMINACCOUNTS:管理员账号~一般是sa

    SAPWD:管理员密码

    SQLCOLLATION:排序规则

  在安装程序完成系统数据库重新生成后,它将返回到命令提示符,而且不显示任何消息。请检查 Summary.txt 日志文件以验证重新生成过程是否成功完成。此文件位于 C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Logs。

  重新生成数据库后,您可能需要还原 master、model 和 msdb 数据库的最新完整备份。有关详细信息,请参阅备份和还原系统数据库的注意事项。

  重要提示: 如果更改了服务器排序规则,请不要还原系统数据库。否则,将使新排序规则替换为以前的排序规则设置。

  如果没有备份或者还原的备份不是最新的,请重新创建所有缺失的条目。例如,重新创建用户数据库、备份设备、SQL Server 登录名、端点等缺少的所有条目。重新创建这些条目的最佳方法是运行创建它们的原始脚本。

 

3、还原 model 数据库或 msdb 数据库

  还原 model 或 msdb 数据库与对用户数据库执行完整的数据库还原相同。在下列情况下,需要从备份中还原 model 数据库或 msdb 数据库:

  • 重新生成了 master 数据库。

  • model 数据库或 msdb 数据库已损坏(例如由于媒体故障)。

  • 修改了 model 数据库。在这种情况下,重新生成 master 数据库时必须从备份还原 model 数据库,因为重新生成主控实用工具将删除并重新创建 model 数据库。

  重要提示:只能从在服务器实例当前运行的 SQL Server 版本上创建的备份中还原系统数据库。例如,若要还原在 SQL Server 2005 SP1 上运行的服务器实例上的系统数据库,则必须使用在服务器实例升级到 SQL Server 2005 SP1 之后所创建的数据库备份。

  如果 msdb 包含系统使用的计划或其他数据,则必须在重新生成 master 时从备份还原 msdb,因为实用工具会删除并重新创建 msdb。这将导致丢失所有计划信息以及备份和还原历史记录。如果 msdb 数据库没有还原并且无法访问,则 SQL Server 代理将无法访问或启动任何以前安排的任务。因此,如果 msdb 包含系统使用的计划或其他数据,则必须在重新生成 master 时还原 msdb。

  不能还原用户正在访问的数据库。如果 SQL Server 代理正在运行,它可以访问 msdb 数据库。因此,在还原 msdb 之前,请先停止 SQL Server 代理。

  最佳方法:必要时,RESTORE 会断开与用户的连接;但最好预先关闭应用程序。

  如果针对 msdb 使用建议的完整恢复模式,则可将数据库还原到最近日志备份的时间。

  重要提示:当安装或升级 SQL Server 时,只要使用 Setup.exe 重新生成系统数据库,msdb 的恢复模式便会自动设置为 SIMPLE。

 

4、重新生成 resource 数据库

  从 SQL Server 2008 分发介质中启动 SQL Server 安装程序 (setup.exe)。

  在左侧导航区域中单击“维护”,然后单击“修复”。

  安装程序支持规则和文件例程将运行,以确保您的系统上安装了必备组件,并且计算机能够通过安装程序验证规则。单击“确定”或“安装”以继续操作。

  在“选择实例”页上,选择要修复的实例,然后单击“下一步”。

  将运行修复规则以验证修复操作。若要继续,请单击“下一步”。

  在“准备修复”页上,单击“修复”。“完成”页指示修复操作已完成。

  重新生成操作完成后,请检查 SQL Server 日志中是否存在任何错误。默认的日志位置是 C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Logs。若要查找包含重新生成过程的结果的日志文件,请从命令提示符处将目录更改到“Logs”文件夹,然后运行 findstr /s RebuildDatabase summary*.*。此搜索将引导您找到包含系统数据库重新生成结果的所有日志文件。打开日志文件,检查其中有无相关错误消息。

 

posted @ 2018-06-20 17:03  郭大侠1  阅读(1248)  评论(0编辑  收藏  举报