oracle 闪回功能

来源:互联网 发布:小区业主号码采集软件 编辑:程序博客网 时间:2024/04/30 05:50

time:2008/04/15
author: skate

oracle 闪回功能


闪回查询功能完全依赖于自动回滚段管理(AUM),进行闪回查询必须设置自动回滚段管理,在init.ora设置
参数UNDO_MANAGEMENT=AUTO,参数UNDO_RETENTION=n,决定了能往前闪回的最大时间,值越大就需要越
多Undo空间。

 

Oracle中Delete和Commit操作的流程分析

  (1)删除(Delete)流程

  ·Oracle读Block(数据块)到Buffer Cache(缓冲区)(如果该Block在Buffer中不存在);

  ·在Redo Log Buffer(重做日志缓冲区)中记录Delete操作的细节;

  ·在相应回滚段段头的事物表中创建一个Undo(回滚)条目;

  ·把将要删除的记录创建前镜像,存放到Undo Block(回滚块)中;

  ·在Buffer Cache中的相应数据块上删除记录,并且标记相应的数据块为Dirty(脏)。

  (2)提交(Commit)流程

  ·Oracle产生一个SCN;

  ·在回滚段事物表中标记该事物状态为Commited;

  ·LGWR(日志读写进程) Flush Log Buffer到日志文件;

  ·如果此时数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交;

  ·如果Dirty Block已经被写回到磁盘,那么下一个访问这个Block的进程将会自回滚段中获取该事物的状态,确认该事物被提交。然后这个进程获得提交SCN并写回到Block Header上,这被称为延迟块清除。


例子:


SQL> alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss';

会话已更改。

SQL> select sysdate from dual;

SYSDATE
-------------------
2008/04/15 21:30:37

1.查存闪回

SQL> select * from bb;

        ID NAME
---------- ------------------------------
         2 12
         2 343


SQL> select * from bb as of timestamp to_timestamp('2008-04-15 20:39:00','yyyy-m
m-dd hh24:mi:ss');

        ID NAME
---------- ------------------------------
         2 12

SQL>

表的删除与恢复

SQL> create table aa as select * from bb;

表已创建。

SQL> commit;

提交完成。

SQL> delete from bb;

已删除2行。

SQL> commit;

提交完成。

SQL> select * from bb;

未选定行

SQL> select * from bb as of timestamp to_timestamp('2008/04/15 20:40:00','yyyy/m
m/dd hh24:mi:ss');

        ID NAME
---------- ------------------------------
         2 12

SQL>

2.表的闪回

我的操作用户是dba的权限,表的闪回要求用户具有flashback  any  table的权限

SQL> flashback table bb to timestamp to_timestamp('2008/04/15 20:40:00','yyyy/mm
/dd hh24:mi:ss');
flashback table bb to timestamp to_timestamp('2008/04/15 20:40:00','yyyy/mm/dd h
h24:mi:ss')
                *
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表


SQL> alter  table bb enable row movement;

表已更改。

SQL> flashback table bb to timestamp to_timestamp('2008/04/15 20:40:00','yyyy/mm
/dd hh24:mi:ss');

闪回完成。

SQL> select * from bb;

        ID NAME
---------- ------------------------------
         2 12

SQL>

 

3.删除闪回


SQL> select object_name,original_name,type,droptime from user_recyclebin;

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
TYPE                      DROPTIME
------------------------- -------------------
BIN$7SlxSP9OQWmOj9V5CG7LSg==$0 BB
TABLE                     2008-04-15:21:43:48


SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------

BB               BIN$7SlxSP9OQWmOj9V5CG7LSg==$0 TABLE        2008-04-15:21:43:48

SQL> flashback table bb to before drop;

闪回完成。

SQL> select table_name from usr_tables;
select table_name from usr_tables
                       *
第 1 行出现错误:
ORA-00942: 表或视图不存在


SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
BB
AA
SYS_TEMP_FBT

SQL> commit;

提交完成。

SQL> show recyclebin
SQL>


SQL> create table bb as select * from aa;

表已创建。

SQL> commit;

提交完成。

SQL> drop table bb;

表已删除。

SQL> show recycclebin;
SP2-0735: 未知的 SHOW 选项开头 "recycclebi..."
SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------

BB               BIN$sf07cXG6T3+7x1pjBUKT3g==$0 TABLE        2008-04-15:22:14:56

SQL> purge table bb;

表已清除。

SQL> show recyclebin;
SQL> purge dba_recyclebin
  2  ;
purge dba_recyclebin
*
第 1 行出现错误:
ORA-01031: 权限不足


SQL> purge user_recyclebin
  2  ;

回收站已清空。

SQL>


----end---- 

原创粉丝点击