▶4.3.2.1 数据库恢复技术
▶1.数据库的主要故障
任何一个系统,包括数据库系统都难免会遇到各种故障。数据库系统中可能发生的故障主要可以分为以下几类。
(1)事务故障
事务内部的故障有的可以由事务程序本身发现,这些故障可以通过事务本身进行处理。有的故障是非预期的,不能通过事务程序处理,如运算溢出、并行事务发生死锁等。事务故障即指这些非预期的故障。
(2)系统故障
系统故障是指造成系统停止运行的任何事件,如CPU故障、操作系统故障、突然断电等。可在系统重新启动后对未正常终止的事务进行回滚来使数据库恢复到正常状态,所以这类故障称为软故障(Soft Crash)。
(3)介质故障
由系统的外存储器发生的故障引起的数据库状态不正确的故障称为硬故障(Hard Crash)。这类故障可能会破坏数据库,破坏性非常大。
(4)病毒
数据库处于非正常状态也可能是由计算机病毒引起。
总的来说,数据库故障对数据库的影响有两类:数据库被破坏和数据库没有被破坏。对待故障应该包含两个方面:预防和恢复。预防方面涉及故障的事先探测、诊断、自适应修理等。预防的目的就是尽可能减少(完全消除是不可能的)或延迟故障的发生,或减轻故障带来后果的严重程度。然而,即使是有最好的防御技术和手段,也不可能保证没有故障发生,所以任何一个数据库系统都应该有一个故障恢复系统。在发生故障后,如何将系统从故障状态恢复到正常运作状态是一个很复杂的问题,因而恢复系统部件是一个DBMS中最难设计和实现的部件。
▶2.数据库恢复概述
所谓恢复就是利用自己的恢复工具将备份还原回来,保证数据库能够正常工作。根据不同的备份和恢复方案、策略可以有不同的恢复方式,可以将数据库恢复到不同的状态。
恢复也称为重载、重入或还原。与备份类型相对应,通过恢复可以:①恢复整个数据库;
②恢复数据库的部分内容;
③恢复特定的文件或文件组;
④恢复事务。
在数据库的运行过程中,可能会发生各种数据库故障,即数据库被破坏或数据不正确。作为DBMS就需要把数据库从被破坏后不正确的状态,恢复到最近一个正确的状态。DBMS的这种能力就是“可恢复性”(recovery)。通过恢复可以将数据库恢复到做备份的即时点、发生故障的即时点或特定的事务即时点。
恢复管理的任务包含在未发生故障而系统正常运行时,采取一些必要措施为恢复工作打基础;在发生故障后进行恢复处理。可具体概括如下。
(1)事务正常执行时
为了在发生故障后能有效地恢复,必须执行的主要任务有:①记日志,即记录每一事物的每一行为活动、数据库的状态变化历史等;②设置“检验点”,它限制恢复时必要查看的日志长度;③数据库备份,它使数据库本身遭破坏时也能被恢复。
(2)事务提交时
将该事务的结果真正写入数据库,以实现事务的持久性,并在日志中记上该事务提交的记录。
(3)事务夭折时
要做的主要工作有:消除对读了它(们)的“脏数据”的其他事务的影响;消除它(们)对数据库所做的任何变更;在日志中记上相应事务夭折的记录。
(4)故障发生后
利用日志记录的各种信息、检验点信息及必要时利用最近的备份,依据故障的不同而用不同的技术与方法将数据库内容恢复到某个一致性状态,将受影响的事务恢复到原子性和永久性的状态,将受伤害或崩溃的系统服务恢复到正常运行状态。
▶3.数据库恢复原理及实现技术
数据库恢复的基本原理十分简单,就是利用数据的冗余。数据库中任何被破坏或不正确的数据的修复,都是利用存储在其他地方的冗余来实现的。因此恢复系统应该提供两种类型的功能:一种是生成冗余数据,即对可能发生的故障做某些准备;另一种是冗余重建,即利用这些冗余数据恢复数据库。
登记日志文件和数据转储是生成冗余数据最常用的技术,在实际应用中,这两种方法常常结合在一起使用。
(1)登记日志文件(Logging)
日志文件是实时的。日志文件是对数据转储的补充,是系统建立的一个文件,该文件用来记录事务对数据库进行的更新操作,通常也称为事务日志。
登记日志文件的原则是必须先写日志文件,后写数据库;严格按照并发事务执行的时间次序来登记。例如,当磁盘发生故障而造成对数据库的破坏时,先利用数据转储恢复大部分数据库,然后运行数据库日志,将数据转储后所做的更新操作重新执行一遍,从而完全恢复数据库。
(2)数据转储(Data Dump)
数据转储是指定期地将整个数据库复制到多个存储设备(如磁带、磁盘)上保存起来的过程,它是数据库恢复中采用的基本手段。转储的数据称为后备副本或后援副本,当数据库遭到破坏后就可利用后备副本把数据库有效地加以恢复。
转储不能频繁进行,因为它的时间和资源的耗费十分严重。DBA需要按照数据库使用情况设定一个相对适当的转储周期。
按照转储方式,数据转储可以分为海量转储和增量转储。海量转储是指每次转储整个数据库。增量转储每次只转储上次转储后被更新过的数据。上次转储以来对数据库的更新修改情况记录在日志文件中,这种转储可利用日志文件来进行,将更新过的那些数据重新写入上次转储的文件中,就完成了转储操作,这与转储整个数据库的效果是一样的,但耗时非常少。
按照转储状态,数据转储又可分为静态转储和动态转储。静态转储期间不允许有任何数据存取活动,因而需在当前用户事务结束之后进行,新用户事务又需在转储结束之后才能进行,这就使数据库的可用性有所降低。动态转储则不同,它允许转储期间继续运行用户事务,但产生的副本并不能保证与当前状态一致。解决的办法是把转储期间各事务对数据库的修改活动登记下来,建立日志文件。因此,使用后备副本加上日志文件就能把数据库恢复到某一时刻的正确状态。
▶4.恢复数据库前的准备
在执行恢复操作前,应当验证备份文件的有效性,确认备份中是否含有恢复数据库所需要的数据,并关闭该数据库上的所有用户,备份事务日志。
(1)验证备份文件的有效性
通过对象资源管理器,可以查看备份设备的属性。具体操作为:右击相应的备份设备,在弹出的快捷菜单中选择“属性”命令,在“备份设备”属性对话框的“媒体内容”标签里,即可查看相应备份设备上备份集的信息,如备份时的备份名称、备份类型、备份的数据库、备份时间、过期时间等。另外,使用SQL语句也可以获得备份媒体上的信息。使用RESTORE HEADERONLY语句,获得指定备份文件中所有备份设备的文件首部信息。使用RESTORE FILELISTONLY语句,获得指定备份文件中的原数据库或事务日志的有关信息。使用RESTORE VERIFYONLY语句,检查备份集是否完整,以及所有卷是否可读。
(2)断开用户与数据库的连接
在恢复数据库前,还应当断开用户与该数据库的一切连接。即所有用户都不准访问该数据库,执行恢复操作的用户也必须将连接的数据库更改到master数据库或其他数据库,否则不能启动还原任务。
(3)备份事务日志
在执行恢复操作前,用户备份事务日志,有助于保证数据的完整性。另外,在数据库还原后还可以使用备份的事务日志,进一步恢复数据库的最新操作。
▶4.3.2.2 数据库备份(www.xing528.com)
尽管系统中采取了种种安全性措施,数据库的破坏依然还是可能发生的。如硬件故障、软件错误、操作失误、人为恶意破坏等。所以数据库的备份是非常关键的。
所谓备份就是将数据库文件复制到另外一个安全的地方。尽管数据恢复的技术有很多,但定期备份数据库是其中最稳妥的防止磁盘故障的方法,它能有效地恢复数据,是一种既廉价又保险的形式,同时也是最简单的,能够恢复大部分或全部数据的方法。即便是采取了其他备份技术,如冗余磁盘阵列等技术,数据库备份也是必不可少的工作。可以说,没有备份几乎是不可能恢复由于磁盘损坏而造成的数据丢失。
▶1.备份策略
常见的备份有两种:数据库备份,即周期性地对数据库备份,或转储到磁带一类的存储介质中;数据库操作的备份,即建立“日志”数据库。对于数据库的每一次更新操作,都要记下改变前后的值,写到“日志”库中,以便有案可查。
在实际应用系统的开发过程中,备份策略包括备份周期(一天、一周等)、备份介质(磁盘、磁带、光盘等)和备份数据库(介质)的存放等内容。
(1)备份周期
早期的数据库系统在进行备份时,通常要求停止正在进行的数据库工作,此时备份周期最短应为一天。随着技术的发展,已经有一些系统能够在数据库运行过程中进行备份,而不需要强迫所有的用户从系统中退出,因此备份的周期就主要取决于应用需求。在此只说“主要”而不是“完全”,是因为在做数据库备份时,系统性能将受影响,并且备份还受到数据库服务器计算机的磁盘容量的影响。
值得一提的是,在提供在线备份的系统中,备份时间可以定在一些对数据库有较大影响的数据库操作之后或之前,用触发器或存储过程来实现这一备份工作。可以认为这是最有效的备份时间策略。
(2)备份介质
备份介质是指备份或还原操作中使用的磁带机或磁盘驱动器。它是创建备份和恢复数据库的前提条件,在创建备份时,必须选择要将数据写入的备份介质。
备份介质可以分为3种:磁盘介质、磁带介质以及物理和逻辑设备。其中,物理备份介质是操作系统用来标识备份介质的名称;逻辑备份介质是用户自定义的别名,用来标识物理备份介质,逻辑设备名称永久性地存储在SQL Server内的系统表中。
(3)备份数据库的存放
备份介质的存放需要引起高度重视,通常这些介质不会和数据库计算机放在同一机房中,这样就避免了发生灾害时一同被毁坏。备份介质一般应放在远离机房的安全地方,这里所谓的安全地方是指备份数据库的介质不会被盗或损坏等。
▶2.备份时机
通常系统数据库中会存储数据库的服务器配置信息、用户登录信息、用户数据库信息、作业信息等。因此,在进行数据库备份时,不但要备份用户数据库,还要备份系统数据库。
(1)备份系统数据库的时机
时机的选择是进行数据库备份的关键,下面以SQL Server数据库为例进行介绍。
①修改master数据库之后。master数据库中包含了SQL Server中全部数据库的相关信息。因此,在创建用户数据库、创建和修改用户登录账户或执行任何修改master数据库的语句后,都需要对master数据库进行备份。
②修改msdb数据库之后。msdb数据库中包含了SQL Server代理程序调度的作业、警报和操作员的信息。在修改msdb之后也应当对其进行备份。
③修改model数据库之后。model数据库是系统中所有数据库的模板,当用户通过修改model数据库来调整所有新用户数据库的默认配置,也必须读model数据库进行备份。
(2)备份用户数据库的时机
①创建数据库后。在创建或装载数据库之后都需要对相应的数据库进行备份。
②创建索引之后。创建索引的同时还需要分析以及重新排列数据,且这个过程通常需要耗费时间和系统资源。而在这个过程之后备份数据库,备份文件中就会包含索引的结构,一旦数据库出现故障,再恢复数据库时不必重建索引了。
③清理事务日志之后。使用BACKUP LOG WITH TRUNCATE ONLY或BACKUP LOG WITH NO LOG语句清理事务日志后,需要备份数据库。因为此时事务日志将不再包含数据库的活动记录,所以不能通过事务日志恢复数据。
④执行大容量数据操作之后执行完大容量数据装载语句或修改语句后,SQL Server通常不会将这些大容量的数据处理活动记录到日志中,所以应当进行数据库备份。例如,执行完SELECT INTO、WRITETEXT、UPDATETEXT语句后都需要备份数据库。
▶3.数据库备份的模式
常见的数据库备份模式有如下4种。
(1)完全备份
完全备份是一种最完整的数据库备份方式,它通过将数据库内所有的对象完整地拷贝到指定的设备上,来完成对所有数据库操作和事务日志中的事务进行备份。由于它备份的内容相对比较完整,因此,每个完整备份使用的存储空间比其他备份模式使用的存储空间要大,完成完整备份需要更多的时间。因而创建完整备份的频率通常要比创建差异备份的频率低,对于数据量较少,或者变动较小不需经常备份的数据库而言,可以选择使用这种备份方式。
(2)差异备份
差异数据库备份是一种只会针对自从上次完全备份后有变动的部分进行备份处理的方式。采用这种备份模式时必须搭配完全备份一起使用,即需要先使用完全备份保存一份完整的数据库内容,然后再使用差异备份记录有变动的部分。
由于差异备份只备份有变动的部分,因此其备份速度相对较快,占用的空间也不会太大,比较适合于那些数据量大且需要经常备份的数据库。使用差异备份可以减少数据库备份的负担。
需要注意的是,在使用完全备份和差异备份来备份数据库后,当需要还原数据库的内容时,必须先加载前一个完全备份的内容,然后再加载差异备份的内容。例如,在需要每天对数据库进行备份,其中星期一到星期六进行的是差异备份,星期天进行的是完全备份。当星期三发现数据库有问题,需要将数据库还原到星期二的状况时,必须先将数据库还原到上一个星期天完全备份,然后再还原星期二的差异备份。
(3)事务日志备份
事务日志备份与差异数据库备份非常相似,都是备份部分数据内容,但是事务日志备份是针对自从上次备份后有变动的部分进行备份处理,而不是针对上次完全备份后的变动。也就是说,使用完全备份和事务日志来备份数据库,在还原数据库内容时,还必须先加载前一个完全备份的内容,然后再按顺序还原每一个事务日志备份的内容。例如,每天都需要对数据库进行备份,其中星期一到星期六做的是差异备份,星期天做完全备份。当星期三发现数据库有问题,需要将数据库还原到星期二的状况时,必须先将数据库还原到上一个星期天的完全备份,然后再还原星期二的差异备份,接着还需要还原星期三的事务日志备份。
事务日志备份是对数据库发生的事务进行备份,包括从上次进行事务日志备份、差异备份和数据库完整备份之后所有已经完成的事务。事务日志备份能够在相应的数据库备份的基础上,尽可能地恢复最新的数据库记录。由于它仅对数据库事务日志进行备份,所以其需要的磁盘空间和备份时间都比数据库备份少得多。
执行事务日志备份主要有两个原因:首先,要在一个安全的介质上存储自上次事务日志备份或数据库备份以来修改的数据;其次,要合适地关闭事务日志到它的活动部分的开始。
(4)文件和文件组备份
这是一种是以文件和文件组作为备份的对象备份模式,一般用于数据库非常庞大的情况下,主要针对的是数据库内特定的文件或特定文件组内的所有成员进行数据备份处理。通常,文件组包含了一个或多个数据库文件。当SQL Server系统备份文件或文件组时,指定需要备份的文件,最多指定16个文件或文件组。文件备份操作可以备份部分数据库,而不是整个数据库。
与数据库备份相比,文件备份的主要缺点是增加了管理的复杂性。因此,必须注意维护完整的文件备份集和所覆盖的日志备份。如果已损坏的文件没有备份,则介质故障可能导致整个数据库无法恢复。
这种数据库备份模式在使用时,还应该要搭配事务日志备份一起使用。其主要原因是当在数据库中还原文件或文件组时,也必须还原事务日志,使该文件能够与其他的文件保持数据一致性。
文件和文件组备份是备份和恢复数据库的另一种便捷方式,但它们并不是以数据库为单位进行备份的,因此在管理上可能会存在一定的难度。
【注释】
[1]单广荣.软件工程开发技术与应用[M].北京:科学出版社,2020.
[2]尹志宇.数据库原理与应用教程[M].北京:清华大学出版社,2020.
[3]刘红,肖云鹏.软件工程与数据库研究[M].天津:天津科学技术出版社,2018.
[4]徐彩云.MySQL数据库实用教程[M].武汉:华中科技大学出版社,2019.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。