Oracle10g Flashback 实践

合集下载

oracle 10g的闪回技术总结

oracle 10g的闪回技术总结

oracle 10g闪回技术总结oracle 10g的闪回一共有三种:1、全库闪回2、表被drop后的闪回3、表被dml操作之后的闪回(dml操作指delete、insert、update三种操作)一、介绍各种闪回和那些因素有关1)全库的闪回由于需要的空间是当前数据库空间大小的两倍(即如果数据库是50G,则要另外还需要100G空间才能使用全库的闪回),因此目前在所有项目中都不使用,这里也不做介绍2)被drop掉的表能否闪回来与两个因素相关:1、该表所在表空间的大小有关,即如果表空间够大,用drop语句删除的表,并不是真正的从数据库中删除,而是把表改成BIN$开头的表,但是如果表空间不够大,在有新数据要存入该表空间的时候,就会覆盖这些BIN$表所暂的物理空间,此时也就没有办法利用闪回恢复该表了2、删除该表的时候是否用的purge,如果在drop的时候使用了purge,则该表就被从表空间中彻底的被删除了,如果要恢复,必须用以前的备份恢复3)被dml操作之后表数据能否闪回与下面两个因素的关系:1、undo_retention参数设置值UNDO_RETENTION参数用以控制事务提交以后UNDO信息保留的时间,UNDO信息可以用于一系列的闪回查询等操作,该参数以秒为单位.但是默认情况这是一个非担保性(NO Guaranteed)限制,也就是说,如果有其他事务需要回滚空间,而空间出现不足时,这些信息仍然会被覆盖。

2、undo表空间的大小闪回需要的数据都是存储在undo表空间中,保留多久是由undo_retention 参数设置值和表空间大小一起决定,在undo表空间足够大的情况下,可以闪回undo_retention参数设置保留时间之内的数据(例如:undo_retention参数设置了900,这可以闪回15分钟前的数据),但是如果undo表空间不够大,在undo 使用到100%的时候,这个时候如果有其他事务需要使用回滚段时,就会覆盖已经commit但是还没有过undo_retention保留时间的信息。

oracleflashback闪回功能之--恢复存储过程篇

oracleflashback闪回功能之--恢复存储过程篇

oracleflashback闪回功能之--恢复存储过程篇超级好用的oracle 闪回功能之--恢复存储过程篇┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┠※┃名称:oracle 闪回功能之--恢复存储过程篇┠※┃说明:将存储过程恢复到某一指定时间段。

┠※┃作者:zlj113┠※┃时间:20091225┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛经常有在工作中误操作导至程存过程被替换或被删除的现象产生。

给工作带来一定的麻烦,可能需要重新写一次代码,若过程比较短重写一次还能接受,若是那种比较长的存储过程重要则是需要付出相当大的代价的。

好在oracle10G就开始提供了一种强大的闪回flashback 功能,可以针对误删除的数据,表,存储过程等进行恢复。

废话就先不说了,看看详细的恢复过程吧^^....首先需要用SYS登陆到PLSQL Devplore 中,选择 sysdba 的权限,若用其它的用户登陆则在下面的操作中会提示出权限不足的警告第三种方法:SQL> set pagesize 0SQL> column text format a4000SQL> spool C:\7.textStarted spooling to C:\7.textSQL> SELECT textFROM DBA_source AS OF TIMESTAMP TO_TIMESTAMP('2009-12-25 10:07:00', 'YYYY-MM-DD HH24:MI:SS')WHERE OWNER = '用户名'AND NAME = ‘存储过程名’ORDER BY LINE;SQL> spool off;这种方法就不用事先查询出存储过程的ID只需要知道名字和用户即可.第一种方法:在Command窗体里依次输入:set pagesize 0column text format a4000 --格式化text 列的数据 a4000表示文字按4000长度显示spool c:\1.text -- 这句是指一会将结果输出到文件,如果存储过程比较小则可以采用第2种方法)select text From source$ as of timestamp to_timestamp('2009-12-25 12:21:38', 'yyyy-mm-dd hh24:mi:ss') where obj#=55110; --这里的时间点就是你想要恢复什么时候的存储过程. 而obj#=55110 这个55110是你存储过程相对应的ID号,可以在事先用select object_id from dba_objects where object_name ='存储过程名注意大小写是敏感的'; 查出所对应的ID号。

Oracle10g Flashback 实践

Oracle10g Flashback 实践

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 undoNAMETYPE 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<5;SQL> commit;假设当前距离删除数据已经有3分钟左右的话:SQL> select count(*) from tab_test as of timestamp sysdate-3/1440 where id<10;SQL> insert into tab_test select * from tab_test as of timestamp sysdate-3/1440 where id<5;SQL> commit;提示:as of timestamp|scn 的语法是自9iR2 后才开始提供支持,如果是9iR1 版本,需要使用DBMS_FLASHBACK包来应用flashback query 的特性。

oracle10g更强大的回闪数据库功能 (1)

oracle10g更强大的回闪数据库功能 (1)

Oracle 10g更强大的回闪数据库功能【IT168 服务器学院】用一个简单的SQL语句将一个表或者整个数据库恢复到以前的某一点。

除夕之夜,Acme银行的数据库管理员(DBA)John正在和他的朋友们一起狂欢,倒计时迎接新的一年的到来。

就在子夜钟声敲响、人群欢呼之时,他的寻呼机突然响了。

在银行的数据中心,在年末进行利息累机批处理簿记过程中发生了错误,所有的利息计算都不准确。

幸好开发团队找出了错误所在,并开发一个应急纠正模块,但这一纠正模块不能恢复已经造成的破坏。

部门经理问John是否有什么方法能往回倒一些时间,将数据库恢复至该批处理开始之前的状态,该批处理大约是在晚上11:00开始的。

对于DBA们来说,这不是一件很熟悉的事吗?John的选择是什么呢?在Oracle数据库10g之前,John可能会做一个"时间点"恢复,来将数据库恢复至所希望的某一时刻的状态。

不幸的是,银行的定期日常备份大约就是在那个时间开始,这就意味着他将不得不用接近24小时的有价值的归案日志来恢复数据库。

Oracle9i数据库中提供的另一种选择是使用回闪查询特性来重建到晚上11:00为止的该表的各行,并手动生成一组不同的表。

这一方法尽管理论上可行,但如果表的数量很大,则会变得不切合实际。

幸运的是,John现在的数据库是Oracle数据库10g,所以他拥有更多的选择。

回闪表让我们来看一下上面的情况。

出问题的年末批处理可能仅影响少数表。

例如,它可能仅用新的账户结余更新了ACCOUNTS表。

如果确实是这种情况,则John可以使用回闪表特性,它会将一个表恢复到一个过去的时间点的状态。

执行回闪表操作不需要特殊的设置。

唯一的要求是表必须具有可移动的行--或者是在创建表时设置,或者是在以后利用ALTER TABLE ACCOUNTS ENABLE ROW MOVEMENT 语句设置。

FLASHBACK TABLE语句从撤消段中(undo segment)读取该表的过去映像,并利用Oracle9i中引入的回闪查询重建表行。

10g中的flashbacktable

10g中的flashbacktable
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
我们可以发现,执行delete操作的表是可以恢复的,而执行truncate操作的表是不可以恢复的,这正好也说明了flashback table利用undo的结论。
可以把truncate 掉的那个BLOCK DUMP出来,然后根据dump出来的东西形成sqllod 的形式就可以了!
或者直接分析你的数据文件,根据数据文件里面的内容把数据提取出来
以上两种方法都可以做到
----------------------------------------------------------------总结如下-----------------------------------------------------------------------------------------------------------
Index created.
16:39:55 SQL> create index inx_test2 on T1 (object_id);
Index created.
16:40:47 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
flashback table与9i的flashback query相似,利用undo信息来恢复一个或者一些表到现在以前的一个时间点(一个快照)。Undo相关参数如下,需要确保AUM与足够的retention值。
SQL> show parameter undo

10g的闪回功能--flashback

10g的闪回功能--flashback

oracle 10g flashback 学习flashback:即回闪,是从oracle9i就开始提出的一种操作恢复的功能,在oracle10g中进行了增强和修改,通过回闪,用户可以完成许多不可能恢复的工作,目前oracle10g的回闪包括以下特性;1〉oracle falshback Database. 特性允许oracle通过Flashback database语句,将数据库会滚到前一个时间点或者scn上,而不需要作时间点的恢复工作!)(数据库级了!)2〉oracle falshback table. 特性允许oracle通过flashback table语句,将表会滚到前一个时间点或者scn上。

3〉oracle falshback drop. 特性允许oracle恢复被drop掉的table或者索引。

4〉oracle falshback version query. 特性可以得到特定的表在某一个时间段内的任何修改记录!(9i就具备的功能)5〉oracle falshback transaction query 特性可以限制用户在某一个事务级别上检查数据库的修改操作,适用于诊断问题、分析性能、审计事务。

一:oracle falshback tableoracle flashback table即回闪表可以进行的操作:操作1>flashback table tablename to befor drop;对于误drop的table此可以使用本操作,还原drop的table!此操作需要用户有以下的权限:A:falshback any table的系统权限或者是某一个表的flashback权限。

B:有table的select、insert、delect、alter权限。

C:有table的row Movement权限SQL> set serveroutput onSQL> set time on11:24:37 SQL> set feadback off;11:24:59 SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------B TABLESTEST TABLETA TABLEGROUPINGTEST TABLECOLTABLE TABLEROWTABLE TABLECOLTABLE1 TABLEROWTABLE1 TABLEA1 TABLEA TABLE----------------------可以看到本用户下有table A,现在drop它;-----------------------11:25:01 SQL> drop table a;11:26:18 SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------B TABLESTEST TABLETA TABLEGROUPINGTEST TABLECOLTABLE TABLEROWTABLE TABLECOLTABLE1 TABLEROWTABLE1 TABLEBIN$dFFlS6jJQLShRwRQ+kLJMg==$0 TABLEA1 TABLE----------------------table已经删除,可以看到table并不是真正意义上的删除掉了,而是多了一个"BIN$dFFlS6jJQLShRwRQ+kLJMg==$0"的表,这个表是原来的A表,这是oracle 的recyclebin,一个类似垃圾回收站的机制。

Oracle10g新特性之flashback?table

Oracle10g新特性之flashback?table

Oracle10g新特性之flashback?tableOracle10g新特性之flashback tableFlashback table功能可以将表恢复到以前的某一个时刻的状态,因为flashback table也是利用到undo信息,所以在进行flashback table的时候,必须保存其undo信息存在。

--flashback table对于SYS用户下的对象无效SQL> conn sys/sys@ora10g as sysdba;已连接。

SQL> create table tt(name varchar2(10));表已创建。

SQL> insert into tt values ('one');已创建 1 行。

SQL> commit;提交完成。

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';会话已更改。

SQL> select sysdate from dual;SYSDATE-------------------2007-05-16 15:38:39SQL> truncate table tt;表已截掉。

SQL> alter table tt enable row movement;表已更改。

SQL> flashback table tt to TIMESTAMP to_timestamp('2007-05-16 15:38:39','yyyy-mm-dd hh24:mi:ss');flashback table tt to TIMESTAMP to_timestamp('2007-05-16 15:38:39','yyyy-mm-dd hh24:mi:ss')*第 1 行出现错误:ORA-08185: 用户 SYS 不支持闪回--我们用另外一个用户尝试SQL> grant flashback any table to scott;授权成功。

ORACLE10g--闪回

ORACLE10g--闪回
4)启动闪回数据库
在数据库是mount状态下,执行命令
SQL>alter database flashback on;
SQL>alter database flashback off; ----注意:一旦关闭闪回数据库,FRA日志全部自动删除
例子:
SQL>shutdown immediate;
一、闪回数据库 flashback database
1、可以处理的场景:
1)误删用户
2)truncate table
3)多表数据发生混乱
2、闪回数据库条件
1)数据库配置为归档模式
SQL>archive log list;
SQL>shutdown immediate;
SQL>startup mount;
SQL>select count(*) from "FSFASnFMMFDmfd==$0";
3、被删除的对象的空间回收
1)自动回收
oracle 使用空间规则:使用表空间里不属于回收站的对象所占用的可用空间,释放回收站所占用的空间(先释放最老的对象),对数据文件扩展(定义了自动扩展)。
一旦回收站被释放,就无法闪回。
SQL>purge dba_recyclebin; --清除回收站里属于所有对象所占用的空间
以下语句无法闪回
SQL>drop table t purge;
SQL>drop user wuxzh cascade;
SQL>drop tablespace users including contents;
闪回是根据闪回日志来恢复的,也可以根据闪回日志的SCN号进行闪回。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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<5;SQL> commit;假设当前距离删除数据已经有3分钟左右的话:SQL> select count(*) from tab_test as of timestamp sysdate-3/1440 whereid<10;SQL> insert into tab_test select * from tab_test as of timestamp sysdate-3/1440 where id<5;SQL> 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 id>5;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 id>5;SQL> commit;SQL> delete tab_test where id<5;SQL> 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> selectid,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<3;SQL> 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 tbl@dblink as of scn 360; 的形式。

相关文档
最新文档