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----