SQL Server 备份简述

jopen 9年前


SQL Server支持多种不同类型的备份,但最常用的还是完整备份、差异备份和事务日志备份。至于说到底能使用哪一种备份还要参考数据库的恢复模式,如简单恢复模式就不支持事务日志备份。

完整备份

备份指定数据库中的所有数据,数据量比较大的时候,备份和恢复的成本会比较高,其过程是:首先会锁定数据库,阻塞所有事务,立即在事务日志中写入一个标志1,并迅速释放数据库锁,这个过程是很快的。

然后提取数据文件中所有包含数据的页面写入到备份设备中。不包含数据的页面会被略过。

然后,再一次锁定数据库,阻塞所有事务,在事务日志中写一个标志2,并迅速释放数据库锁。

最后再提取标志1和2之间的事务,并写入数据到备份设备中。

如下图所示:

SQL Server 备份简述

在此图中,D表示有数据的页面,L是日志文件,如果使用的是完整备份的话,首先是打个标记1,然后将所有的数据页面备份到设备中,然后再打个标记2,将标记1和标记2中间的日志文件所产生的数据再添加到备份设备中。

差异备份

差异备份比较好理解,它是相对于完整备份来说,备份的是完整备份之后发生更改的内容,但仅限完整备份,跟上一次的差异备份没有任何关系。差异备份 的大小取决于自建立差异基准后更改的数据量。通常,差异基准越旧,新的差异备份就越大。特定的差异备份将在创建备份时捕获已更改的区的状态。如果创建一系 列差异备份,则频繁更新的区可能在每个差异中包含不同的数据。当差异备份的大小增大时,还原差异备份会显著延长还原数据库所需的时间。因此,建议按设定的 间隔执行新的完整备份,以便为数据建立新的差异基准。例如,您可以每周执行一次整个数据库的完整备份(即完整数据库备份),然后在该周内执行一系列常规的 差异数据库备份。

我们都知道数据库中的数据页是8KB的大小,8个连接数据页称为一个区。然后,还有一个映射表称为,差异位图来映射到所有的数据区。当我们做了一个基准,即完整备份之后,相应映射表中的位置就会被清零,如果发生了数据改变,相应位置会变为1。如下图所示:

SQL Server 备份简述

该图显示了二十四个数据区,其中的六个已发生更改。差异备份只包含这六个数据区。差异备份操作取决于位图页,此页针对每个区包含一位。

事务日志备份

事务日志,用于记录数据库中的所有事务操作以及每个事务对数据库所做的修改。但一个数据库能否进行事务日志备份,取决于数据库的恢复模式,如果是完整恢复模式或者是大容量日志恢复模式则可以对数据库进行事务日志备份。

如果是完整恢复模式,则在进行事务日志备份时,系统会扫描所有的虚拟日志文件(VLF),从上一次事务日志备份后被新增的日志记录。并将这些日志记录添加到备份文件中。

与完整恢复模式(完全记录所有事务)相比,大容量日志恢复模式只对大容量操作进行最小记录(尽管会完全记录其他事务)。大容量日志恢复模式保护大 容量操作不受媒体故障的危害,提供最佳性能并占用最小日志空间。也就是说大容量日志恢复模式将阻止捕获对每个事务逐一所做的更改,只记录大容量操作所更改 的事务和数据,则无法还原到该日志备份中的时点,而只能还原整个日志备份。

大容量日志备份恢复下的事务日志备份原理也需要用到一个位图页,这点和差异备份有点类似。

为跟踪数据页,日志备份操作依赖于位图页的大容量更改,位图页针对每个区包含一位。在经过一次日志备份后,数据页区所对应的位图页中的位置会清 零。然后,对于自上次日志备份后由大容量日志操作所更新的每个区,在位图中将每个位都设置为 1。数据区将复制到日志中,后跟日志数据。下图显示了日志备份的构造方式。

SQL Server 备份简述

以上是SQL Server较为常用的三种备份。

仅复制备份选项

在SQL Server 2005及以后的版本中,多出一个仅复制备份选项,这个选项什么时候可以用到?用微软的话来说:

仅复制备份”是独立于常规 SQL Server 备份序列的 SQL Server 备份。 通常,进行备份会更改数据库并影响其后备份的还原方式。 但是,有时在不影响数据库总体备份和还原过程的情况下,为特殊目的而进行备份还是有用的。 仅复制备份就是用于此目的。

仅复制备份是独立于SQL Server备份的正常序列的,也就是说如果我们现在使用仅复制备份对数据库做了一次完整备份,是不对生成一个新的基准的,不会影响到差异备份的,差异备 份所认为的基准还是上一次完整备份;如果在进行完整备份时选择了仅复制备份,则不论是此次的完整备份还是日志备份,事务日志是不会被截断的,也就是不会影 响到原有的日志链。因此,现在AlwaysOn辅助节点上,可以使用仅复制备份选项来对数据库进行完整备份和事务日志备份,而不去影响原有的日志链。

SQL Server 备份简述

仅复制备份适用于完整备份和日志备份,但不适用于差异备份。本文中的详细内容,可以参考: https://msdn.microsoft.com/zh-cn/library/ms187048(v=sql.105).aspx