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

备份T-SQL操作参考:https://www.cnblogs.com/gered/p/9178924.html

 一、完整备份

完整备份包含了数据库中的所有数据,以及可以恢复这些数据的足够的日志(以便恢复到该备份的结尾)。
1. 备份的过程
(1)锁定数据库,阻塞所有的事务。
(2)在事务日志中放置一个标志1。
(3)释放数据库锁。
(4)提取数据文件的所有包含数据的数据页面,把它们写入备份设备。不包含数据的数据页面被跳过,因此备份的文件大小永远不会大于该数据库的数据文件。
(5)锁定数据库,阻塞所有事务。
(6)在事务日志中放置一个标志2。
(7)释放数据库锁。
(8)提取标志1与标志2之间的所有事务,把它们追加到备份中。

  

2.多线程

  为了提升性能,发起一次备份时,备份引擎以最快的速度从数据文件中获取数据页面,这个过程不考虑页面的顺序。根据这个机制,可以用多个线程向备份设备写入数据页面。

3. 完整备份中包含了少量的事务日志
  这是因为在备份过程中可能还在不停地产生“脏页”,在恢复时就需要利用这些少量日志进行“重做”(把“脏页”回写到磁盘的数据页面),这样就可以恢复到备份完成时的那个时间点。

二、差异备份

1. 差异备份的“基准”
  差异备份基于数据库的最新完整备份。也就是说,上一个完整备份就是这些“差异”的“基准”,要想使用差异备份,必须存在一个完整备份。
  差异备份只包含自“基准”后发生更改的数据页面(以区为单位)。
  差异备份不是增量备份。差异备份的“基准”是上一个完整备份。可以认为多个差异备份之间没有直接的关联关系。增量备份的“基准”是上一个增量备份。事务日志备份就属于增量备份。

  

2. 差异备份的工作原理
  在数据库中有一些特殊的数据页面,称为DCM(差异变更映射表),类似于Windows的文件分配表。DCM记录了数据库的区(8个连续的8KB数据页面)的变化情况。
  在执行了完整备份之后,DCM的内容被清零。如果某个区发生了变化,DCM中对应的位将被设为1。
  执行差异备份时,备份引擎读取DCM,然后捕获自上一次完整备份以来发生变化的所有区,并将那些区包括在差异备份中。

  注意,这里的备份步骤和全备一样,只是把步骤(4)提取数据文件的所有包含数据的数据页面,把它们写入备份设备。

  改成了提取所有DCM记录的数据。

  

三、事务日志备份
每个日志备份都包括创建备份时处于活动状态的部分事务日志,以及先前日志备份中未备份的所有日志记录。
注意:只有在完整恢复模式或者大容量日志恢复模式时,才可以执行事务日志备份。

  

1. 完整恢复模式的事务日志备份
  在日志备份时,备份引擎扫描所有的VLF,查找自上一次事务日志备份后被新增的日志记录,并将这些日志记录包括在备份文件中。
2. 大容量日志恢复模式的日志备份
  在数据页面中有一个BCM(大容量变更映射表)页,记录了自上一次日志备份后被大容量日志记录操作(例如批量插入)修改的区。BCM存在于任何恢复模式的数据库中,但仅在大容量恢复日志时才使用BCM。
  上一次日志备份后,BCM已经被清零。然后,如果某个区的数据被大容量日志记录操作修改,就在BCM中将对应的位修改为1。
  在日志备份时,备份引擎扫描所有的BCM页,查找已经修改的区,并将那些区包括在日志备份的前部。

 

3.结尾日志备份

  在最后一次事务日志备份之后,数据库继续执行新的事务,这样就会在事务日志中还存在着尚未备份的日志记录,这部分“新”日志就称为“结尾日志”。

  (1)结尾日志备份

  “结尾日志备份”就是用来捕获事务日志的“尾部”(即尚未备份的那部分日志记录),而且可以备份到最后一个事务,从而形成一个完好无损的日志链。
通过结尾日志备份,可以将数据库恢复到最后一个时间点的最后一个事务,以防丢失所做的工作。
结尾日志备份将是数据库还原计划中相关的最后一个备份。结尾日志完成后,数据库处于“正在恢复”状态,不可以访问。
1. T-SQL
示例

BACKUP LOG [db01] TO DISK = N'C:\BACKUP\DB01_BAK.bak' WITH NO_TRUNCATE , NOFORMAT, NOINIT, NAME = N'db01-事务日志 备份', SKIP, NOREWIND, NOUNLOAD, NORECOVERY , STATS = 10

2.SSMS

  

  (2)结尾日志备份的场景  

1. With NoRecovery选项
  如果数据库处于联机状态并且您计划对数据库执行还原操作,则从备份日志结尾开始。 若要避免联机数据库错误,必须使用 BACKUP Transact-SQL 语句的 … WITH NORECOVERY 选项。
  如果数据库处于脱机状态而无法启动,则需要还原数据库,从备份日志结尾开始。 由于此时不会发生任何事务,因此 WITH NORECOVERY 是可选的。


2. 数据库置疑时
  如果数据库的数据文件损坏,数据库的状态为“可疑”,则立即尝试使用 BACKUP 语句的 WITH CONTINUE_AFTER_ERROR 选项执行结尾日志备份。

 

   

  在损坏的数据库上,仅当日志文件未受损、数据库处于支持结尾日志备份的状态并且数据库不包含任何大容量日志更改时,日志结尾备份才会成功。 如果无法创建结尾日志备份,则最新日志备份后提交的任何事务都将丢失。

  (3).不需要结尾备份日志的场景

并非所有的数据库恢复方案都要求执行结尾日志备份。
1. 如果恢复点包含在较早的日志备份中,则无需结尾日志备份。
2. 如果准备移动或替换(覆盖)数据库,并且在最新备份后不需要将该数据库还原到某一时间点,则不需要结尾日志备份。

 

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