摘 要: 在Oracle 9i之前的版本,要恢复用户误操作的数据,必须通过逻辑备份或者物理备份进行恢复以纠正错误,这种方法是极其复杂和低效的。为提高数据库的可用性,从Oracle 9i开始引入了闪回技术,使数据恢复的方式和手段更加丰富,操作更加简易。主要分析介绍Oracle闪回技术的概念、功能,并结合实例介绍闪回技术在数据恢复中的应用。
关键词: Oracle 9i;Oracle 10g;闪回技术;数据恢复
Oracle数据库是世界上最流行的关系数据库之一。由于它的系统可移植性好、使用方便、功能强,在国内外企事业单位中应用广泛。本文介绍了Oracle闪回技术,它最大的特点是能实现自动备份,有效减少管理开销。数据库发生故障具有随机性,大多数情况下没有事先人为备份,这时就可以利用闪回技术快捷方便地恢复数据。从Oracle 9i推出闪回查询(Flashback Query)特性,到Oracle 10g闪回技术得到了进一步的发展。随着闪回功能不断扩充和加强,新的应用也大量出现在系统管理中。
1 Oracle 9i闪回技术的数据恢复
1.1 Oracle 9i闪回技术原理
在Oracle 9i中,闪回技术确切地说是闪回查询(Flashback Query)。闪回查询可以按照时间戳或SCN向前查询,获取回滚段(undo)中的数据镜像。自动回滚段管理(AUM)是Oracle 9i引入的新特性,闪回查询必须依赖于它。之前的Oracle数据库版本,在事务提交后,段中的数据镜像是可以被覆盖的。而现在可以在自动回滚段管理模式下调整参数UNDO_RETENTION设置数据库UNDO信息的最大可以闪回查询的时间段,只要在这个时间范围内数据镜像没有被覆盖,数据被恢复的可能性是比较大的,就算不能完全恢复,也至少可以恢复到某个时间点比较好的状态[1-3]。同时,UNDO信息被覆盖也跟UNDO表空间的存储空间大小有关。
闪回查询在使用前,数据库要处于Automatic Undo Management状态。
SQL>show parameter undo_management
NAME TYPE VALUE
--------------------------
undo_management string AUTO
最大可以闪回查询的时间段可以在UNDO_RETENTION 参数(单位为秒)中设置。
SQL>show parameter undo_retention
NAME TYPE VALUE
------------------------
undo_retention integer 10800
Oracle 9i是基于时间点的闪回,需要查询SCN或时间戳。若要获得当前的SCN必须确保用户对DBMS_FLASHBACK包有执行的权限:grant execute on dbms_flashback to User[4-6]。除了查询SCN估算向前进行查询,还可以根据事务提交时间估算向前推移查询。由于一个数据库系统表SMON_SCN_TIME构建了SCN→TIME的跟踪关系,而且不同实例只能维护一个SCN→TIME的映射关系。数据库通过后台监控进程SMON每隔5分钟更新一次表,记录一次时间戳和当前的SCN。此表总共能记录保存1 440条记录,相当于5天的信息。
1.2 数据恢复应用
下面从一个误操作实例看Oracle 9i闪回技术是如何恢复数据的。在用户GERENZHULI下复制一张表:create table test as select * from relation。初始时test表有9个用户记录,由于疏忽删除几条数据记录,现将其还原。
(1)误操作之后,查询当前的数据记录为5条。
(2)查询获得当前的SCN。
SQL>select dbms_flashback.get_system_change_number scn from dual;
SCN
----------------
5664842
(3)为数据恢复创建一张表test_for_recov,供数据闪回时插入记录。
SQL> create table test_for_recov as select * from test where 1=0;
表已创建。
(4)选择一个比当前小的SCN,向前恢复数据,多次尝试SCN值,以获得满足自己需要的数据状态。
SQL> select count(*) from test as of scn 5659000;
COUNT(*)
----------------------------
9
(5)从上面SCN的尝试,利用闪回技术恢复数据,将数据插入到表test_for_recov。
SQL> insert into test_for_recov select * from test as of scn 5659000;
已创建9行。
SQL> commit;
提交完成。
至此,将数据恢复到了误操作之前的状态。
2 Oracle 10g闪回技术的数据恢复
2.1 参数设置
Oracle 10g闪回技术主要包括闪回数据库﹑闪回表﹑闪回删除﹑闪回查询﹑闪回版本查询和闪回事务查询[2,5]。使用闪回技术前,首先设置闪回恢复区的位置参数db_recovery_file_dest;其次设置闪回的最大时间限制参数db_flashback_retention_target;再把数据库设置为归档模式:alter database archivelog。如没有这个设置,在将数据库打开为Flashback模式时会出现ORA-38706错误。在以上所有的设置完成之后,关闭数据库后又重启到Mount状态下,使用命令alter database flashback on改变数据库模式为闪回状态。
SQL> alter database flashback on;
Database altered.
2.2 Oracle 10g闪回技术应用
(1)闪回数据库
闪回数据库(Flashback Database)是Oracle 10g新增的功能。Oracle 10g闪回数据库功能启用后,数据库会定期将发生变化的数据块的前镜像写入闪回日志的日志文件中,这些日志文件并不是传统的LGWR进程写入的,而是由一个新进程RVWR写入。
SQL> select sid , program from v$session where program like '%RVWR%';
SID PROGRAM
---------------------------
160 ORACLE.EXE (RVWR)
下面看一下闪回数据库功能恢复数据库实例。
①查询数据库的闪回状态。
SQL>select dbid,name,flashback_on,current_scn from v$database;
DBID NAME FLASHBACK_ON CURRENT_SCN
--------------------------
1239861505 ORCL YES 2603302
②连接到用户scott下,新建一张表customer并插入12条数据,之后把数据从表中截断,截断前的时间查询到(2010-03-27 20:59:16)为止,查询截断后的表数据信息和当前的时间
SQL> truncate table customer;
Table truncated.
表中数据已被截断,查询信息被删除后的时间:
SQL>select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
NOW_TIME from dual;
NOW_TIME
-------------------------
2010-03-27 21:02:37
③关闭数据库并重启到Mount状态,用flashback database将数据库闪回到时间点(2010-03-27 20:59:16)
SQL> flashback database to timestamp to_timestamp('2010-03-27 20:59:16','yyyy-mm-dd hh24:mi:ss');
Flashback complete
④闪回恢复后,再打开数据库实例时,需要使用参数resetlogs或noresetlogs:
SQL> alter database open resetlogs;
Database altered
经查询,表的数据已恢复。
(2)闪回表
闪回数据库可以将整个数据库恢复到指定的时间点。但用户只希望对指定的表进行恢复,Oracle 10g提供了闪回表(Flashback Table)功能,可以将指定表中的数据﹑索引﹑触发器等恢复到指定的SCN或时间点。由于flashback table 技术使用DML操作恢复数据,不能保证Rownum不变,所以在闪回之前先执行alter table Tablename enable row movement,后flashback table Tablename to timestamp|scn<timestamp|scn>。
(3)闪回删除
Oracle 10g闪回删除(Flashback Drop)功能可以从数据库中恢复一个被删除的对象。在执行删除(Drop)操作时,并不是真删除,而是将该对象放入回收站(RecycleBin)中,并将对象重命名。这个回收站是虚拟出来的,被删除的对象在其上也占用删除前的存储空间,甚至可以查询被删除的对象,也可以用Flashback Drop恢复[7-8]。其原理如图1所示。
下面分析闪回删除的使用。
14:43:50 SQL> drop table utest;
Table dropped.
14:44:39 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBI NNAME OBJECT TYPE DROP TIME
------------------------------
UTEST BIN$uzhndNgOQ6+GNkipYhcK/A==$0 TABLE 2010-03-28:14:44:39
14:44:49 SQL> flashback table utest to before drop;
Flashback complete
要清除回收站所有的对象,可以使用purge recyclebin;要彻底删除表,不想将它放入回收站可以这样删除表:drop table Tablename purge。
(4)闪回版本查询(Flashback Version Query)和闪回事务查询(Flashback Transaction Query)。
Oracle 9i闪回查询只能得到过去某个时间点的数据版本,由于当前时间与过去某个时间之间,一个表中的数据可能被更新多次,一个时间点的数据版本可能无法满足恢复需要。Oracle 10g通过闪回版本查询可以查询不同时间点的不同版本数据。它只能查询提交后的数据。建立表test11,并在其上进行数据insert﹑delete﹑update操作并提交,而后查询数据的版本信息。
13:30:02SQL>select versions_starttime , versions_operation , user_id from test11 versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME V USER_ID
-------------------------------
28-3月 -10 01.30.01 下午 D 1
28-3月 -10 01.29.27 下午 U 1
28-3月 -10 01.28.53 下午 I 3
在闪回版本查询的基础上,就可以进行闪回事务查询(Flashback Transaction Query)恢复。闪回事务的历史信息以及Undo_SQL保存在FLASHBACK_TRANSATION _QUERY表中。查询该表的Undo_SQL,使用UNDO语句就可以撤消事务。
本文分别介绍了数据库Oracle 9i和10g闪回技术在恢复数据的应用。根据上面的应用分析,Oracle 9i与Oracle 10g闪回技术对比如表1所示。
从对比中可以看到,闪回处理手段Oracle 10g比Oracle 9i灵活﹑快捷﹑实用、安全。这一技术在数据恢复上具有诸多优点,在以后的学习研究领域中还有待扩展。
参考文献
[1] 盖国强.Oracle数据库管理﹑优化与备份恢复[M].北京:人民邮电出版社,2007:226-365.
[2] THOMAS K.Expert Oracle database architecture 9i and 10g programming techniques and solutions[M].USA:Apress Expert.2005.
[3] QUN Li,HONG Lin Xu.Research on the backup bechanism of oracle database[J].IEEE Computer Soc:2009(2):423-426.
[4] 王晨,胡艳,宣海荣.Oracle10g新特性Flashback探究[J]. 计算机时代:2007,25(7):58-59.
[5] MATTBEW H,SCOTT J.Oracle database 10g高可用性实现方案-运用RAC、Flashback和Data Guard技术[M].刘永健,孔令梅,译.北京:清华大学出版社,2005.
[6] JOHNSON J.Ready to recover[J].Oracle Magazine:2003,17 (5):85-88
[7] Oracle官方网.Oracle flashback technology[EB/OL].http:// www.oracle.com/technology/deploy/availability/htdocs/Flash-back_Overview.htm.
[8] KUNDERSMA R.Feature enthusiasm:Oracle flashback database[EB/OL].http://blogs.oracle.com/XPSONHA/2009/ 07/feature_enthusiasm_oracle_flas.html:2009/7/31.