1、第8章 数据库的备份与恢复,8.1 故障的类别,8.2 数据库的备份与恢复技术,8.3 数据库镜像,8.1 故障的类别,由于以下几类原因可能导致数据库中的数据丢失或被破坏:系统故障、事务故障、介质故障、计算机病毒,以及自然灾害和盗窃等。 系统故障,指造成系统停止运行的任何事件,使得系统需要重新启动,常称做软故障,如硬件错误、操作系统错误、突然停电等。 事务故障,由于事务非正常终止而引起数据破坏。 介质故障,指外存故障,如磁盘损坏、磁头碰撞等,常称做硬故障。 计算机病毒,破坏性病毒会破坏系统软件、硬件和数据。 误操作,如用户误使用了诸如DELETE,UPDATE等命令而引起数据丢失或被破坏。 自
2、然灾害,如火灾、洪水或地震等,它们会造成极大的破坏,会毁坏计算机系统及其数据。 盗窃,一些重要数据可能会遭窃。 因此,必须制作数据库的副本,即进行数据库备份,以便在数据库遭到破坏时能够对其进行恢复,即把数据库从错误状态恢复到某一正确状态。,8.2 数据库的备份与恢复技术,8.2.1 建立数据库备份 备份(转储)是一项重要的数据库管理工作,必须确定何时备份、备份到何处、由谁来做备份、备份哪些内容及备份策略。 设计备份策略的指导思想是:以最小的代价恢复数据库。备份与恢复是互相联系的,备份策略与恢复技术应结合起来考虑。 1备份内容 数据库中数据的重要程度决定了数据恢复的必要性与重要性,也就决定了数据
3、是否及如何备份。数据库需备份的内容可分为系统数据库和用户数据库两部分,系统数据库记录了重要的系统信息,用户数据库则记录了用户的数据。,8.2.1 建立数据库备份,2备份方法 备份操作十分费时并且需要消耗大量资源,因此不能频繁进行。DBA可根据数据库实际情况选择备份方式,按备份的时机可分为静态备份与动态备份;按备份的范围可分为海量(全量)备份与增量备份。 (1)静态转储与动态转储 静态转储是当系统中没有事务运行时进行转储操作,即在转储操作开始前必须先停止所有对数据库的任何存取与更新操作,并且在转储期间也不能对数据库进行存取操作。动态转储指转储期间允许对数据库进行存取与更新操作。 静态存储简单,但
4、转储必须停止所有数据库的存取与更新操作,这会降低数据库的可用性。动态存储可以克服静态转储的缺点,提高数据库的可用性,但可能会产生转储结束后保存的数据副本并不是正确有效的。这个问题可采用如下技术解决:记录转储期间各事务对数据库的修改活动,建立日志文件,在恢复时采用数据副本加日志文件的方式,将数据库恢复到某一时刻的正确状态。 (2)海量转储和增量转储 海量转储指每次转储全部数据库,也称全量转储。增量转储则指每次只转储自上次转储后被更新过的数据。 使用海量转储得到的后备副本进行数据恢复时会更加方便一些,但是,如果数据库很大且事务处理十分频繁,则采用增量转储更有效。,8.2.1 建立数据库备份,3性能
5、考虑 在备份数据库时考虑对DBMS性能的影响,主要有: 备份一个数据库所需的时间主要取决于物理设备的速度,如磁盘设备的速度通常比磁带设备快。 通常备份到多个物理设备比备份到一个物理设备要快。 系统的并发活动对数据库的备份有影响,因此在备份数据库时,应减少并发活动,以减少数据库备份所需的时间。 尽可能同时向多个备份设备写入数据,即进行并行的备份。并行备份将需备份的数据分别备份在多个设备上,这多个备份设备构成了备份集。图8.1显示了在多个备份设备上进行备份,以及由备份的各组成部分形成的备份集。,8.2.1 建立数据库备份,图8.1 使用多个备份设备及备份集,8.2.1 建立数据库备份,使用并行备份
6、可以减少备份操作的时间,例如,使用3个磁盘设备进行并行备份,比只使用一个磁盘设备进行备份正常情况下可以减少2/3的时间。 用多个设备进行并行备份时,需注意以下几点: 设备备份操作使用的所有设备必须具有相同的介质类型; 多设备备份操作使用的设备其存储容量和运行速度可以不同; 从多设备备份恢复时,不必使用与备份时相同数量的设备。 【例8.1】 使用逻辑名test1创建一个命名的备份设备,并将数据库XSCJ完全备份到该设备。 USE master EXEC sp_addumpdevice disk , test1, e:db_temptest1.bak BACKUP DATABASE XSCJ TO
7、 test1 【例8.2】 将数据库XSCJ备份到多个备份设备。 USE master EXEC sp_addumpdevice disk,test2,e:db_temptest2.bak EXEC sp_addumpdevice disk,test3,e:db_temptest3.bak BACKUP DATABASE XSCJ TO test2,test3 WITH NAME = xscjbk 本例将XSCJ数据库备份到两个磁盘设备test2和test3上。,8.2.1 建立数据库备份,【例8.3】 创建临时备份设备并在所创建的临时备份设备上进行差异备份。 BACKUP DATABASE
8、XSCJ TODISK =e:db_tempxscjbk.bak WITH DIFFERENTIAL 对于需要频繁修改的数据库,进行差异备份可以缩短备份和恢复的时间。注意只有当已经执行了完全数据库备份后才能执行差异备份。进行差异备份时,SQL Server将备份从最近的完全数据库备份后数据库发生了变化的部分。,8.2.2 日志文件,一个数据库必须至少包含一个数据文件和一个事务日志文件,日志文件是用来记录事务对数据库的更新操作的文件,对数据库的恢复起着重要作用,主要用于事务故障、系统故障的恢复,并协助后备副本进行介质故障的恢复。 日志文件由若干条日志记录构成,每个日志记录的主要内容有: 事务标识
9、(标明是哪个事务); 操作的类型(插入、删除或修改); 操作对象(记录内部标识); 更新前数据的旧值(对插入操作,此项为空值); 更新后数据的新值(对删除操作,此项为空值)。 日志记录主要有如下3种类型。 (1)事务开始(BEGIN TRANSACTION)记录 :表示事务Ti开始,Ti为事务ID。 (2)事务更新记录 :表示事务Ti对数据X进行更新,V1为更新前的值,V2为更新后的值。 (3)事务结束(COMMIT或ROLLBACK)记录 :表示事务Ti已提交。 :表示事务Ti被终止。,8.2.2 日志文件,这样,一个已完成的事务在日志文件中有一个开始记录、若干个事务更新记录、一个提交记录;
10、而一个未完成事务在日志文件中仅有开始记录和若干个事务更新记录,没有事务提交记录。 在日志文件中,同一个事务的所有日志记录通过事务ID联系在一起。登记日志文件时,应遵循如下原则: 登记的次序严格按照并发事务执行的时间次序; 必须先写日志文件,后写数据库。 【例8.4】 创建一个命名的备份设备XSCJLOGBK,并备份XSCJ数据库的事务日志。 USE master EXEC sp_addumpdevice disk , XSCJLOGBK , e:db_temptestlog.bak BACKUP LOG XSCJ TO XSCJLOGBK,8.2.3 数据库的恢复,数据库恢复就是当数据库出现故
11、障时,将备份的数据库加载到系统,从而使数据库恢复到备份时的正确状态。 恢复是与备份相对应的系统维护和管理操作,系统进行恢复操作时,先执行一些系统安全性的检查,包括检查所要恢复的数据库是否存在、数据库是否变化,以及数据库文件是否兼容等,然后根据所采用的数据库备份类型及发生的故障类型,采用相应的恢复策略。 1系统故障的恢复 当发生系统故障时,可能出现如下两种情况。 未完成事务对数据库的更新可能已写入数据库。 已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库,因此,系统故障的恢复操作主要是撤销故障发生时未完成的事务,重做已完成的事务,恢复由系统在重启时自动完成,步骤如下: 建立重做队列(R
12、EDO)和撤销(UNDO)队列。从头开始扫描日志文件,找出故障发生前已提交的事务(这些事务既有BEGIN TRANSACTION记录,又有COMMIT记录),将其事务标识记入重做(REDO)队列,同时找出故障发生时尚未完成的事务(这些事务只有BEGIN TRANSACTION记录,而没有相应的COMMIT记录),将其记入撤销(UNDO)队列。,8.2.3 数据库的恢复, 对UNDO队列的各事务进行撤销(UNDO)处理。从日志文件的尾部反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作,即将日志记录中“更新前的值”写入数据库。这样,若更新操作是插入操作,其逆操作就是删除操作;若更新操作是删
13、除操作,其逆操作就是插入操作;若更新操作是修改操作,其逆操作就是用修改前的值替换修改后的值。 对REDO队列中的各事务进行重做(REDO)处理:从头扫描日志文件,对每个REDO事务重新执行日志文件登记的操作,即将日志记录中“更新后的值”写入数据库。 2事务故障的恢复 事务故障指的是事务在运行至正常结束点(COMMIT或ROLLBACK)前被终止,这时DBMS的恢复子系统利用日志文件撤销(UNDO)该事务对数据库的修改。事务故障的恢复由DBMS自动完成,步骤如下: 从尾部开始反向扫描日志文件,查找该事务对数据的更新操作; 对该事务的更新操作执行UNDO操作,即将日志记录中“更新前的值”写入数据库
14、; 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理,重复这一过程,直至扫描到该事务的开始标记。,8.2.3 数据库的恢复,3介质故障的恢复 介质故障是最严重的一类故障,此时磁盘上的数据和日志文件可能被破坏。介质故障的恢复方法是重装数据库,然后重做(REDO)已完成的事务,步骤如下: 装入最新的数据库后备副本,使数据库恢复到最近一次转储的一致性状态;对于动态转储的数据库副本,还要装入转储开始时刻的日志文件副本,利用恢复系统故障的方法(REDO+UNDO),将数据库恢复到一致性状态; 装入转储结束时日志文件的副本,重做(REDO)已完成的事务。 这样可将数据库恢复至故障前某个时刻的一
15、致状态。 对于由于误操作、计算机病毒、自然灾害,或者是介质被盗造成的数据丢失也可以采用这种方法进行恢复。 介质故障的恢复需要DBA介入,DBA重装最近转储的数据库副本和有关的日志文件副本,然后执行恢复命令。,8.2.3 数据库的恢复,【例8.5】 从一个已存在的命名备份介质test1中恢复整个数据库XSCJ。 RESTORE DATABASE XSCJFROM test1 【例8.6】 先从备份介质test1进行完全恢复数据库XSCJ,再进行事务日志事务恢复。 RESTORE DATABASE XSCJFROM test1WITH NORECOVERY RESTORE LOG XSCJFROM
16、 XSCJLOGBK 执行事务恢复必须在进行完全数据库恢复以后。,8.3 数据库镜像,1数据库镜像的基本原理 镜像子系统维护一个数据库的两个副本,这两个副本驻留在不同的数据库服务器实例上,其中一个服务器实例使数据库服务于客户端称为主服务器,另一服务器实例充当备用服务器称为镜像服务器,每当主数据库更新时,DBMS自动保证镜像数据库与主数据库的一致性,如图8.2所示,当出现介质故障时,可由镜像磁盘继续提供使用,同时DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本。在没有出现故障时,数据库镜像还可以用于并发操作,即当一个事务对数据加排他锁修改数据时,其他事务可以读镜像数据
17、库上的数据,而不必等到该事务释放锁。,图8.2 数据库镜像,8.3 数据库镜像,2数据库镜像的工作方式 根据应用的需要,数据库镜像子系统可采用同步镜像或异步镜像方式工作。同步镜像是一种“高安全性”的工作模式,镜像服务器保证镜像数据库与主数据库实时同步。异步镜像是一种“高性能”的工作模式,在此工作方式下,主服务器向镜像服务器发送日志记录之后会立即再向客户端发送确认消息,而不需要等待镜像服务器确认,这意味着事务不需要等待镜像服务器将日志写入磁盘便可提交,但可能会丢失某些数据,镜像数据库可能稍微滞后于主数据库,但这两个数据库之间的时间间隔通常很小;如果主服务器的工作负荷过高或镜像服务器系统的负荷过高,则时间间隔会增大。 3角色转换 在数据库镜像子系统中,可通过“角色转换”互换主服务器和镜像服务器,进行角色转换时,原来的镜像服务器使其数据库的副本在线作为新的主数据库,原来的主服务器成为镜像服务器,并将其数据库变为新的镜像数据库。,习题,1数据库恢复以什么为前提? 2数据库恢复的基本技术有哪些?恢复技术能保证事务的哪些特性? 3试述SQL Server中采用的恢复策略。 4什么是数据库镜像?它有什么用途?,