关于Oracle闪回体系技术及实现的教学研究

(整期优先)网络出版时间:2009-12-22
/ 3

关于Oracle闪回体系技术及实现的教学研究

马青

马青(青岛飞洋职业技术学院信息工程学院,山东青岛266111)

摘要:在日常数据库使用过程中,用户往往因为误操作,例如delete、update,并最终提交了修改。一般发生这样的情况我们只能采用逻辑备份或者物理备份进行恢复来纠正这样的错误,而这种方法极其复杂和低效。于是从oracle9i开始,逐渐引入了闪回的概念,10g,11g对闪回的功能进行了逐步的增加及功能的强化。

关键词:数据库;Oracle;flashbackUndo

中图分类号:G43文献标志码:A文章编号:1001-7836(2008)12-0

作者简介:马青(1980-),女,河北邢台人,助教,从事软件应用研究。

引言

本文讨论oracle闪回技术的发展及实现方法,降低用户错误导致的数据丢失,提高数据库安全性,从oracle9i开始的11g的闪回功能的发展对闪回技术的使用进行探讨。

一、闪回的发展

从Oracle9i开始Oracle引入了闪回查询(FlashbackQuery)的特性,通过闪回查询我们可以按照时间戳或者SCN来向前查询,获取修改前的数据镜像,然后通过Insert等操作就可以恢复数据,闪回查询是一种基于回滚段存储的数据修改前的镜像。9i前只要事物被提交,修改前的数据镜像就会被覆盖,空间被重用,Oracle9i引入了AUM特性,也就是回滚段自动管理的新特性,从而我们可以通过设置undo_retention参数来控制UNDO信息的保留时间,只要UNDO信息被保留,闪回就可以实现。所有的闪回技术,除了闪回数据库,都是基于撤销数据(undodata)。

Oracle9i仅仅有闪回查询的功能,到了oracle10g,闪回(flashback)功能有了全面的加强,现在几乎能够恢复所有的数据库错误(物理文件损害除外)。Oracle数据库10g提供了五个新的闪回功能:闪回版本(Versions)查询,闪回事务(Transaction)查询,闪回删除(Drop),闪回表(Table)和闪回数据库(Database)。上面五种功能可以分成三类。

1.FlashbackDatabase

FlashbackDatabase类似于按下数据库的倒带按钮,以当前数据库为起点,按照从后向前的时间顺序倒退所有的工作变化,最终的结果就像执行不完全恢复一样。闪回点以后的工作都将丢失,然后使用RESETLOGS命令打开数据库。这种闪回方法依赖于一个10g新增的后台进程,RVWR进程,此进程生成闪回日志,闪回数据库使用闪回日志就行闪回操作,闪回日志是自动管理和创建的。

2.FlashbackQuery(Versions,Transaction,Table)

此类恢复撤销数据,通过查询撤销数据把修改前的数据恢复回来。它所有的变化形式都依赖于撤销段的使用。

3.FlashbackDrop

从10g开始droptable命令被映射为rename命令,当发出droptable命令的时候被删除的表被oracle数据库自动命名为另外一个名字仍旧保存在了数据库中。

二、闪回技术的使用及发展

闪回技术从9i到10g的发展和增强下面用实例的方式就行展示。

1.Oracle9i的闪回查询功能

Oracle9i的闪回查询只有一种方式,也就是根据一个时间点来找到该时间点的数据。首先确定一个时间点,例如使用scn,假设要找到scn=2232322的时间点的表tb1的数据:

Select*fromtb1asofscn=2232322;这样得到数据,就是SCN号是2232322那个时刻的数据。在oracle9iR2版本中支持至少五分钟的Flashbackquery。

2..Oracle10g的闪回查询功能

上面提到oracle9iR2版本的数据库支持至少五分钟差距的闪回查询,到了10g支持三秒差距的闪回查询,虽然一般闪回的查询都会间隔较长的一个时间,不过从这一点上可以看出Oracle10g闪回查询有所增强。并且不仅仅在这一个方面,Oracle10g提供了四种不同类型的闪回查询。

基本的FlashbackQuery,这个功能和oracle9i的基本类似,不过能够查询到的数据可以通过响应的配置参数进行控制,FlashbackTableQuery,这个功能很简单,oracle就是通过查询撤销段来抽取所有已变化记录的细节,然后再构造和执行能够倒退这些变化的语句,这种闪回操作是一个尽可能抵消先前所有事物影响的单独事物。表闪回查询需要启动rowmovement功能,Oracle10g>altertabletb1enablerowmovement;

Oracle10g>flashbacktabletb1totimestamp(‘2009-02-1012:11:10’,‘yyyy-mm-ddhh24:mi:ss);

通常情况下,表闪回会成功,但有一下原因有可能失败:

a.如果在删除和闪回操作之间某个键值被重用,会违反主键约束。

b.如果不存在足够的撤销信息,会引发ORA-08180错误。

c.如果受闪回影响的任何记录被其他用户锁定,会引发ORA-00054错误。

d.表定义在闪回期间不能发生变化,因此DDL语句不能闪回。

e.SYS模式下的表不能闪回。

3.FlashbackVersionsQuery

由于可能会有这样的情况发生,一条记录在生命周期内,会有多次发生变化的可能。FlashbackVersionsQuery允许我们查看某条记录所有已提交的版本,注意是已提交。

4.FlashbackTransactionQuery

和前面两种新特性不同的是,前面两种采用针对一个对象的撤销数据,而FlashbackTransactionQuery则采用了不同尺度来分析撤销数据,无论存在多少受某个事物影响的对象,这种方法都会检索针对这个事物的所有撤销数据。主要使用FLASHBACK_TRANSACTION_QUERY视图,接着上面FlashbackVersionsQuery查询出来的事物号进行查询对应语句从而可以回退这个事物。从上面几个例子中可以看出10g的闪回功能已经很强了。能够帮助用户对不小心出现的操作上的失误进行处理。

5.Oracle10g的FlashbackDrop功能

FlashbackDrop功能使用更加灵活简单,对于误删表的操作可以很轻松的找回来。避免了使用数据库备份进行恢复

操作很简单,不过需要强调2点,第一,Flashbackdrop不能恢复truncate命令,第二,不能恢复级联删除用户命令删除的表

6.Oracle10g的FlashbackDatabase功能

如果说flashbackquery可用来恢复指定时间点的记录,flashbacktable可用来恢复被删除或指定时间点的表,而flashbackdatabase,则直接提供一个数据库级别的恢复,可将数据库恢复到指定的时间点,相对于前两者,其粒度是最大的,而且有一个单独闪回区域,存储闪回数据。必备的一些条件:A.数据库启用了flashbackdatabase。B.数据库必须打开了flashrecoveryarea,如果数据库是RAC,flashrecoveryarea必须位于共享存储中。C.数据库必须处于archivelog模式。

使用闪回数据库的命令很简单,启动数据库到mount状态,SQL>alterdatabaseflashbackon;

打开数据库的闪回功能,闪回的时候也是一句命令:

SQL>flashbackdatabasetoscn248739;或SQL>flashbackdatabasetotimestamp(‘2009-02-1215:11:30’,‘yyyy-mm-ddhh24:mi:ss);

上面的SCN和timestamp都是指一个特定的时间点,也就是数据库要回复的那个时刻,然后执行SQL>alterdatabaseopenreadonly;

检查数据库数据,如果数据没有问题的话,执行下面的命令打开数据库SQL>alterdatabaseopenresetlogs;

闪回数据库不会恢复物理文件损坏导致的数据丢失,这时也只能使用传统的数据库恢复办法恢复数据库。

7.Oracle11g的闪回功能

11g的闪回功能延续了10g的功能,但有所增强,在11g以前的版本,Oracle的rman并没有和其他日志应用系统紧密结合起来,因此,当rman删除日志后,可能会发现其他的系统比如DATAGUARD、STREAMS等由于日志被删除而无法正常工作。从11g开始,rman在删除时会首先判断,这个日志是否其他系统仍然需要,当其他需要仍然需要这个日志时,rman会报警,且不会删除这个日志。保证了闪回日志的完整性。

总结

经过对大量的停机原因研究发现,人为错误是导致停机的最大原因。人为错误包括:误删除重要数据;UPDATE语句中不正确的WHERE子句更新了比预期更多的数据等。我们需要尽可能的防止人为错误,当预防措施失败后,要能够撤消以前操作并恢复数据,数据库闪回功能,在人为错误修正上取得了突破。闪回是让管理员“倒回”数据库上的活动的一项功能。利用闪回技术,更正错误的时间与错误发生的时间几乎相同。它非常易用,使用一条短命令便可恢复整个数据库,而不必执行复杂的操作步骤,大大提高了数据安全性和完整性。

参考文献:

[1]Oracle?DatabaseAdministrator'sGuide10gRelease2.

[2]Oracle?DatabaseBackupandRecoveryAdvancedUser'sGuide10gRelease2.

[3]Oracle?DatabaseBackupandRecoveryReference10gRelease2.

[4]Oracle9iDatabaseAdministrator'sGuideRelease2.

[5]Oracle?DatabaseBackupandRecoveryReference11gRelease1.

[6]Oracle?DatabaseBackupandRecoveryUser'sGuide11gRelease1.