张丽君
(河南科技学院,河南新乡453003)
数据库技术在各个行业和各个领域得到了广泛的应用,在对数据库应用的过程中,操作员的错误操作、不知原因的恶意破坏、以及系统的不稳定和物理介质的损坏等等原因,都有可能造成重要数据的丢失.一旦数据在数据库中发生了丢失或者数据遭到损坏,带来的损失将是巨大的,所以对数据库的恢复就非常的有必要.对于一些大型的和敏感的数据库系统来说,一般都会提前采取相应的策略,以保证数据库中即使有故障出现,也能使数据库得到恢复,使得跟故障发生之前的数据库是一致的[1].
在数据库中,有一个非常重要的概念——事务(Transaction),它是数据库恢复的基本单位.是用户对数据库进行操作的一些列语句组合在一起形成的一个集合,这个集合是一个原子单位,不能再分.事务和程序是两个概念,通常来说在RDB中,在一个事务中通常包含的SQL语句,可以只有单纯的一条,也可以有很多条,甚至还可以包含整个应用程序.事务是数据库恢复和并发控制的基本单位,事务具有4项基本特性[2],简称ACID特性.
我们都知道原子的一个非常重要的特性就是不可再分,而对于事务来说,它也是一个不可分割的整体工作单位,其中包括的所有操作都要满足一个条件:操作要么从第一条开始到最后一条都执行完,要么所有的操作就一条都不执行.
数据库中的数据要保证其是正确的、有效的和相容的.在一个事务执行的前后,必须要保证数据库是从之前的一致性状态转换到另外一个一致性的状态.
对于串行执行的事务而言,不涉及到互相干扰的问题.但是为了提高系统的执行效率,应该采取并发执行,但是要保证一个事务的执行期间,其用到的数据不能被其他的事务所修改.如表1所示.表中的两个事务执行过程中就没有遵守隔离性,从而导致T1对数据项X的修改丢失了.
表1 数据丢失修改Tab.1 The loss of data modification
事务的持续性是指一旦一个事务以COMMIT语句提交,那么不管数据库发生什么故障,都不会对这个事务生成的结果有任何的影响,也就是说,事务对数据库形成了永久性的改变.
数据库运行中,很难避免一些错误的发生,也就是说,会有各种各样的故障,主要有:事务内部的故障、软故障、硬故障和计算机病毒[3].如果数据库系统在事务运行时有故障发生了,那么数据库恢复子系统将会把数据库从错误状态恢复到故障发生之前的一个一致性的状态.在DBS中,数据库恢复是非常重要的,故障随时都有可能发生,所以在整个数据库的运行过程中恢复策略必不可少.对于恢复操作来说,基本的处理方法是利用备份的数据来进行错误恢复,一个大型数据库产品,在所有的数据库代码中,恢复子系统会占至少10%.如果要实现数据库的恢复,一般有两个问题需要解决:一是怎样生成后备的数据;二是如何利用这些数据副本对故障进行恢复.
最常用的建立冗余数据的方法有两个,一个是数据转储,另一个是登录日志文件.
由数据库管理员(DBA)按照一定的周期,对整个数据库进行复制转移,把整个数据库中的数据转移到其他的磁盘上,这个过程叫做数据转储[4].转移到其他磁带上或者磁盘上的数据叫做后备数据.当数据库遭到破坏时,DBA可以根据之前制作的后备副本对数据库进行恢复.但是重装后备副本只能将数据库恢复到转储结束时那一个时刻的状态,如果故障是在转储结束时刻的后期发生,单纯的只重装后备副本是不行的,这个时候就必须对转储以后的所有更新事务执行REDO(重做)操作.如图1所示,Ta时刻系统停止运行事务开始转储,Tb时刻转储完毕重新开始运行事务,Tf时刻发生故障.
图1 数据转储Fig.1 The data dump
转储的方法有静态转储和动态转储.
2.2.1 静态转储静态转储在执行的过程中要保证系统中没有任何事务运行,也就是说转储期间不允许对数据库的任何数据更新操作.其优点是实现简单,但是由于转储需要耗费一定的时间,而在则个期间又不能运行事务,所以降低了数据库的可用性.
2.2.2 动态转储动态转储恰好克服了静态转储的缺点,在进行动态转储期间是可以对数据库进行读或写操作的.也就是说形成了一种并发执行的机制,但是由于转储期间有事务对数据执行修改操作,所以得到的数据副本文件不一定能保证它们是正确的.
要利用动态转储实现数据库的恢复,就必须借助另一个重要的概念,即日志文件.
备份操作并不是每时每刻都能执行的,它是一个定期执行的操作.所以单纯使用备份的数据库文件,只能说是把数据库恢复制作备份的那一时刻.而日志文件是实时的,它恰好是对是对后备副本的一个补充,就好比是一本值班日记,按照时间的先后顺序,记录了事务对数据库中所有数据的更新操作.
当磁盘发生故障造成DB损坏时,先利用备份恢复大部分数据库,然后运行数据库日志,将备份后所做的更新操作在重做一遍,从而使DB完全恢复.
为保证日志[5]的安全,不能把日志文件和主数据库存储在相同的存储设备上,要把两者分开存储,以保证发生故障时不是日志文件和DB同时都被破坏,否则日志也就失去了本来的作用.日志文件总共有两种使用格式.
3.2.1 以记录为单位的日志文件系统把事务开始(BEGIN TRANSACTION)、事务提交(COMMIT)或事务撤消(ROLLBACK),以及对数据库的插入、删除、修改等每一个操作作为一条记录存放到日志文件中.每条日志记录的主要内容如下:
(1)事务的标识符号,即标明是哪个事务,如T1,T2等;
(2)操作的基本类型,包括增、删、改3种操作;
(3)事务操作的数据库对象,即对哪条记录进行操作;
(4)数据被修改之前的旧值;
(5)数据被修改之后的新值.
3.2.2 以数据块为单位的日志文件以数据块为单位的日志文件,其中除了要标明事务的标识之外,还要标明以数据块为单位的更新前的旧值和更新后的新值.
如果数据库发生了事务故障和系统故障,那么对数据库的恢复必须使用日志文件[6].
一个数据库修改由两个操作组成,一是将更新的数据写到数据库中,二是将表示这个修改的日志写到日志文件中,在这两个操作之间有可能发生故障.所以登记日志文件应遵循的两条规则:
(1)登记的次序严格按照并发事务执行的时间次序.
(2)必须先写日志文件后写DB.
若先写数据库,再写日志,万一在写日志前发生故障,则这个数据库修改未登记,故障恢复时就不会知道有这个修改,当然也不可能恢复.若先写日志后写数据库,假设在写数据库前发生故障,则在按日志进行故障恢复时一定能发现这个修改并撤消,只不过多执行一次不必要的撤消操作.例如:欲将数据库中某记录字段的值由20改为100,登记日志文件后发生故障,则字段值仍为20,日志中不会登记该事务的COMMIT或ROLLBACK记录,事务未完成,恢复时对该操作做撤消处理,将字段值改为该修改操作的旧值20,数据库内容不变[7].
当数据库系统中有故障发生时,可以把数据库后援副本和日志文件结合起来,对数据库进行恢复操作,但是由于不同的故障发生的原因不同,所以对不同的故障也有不同的恢复方法,下面简单介绍下各种故障的恢复策略[8].
事务故障是指事务没有运行到最后一条语句,就意外的中止了.其恢复基本步骤如图2所示.
图2 事务故障恢复Fig.2 Transaction recovery
在整个恢复过程中,是以日志文件为主要依据,如果事务是意外终止了,那么就必须通过反向查找日志文件,对这些事务进行操作,就是说对事务已经修改过的数据项,用原来的旧值代替它的新值.
如果数据库执行过程中,是系统的原因造成了某些故障的发生,那么会由恢复管理子系统在系统重启时自动完成对数据库的恢复,不需要用户干预[9].其恢复的基本步骤如下:
(1)从日志文件的第一条语句开始扫描,查找REDO队列和UNDO队列;
(2)对Undo队列事务进行撤销操作;
(3)对Redo队列中的事务重新执行,如图3所示.
图3 系统故障恢复Fig.3 Systemrecovery
介质故障一般情况下一旦发生,那么就说明存储在当前磁盘上的数据库文件被损坏,那么一般要借助前面所提到的后备副本来对数据库进行恢复[10].恢复的基本步骤如下:
(1)把之前做好的后备副本装入,对数据库进行恢复,一般得到的是跟转储时刻相同的数据库;
(2)装入相应的日志文件副本,重做已完成的事务.
首先扫描日志文件,把故障时已经成功完成的事务重新处理,对故障时候还没有完成的事务进行撤销,如图4所示.
图4 介质故障恢复Fig.4 Dielectric recovery
数据库的恢复技术,在整个数据库管理系统中的地位是不可被替代的.这是一种对数据库的被动的保护方法,相应的在对于数据库也可以采用主动的完整性、安全性及并发控制策略,主动的保护措施和被动的保护措施相结合,尽可能的保证数据库中的数据是正确的和有效的.要想实现数据安全有效的备份,关键在于如何正确的选择备份策略,这还需要在使用过程中不断累积经验.
[1] 段婷.数据库恢复技术的探讨[J].太原铁道科技,2010(4):25-29.
[2] 来宾,谭明勇.数据库原理与应用[M].北京:冶金工业出版社,2003:143.
[3] 陈文捷,姚红星.网络环境下计算机病毒新特征及其防范[J].河南科技学院学报:自然科学版,2010,38(1):102-104.
[4] 萨师煊,王珊.数据库系统概论[M].北京:高等教育出版社,2006:282-283.
[5] 简云松.数据库恢复技术探讨[J].软件导刊,2008(8):102-103.
[6] 范丽雅,王万森,关永.数据库中数据恢复的研究[J].计算机工程与设计,2008(3):563-565.
[7] 林烈青.基于事务日志的数据库恢复机制研究[J].现代计算机,2009(8):40-42.
[8] 鲍晓娟.浅谈数据库恢复技术[J].赤峰学院学报:自然科学版,2011(4):45-47.
[9] 许春艳.SQLServer 2005数据库恢复技术探索[J].硅谷,2011(8):33-36.
[10] 谢抢来,余丽娜,姚磊岳.SQLServer数据库异地备份的研究与实现[J].江西蓝天学院学报,2009(3):89-91.