资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
Oracle10g Flashback 实践2008-11-21 16:52一、概述环境:RHEL4.5,oracle10.2.0.1Flashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。在10g 中Flashback又得到了相当大的增强,利用Recycle Bin(回收站)和Flash Recovery Area(闪回区)的特性实现快速恢复删除表(Flashback Table)或做数据库时间点恢复(Flashback Database)的功能。要使用flashback 的特性,必须启用自动撤销管理表空间,不仅是flashback query,也包括flashback table 和flashback database,而对于后两项还会有些其它的附加条件,比如flashback table 需要启用了recycle bin(回收站),flashback database 还要求必须启用了flashback area(闪回区)。SQL show parameter undoNAME TYPE VALUE- - -undo_management string AUTOundo_retention integer 10800undo_tablespace string UNDOTBS1在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,例如:SQL Alter tablespace undotbs1 retention guarantee;如果想禁止undo 表空间retention guarantee,如例:SQL Alter tablespace undotbs1 retention noguarantee;二、Flashback Query(闪回查询)Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据!1、As of timestamp的示例SQL create table tab_test as select rownum id from dba_users;SQL delete from tab_test where id commit;假设当前距离删除数据已经有3分钟左右的话:SQL select count(*) from tab_test as of timestamp sysdate-3/1440 where id insert into tab_test select * from tab_test as of timestamp sysdate-3/1440 where id commit;提示:as of timestamp|scn 的语法是自9iR2 后才开始提供支持,如果是9iR1 版本,需要使用DBMS_FLASHBACK包来应用flashback query 的特性。2、As of scn的示例如果需要对多个相互有主外键约束的表进行恢复时,如果使用as of timestamp 的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过scn 方式则能够确保记录的约束一致性。获取当前scn 的方式非常多,比如:SQL select current_scn from v$database;SQL select dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER- 191460SQL delete tab_test where id5;SQL commit;SQL select * from tab_test as of scn 191460;SQL insert into tab_test select * from tab_test as of scn 191460 where id not in (select id from tab_test);SQL commit;事实上,Oracle 在内部都是使用scn,即使你指定的是as of timestamp,oracle 也会将其转换成scn,系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME。SQL select scn,to_char(time_dp,yyyy-mm-dd hh24:mi:ss) time_dp from sys.smon_scn_time;3、Versions between版本查询功能更加强大,通过versions between 能够查看指定时间段内undo 表空间中记录的不同版本(注意只包括被提交的记录)。版本查询过程中提供了多个伪列如下:VERSIONS_STARTSCN/VERSIONS_STARTTIME 记录操作时的scn 或时间,如果为空,表示该行记录是在查询范围外创建的。VERSIONS_ENDSCN/VERSIONS_ENDTIME 记录失效时的scn 或时间,如果为空,说明记录当前时间在当前表内存在,或者已经被删除了,可以配合着VERSIONS_OPERATION 列来看,如果VERSIONS_OPERATION 列值为D,说明该列已被删除,如果该列为空,则说明记录在这段时间无操作。VERSIONS_XID 该操作的事务IDVERSIONS_OPERATION 对该行执行的操作:I 表示insert,D 表示delete,U 表示update。提示:对于索引键的update 操作,版本查询可能会将其识别成两个操作DELETE 和INSERT。SQL update tab_test set id=id+100 where id5;SQL commit;SQL delete tab_test where id commit;SQL insert into tab_test values (888);SQL commit;SQL select dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER- 191611SQL select id,VERSIONS_XID,versions_startscn,to_char(VERSIONS_STARTTIME,yyyy-mm-dd hh24:mi:ss) VERSIONS_STARTTIME,versions_endscn,to_char(VERSIONS_ENDTIME,yyyy-mm-dd hh24:mi:ss) VERSIONS_ENDTIME,versions_operation from tab_test versions between scn 191460 and 191611 order by 3;4、Transaction query事务查询SQL select dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER- 192329SQL delete tab_test where id rollback;SQL delete tab_test where id=5;SQL commit;SQL select dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER- 192377SQL select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q where q.xid in( select versions_xid from tab_test versions between scn 192329 and 192329);注:由于事务ID 是保存在版本查询中,因此我们需要通过版本查询来关联出flashback 的事务信息,这也是前面操作前要通过dbms_flashback 包取scn 的原因。5、DDL的影响修改并提交过数据之后,对表做过DDL 操作,包括:drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。另外,flashback query 对v$tables,x$tables 等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。同时该特性也完全支持访问远端数据库,比如:select * from tbldblink as of scn 360; 的形式。三、Flashback Table(闪回表)1、从RECYCLEBIN中恢复要恢复recyclebin 中的表,注意语句如下:Flashback table objName to before drop,这个obj_name 即可以是表名,也可以是recyclebin 中的对象表(支持同时操作多个表,表名之间以逗号分隔即可,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功要么都失败),由于该项功能是恢复被删除表,因此官方对其还有另外一称谓:flashback drop。系统参数recyclebin默认是on,即启用了回收站功能,可以在sess
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号