在Oracle中使用Flashback
在Oracle 9i/10g中使用Flashback
  一、Flashback的概念
  在Oracle 9i数据库中,提出了数据闪回〔Flashback〕的概念。使用Flashback,可以在不对数据库进行不完全恢复的情况下,对某一个指定的表进行恢复。
  所谓Flashback就是使数据库中的实体显示或回到过去的某一时间点,这样可以实现对历史数据的恢复。
  二、在Oracle 9i中使用Flashback
  ? ? ?
  在Oracle 9i中使用包DBMS_FLASHBACK来提供闪回功能。
  如果需要用到闪回查询,必须在a或者是a中设置以下参数undo_management = auto 〔默认〕
  此外,参数undo_retention = n〔秒〕,它决定了能往前闪回的最大时间〔Undo最多的保存时间〕,越大的值,就会需要更多的Undo空间的支持。
  SQL> show parameter auto
  SQL> alter system set undo_retention=1200; 〔Undo信息将保持1200秒=20分钟〕
  注意:Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。如果原来插入的记录到做闪回的时间在5分钟之内,用基于时间的flashback可能并查询不到记录,因为如果是基于时间点的查询,也是转化为最近的一次SCN,然后从这个SCN开始进行恢复,因此,如果需要精确的查询,我们可以采用基于SCN的flashback,它将能精确的闪回到需要恢复的时间。
  Oracle 9i的Flashback有如下限制。
  ? 采用时间点的恢复,不能精确到最近5分钟,如果需要更精确的查询,需要采用
  SCN。
  ? 不能flashback 5天以前的数据,这个并不是undo_retention所能决定的。
  ? 闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。 ? 由于受到undo_retention的影响,对于undo_retention之前的时间,flashback不保
  证能成功
  ? 对于drop,truncate等不记录回滚的操作,flashback是无能为力的。
  例子:
  1. 创立包DBMS_FLASHBACK
  SQL> @?/rdbms/admin/dbmstran.sql 2. 以system用户连接
  SQL> conn system/oracle
  3. 获得当前的SCN和时间点
  SQL> select _system_change_number() from dual; DBMS_FLASHBA
CK.GET_SYSTEM_CHAN ------------------------------ 2324682
  SQL> select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual; TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
  ------------------------------ 2022  -05-12 16:39:46
  SQL> select * p; 4.更新记录 SQL> p set sal=888;
  SQL> commit;
  5.基于SCN和时间点查询修改前的情况 SQL> select * p as of scn 2324682;
  SQL> select * p as of timestamp(to_timestamp('2022  -05-12 16:39:46', 'yyyy-mm-dd hh24:mi:ss'));
  6.使用Flashback功能取消修改 SQL> execute able_at_system_change_number(2324682);
truncatedelete和drop的区别
  或者
  SQL> exec able_at_time(to_date('2022  -05-12 16:39:46', 'YYYY-MM-DD HH24:MI:SS')) 〔修改时的时间〕
  SQL> select * p;
  注意:现在看到的只是闪回的结果,实际上并未恢复数据。且闪回状态下不能做DML操作。
  SQL> p where empno=7369; 〔出错〕 SQL> execute dbms_flashback.disable(); SQL> select * p;
  三、在Oracle 10g中使用Flashback
  Oracle 10g的Flashback:
  ? 可以简单的利用查询语句实现flashback query,而不再需要象9i那样需要调用
  DBMS_FLASHBACK包
  ? 在基于时间上的flashback不再有5分钟的限制了,也可以象SCN一样进行精确的
  flashback query
  在Oracle 10g中,Flashback操作包括以下几个方面:
  ? Oracle Flashback Database〔数据库闪回〕
  这个特性允许你通过SQL语句FLASHBACK DATABSE语句,让数据库前滚到当
  前的前一个时间点或者SCN,而不需要做时间点的恢复。 ? Oracle Flashback Table〔表闪回〕
  这个特性允许你利用SQL语句FLASHBACK TABLE语句,确保回滚到表的前一个时间点。
  ? Oracle Flashback Drop〔删除闪回〕
  Oracle 10g开始提供一个类似垃圾站的功能,来恢复不小心被drop的表 ? Flashback Query〔查询闪回〕 ? Oracle Flashback Version Query
  利用保存的回滚信息,你可以看到特定的表在时间段内的任何修改,如电影的回放一样,你将了解表在该期间的任何变化 ? Oracle Flashback Transaction Query
  这个特性将确保您检查数据库的任何改变在一个事务级别。你可以利用它来诊断问题,性能分析和审计事务
  1.查询闪回〔Flashback Query〕〔10g新增〕
  SQL> conn scott/tiger
  SQL> create table emp2 as select * from emp;
  SQL> select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual; 上面语句获取当前时间,如2022  -05-12 13:22:33 SQL> select * from emp2; SQL> delete from emp2; SQL> commit;
  SQL> select * from emp2 as of timestamp to_timestamp('2022  -05-12 13:22:33', 'YYYY-MM-DD HH24:MI:SS');
  注意:flashback query查询以前的一个快照点,并不改变当前表的状态
  2.表闪回〔Flashback Table〕
  Oracle 10g的flashback table有如下特性: ? 在线操作
  ? 恢复到指定时间点或者SCN的任何数据 ? 自动恢复相关属性,如索引,触发器等 ? 满足分布式的一致性
  ? 满足数据一致性,所有相关对象将自动一致
  语法为:
  ? flashback table employee to scn 123456;
  ? flashback table t1 to timestamp to_timestamp('2003-03-03 12:05:00', ‘YYYY-MM-DD
  HH24:MI:SS’) [enable trigger]s;
  其中enable triggers表示触发器恢复之后为enable状态,而默认为disable状态。 注意:如果需要flashback一个表,需要保证
  ? 有flashback any table的系统权限或者是该表的flashback对象权限
  ? 有该表的SELECT,INSERT,DELETE,ALTER权限 ? 必须保证该表ROW MOVEMENT
  例子:
  SQL> alter table emp2 enable row movement;
  SQL> flashback table emp2 to timestamp to_timestamp('2022  -05-12 13:22:33', 'YYYY-MM-DD HH24:MI:SS');
  SQL> flashback table emp2 to before drop rename to emp3;
  执行delete操作的表是可以恢复的,而执行truncate操作的表是不可以恢复的,这是因为flashback table利用undo进行的
  3.删除闪回〔Flashback drop〕
  SQL> drop table emp2; SQL> show recyclwbin
  SQL> flashback table emp2 to before drop;
  4.数据库闪回〔Flashback Database〕

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。