oracle闪回(flashback)

在oracle 10g中提供闪回操作

那么什么是闪回呢?

lOracle的操作工程中,会不可避免地出现操作失误或者用户失误,例如不小心删除了一个表等,这些失误和错误可能会造成重要数据的丢失,最终导致Oracle数据库停止。
l在传统意义上,当发生数据丢失、数据错误问题时,解决的主要办法是数据的导入导出、备份恢复技术,这些方法都需要在发生错误前,有一个正确的备份才能进行恢复。
l为了减少这方面的损失,Oracle提供了闪回技术。有了闪回技术,就可以实现数据的快速恢复,而且不需要数据备份。
l 闪回表 (flashbacktable)
l 闪回删除 (flashbackdrop)
l 闪回版本查询 (flashbackversion query)
l 闪回事务查询 (flashbacktransaction query)
l闪回表,实际上是将表中的数据快速恢复到过去的一个是焦点或者系统改变号SCN上。实现表的闪回,需要使用到与撤销表空间相关的undo信息,通过 show parameter undo命令可以了解这些信息。
l用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复的基础。例如,某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改之前的状态。

l执行表的闪回,需要有 flashback any table的权限

FLASHBACK TABLE [schema.]<table_name>

TO 

{[BEFORE DROP [RENAMETO table]] 

[SCN|TIMESTAMP]expr

[ENABLE|DISABLE]TRIGGERS}


lschema:模式名,一般为用户名。
lTOTIMESTAMP:系统邮戳,包含年、月、日、时、分、秒。
lTOSCN:系统更改号,
lENABLETRIGGERS:表示触发器恢复以后为enable状态,而默认为disable状态。
lTOBEFORE DROP:表示恢复到删除之前。
lRENAMETO table:表示更换表名。



SQL> host cls


SQL> /*
SQL> 1. 错误地删除了记录
SQL> 2. 错误地删除了表
SQL> 3. 查询历史记录
SQL> 4. 如何撤销一个已经提交的事务
SQL> 
SQL> 闪回的类型
SQL> 1. 闪回表:将表回退到过去的一个时间上
SQL> 2. 闪回删除:Oracle回收站
SQL> 3. 闪回版本查询:所有历史记录
SQL> 4. 闪回事务查询: 通过select语句得到一个 undo_sql
SQL> 
SQL> 5. 闪回数据库
SQL> 6. 闪回归档日志
SQL> */
SQL> --SCN系统改变号(时间)
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,
  2         timestamp_to_scn(systimestamp) SCN
  3  from dual;


时间                                 SCN                                        
----------------------------- ----------                                        
2012-10-25 10:31:02*000000       3783972                                        


SQL> /*
SQL> SQL> show parameter undo
SQL> 
SQL> NAME                                 TYPE        VALUE
SQL> ------------------------------------ ----------- --------------------
SQL> undo_management                      string      AUTO
SQL> undo_retention                       integer     1200
SQL> undo_tablespace                      string      UNDOTBS1
SQL> SQL> --scope的取值: momery  spfile both
SQL> SQL> alter system set undo_retention=900 scope=both;
SQL> */
SQL> --权限  grant flashback any table to scott;
SQL> create table flashback_table
  2  (fid number,fname varchar2(20));


表已创建。


SQL> insert into flashback_table values(1,'Tom');


已创建 1 行。


SQL> insert into flashback_table values(2,'Mary');


已创建 1 行。


SQL> insert into flashback_table values(3,'Mike');


已创建 1 行。


SQL> commit;


提交完成。


SQL> --当前时间
SQL>  select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,
  2          timestamp_to_scn(systimestamp) SCN
  3   from dual;


时间                                 SCN                                        
----------------------------- ----------                                        
2012-10-25 10:36:22*046000       3784220                                        


SQL> select * from flashback_table;


       FID FNAME                                                                
---------- --------------------                                                 
         1 Tom                                                                  
         2 Mary                                                                 
         3 Mike                                                                 


SQL> --删除mary
SQL> delete from  flashback_table where fid =2;


已删除 1 行。


SQL> commit;


提交完成。


SQL> select * from flashback_table;


       FID FNAME                                                                
---------- --------------------                                                 
         1 Tom                                                                  
         3 Mike                                                                 


SQL> --执行闪回表
SQL> flashback table  flashback_table to scn 3784220;
flashback table  flashback_table to scn 3784220
                 *
第 1 行出现错误: 
ORA-08189: 因为未启用行移动功能, 不能闪回表 




SQL> --开启表的行移动
SQL> alter table flashback_table enable row movement;


表已更改。


SQL> flashback table  flashback_table to scn 3784220;


闪回完成。


SQL> select * from flashback_table;


       FID FNAME                                                                
---------- --------------------                                                 
         1 Tom                                                                  
         2 Mary                                                                 
         3 Mike                                                                 


SQL> --问题:如何获取最近的一个时间?
SQL> host cls


SQL> --闪回删除
SQL> select * from tab;


TNAME                          TABTYPE  CLUSTERID                               
------------------------------ ------- ----------                               
DEPT                           TABLE                                            
EMP                            TABLE                                            
BONUS                          TABLE                                            
SALGRADE                       TABLE                                            
EMP20                          TABLE                                            
TESTSAVEPOINT                  TABLE                                            
TEST2                          TABLE                                            
MYPERSON                       TABLE                                            
EMP10                          TABLE                                            
EMPINCOME                      TABLE                                            
VIEW1                          VIEW                                             


TNAME                          TABTYPE  CLUSTERID                               
------------------------------ ------- ----------                               
VIEW2                          VIEW                                             
TESTSEQ                        TABLE                                            
HREMP                          SYNONYM                                          
MSG1                           TABLE                                            
TEST1                          TABLE                                            
PM_CI                          TABLE                                            
PM_STU                         TABLE                                            
FLASHBACK_TABLE                TABLE                                            
SYS_TEMP_FBT                   TABLE                                            


已选择20行。


SQL> drop table test1;


表已删除。


SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME          
---------------- ------------------------------ ------------ -------------------
TEST1            BIN$Rn2qG7V+SO2k+aNrG/oYww==$0 TABLE        2012-10-25:10:45:11
SQL> purge recyclebin;


回收站已清空。


SQL> --管理员没有回收站
SQL> select * from TESTSEQ;


       TID TNAME                                                                
---------- --------------------                                                 
         3 aaa                                                                  
         4 aaa                                                                  
         5 aaa                                                                  
         8 aaa                                                                  


SQL> drop table TESTSEQ;


表已删除。


SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME          
---------------- ------------------------------ ------------ -------------------
TESTSEQ          BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE        2012-10-25:10:47:38
SQL> select * from TESTSEQ;
select * from TESTSEQ
              *
第 1 行出现错误: 
ORA-00942: 表或视图不存在 




SQL> select * from tab;


TNAME                          TABTYPE  CLUSTERID                               
------------------------------ ------- ----------                               
DEPT                           TABLE                                            
EMP                            TABLE                                            
BONUS                          TABLE                                            
SALGRADE                       TABLE                                            
EMP20                          TABLE                                            
TESTSAVEPOINT                  TABLE                                            
TEST2                          TABLE                                            
MYPERSON                       TABLE                                            
EMP10                          TABLE                                            
EMPINCOME                      TABLE                                            
VIEW1                          VIEW                                             


TNAME                          TABTYPE  CLUSTERID                               
------------------------------ ------- ----------                               
VIEW2                          VIEW                                             
HREMP                          SYNONYM                                          
MSG1                           TABLE                                            
BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE                                            
PM_CI                          TABLE                                            
PM_STU                         TABLE                                            
FLASHBACK_TABLE                TABLE                                            
SYS_TEMP_FBT                   TABLE                                            


已选择19行。


SQL> select * from BIN$UhseqyX1Reyl5iurpupyEg==$0;
select * from BIN$UhseqyX1Reyl5iurpupyEg==$0
                                        *
第 1 行出现错误: 
ORA-00933: SQL 命令未正确结束 




SQL> select * from "BIN$UhseqyX1Reyl5iurpupyEg==$0";


       TID TNAME                                                                
---------- --------------------                                                 
         3 aaa                                                                  
         4 aaa                                                                  
         5 aaa                                                                  
         8 aaa                                                                  


SQL> host cls


SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME          
---------------- ------------------------------ ------------ -------------------
TESTSEQ          BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE        2012-10-25:10:47:38
SQL> --执行闪回删除
SQL> flashback table testseq to before drop;


闪回完成。


SQL> show recyclebin
SQL> select * from testseq;


       TID TNAME                                                                
---------- --------------------                                                 
         3 aaa                                                                  
         4 aaa                                                                  
         5 aaa                                                                  
         8 aaa                                                                  


SQL> host cls


SQL> drop  table testseq;


表已删除。


SQL> create table testseq(tid number);


表已创建。


SQL> drop  table testseq;


表已删除。


SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME          
---------------- ------------------------------ ------------ -------------------
TESTSEQ          BIN$ZsXHtmHLTLu40DAC6jiKqg==$0 TABLE        2012-10-25:10:51:22
TESTSEQ          BIN$hBllsvl5Tum9hHaSvtQhag==$0 TABLE        2012-10-25:10:51:01
SQL> flashback table testseq to before drop;


闪回完成。


SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME          
---------------- ------------------------------ ------------ -------------------
TESTSEQ          BIN$hBllsvl5Tum9hHaSvtQhag==$0 TABLE        2012-10-25:10:51:01
SQL> select * from testseq;


未选定行


SQL> flashback table testseq to before drop;
flashback table testseq to before drop
*
第 1 行出现错误: 
ORA-38312: 原始名称已被现有对象使用 




SQL> --闪回重名的表
SQL> flashback table testseq to before drop rename to testseq_old;


闪回完成。


SQL> select * from testseq_old;


       TID TNAME                                                                
---------- --------------------                                                 
         3 aaa                                                                  
         4 aaa                                                                  
         5 aaa                                                                  
         8 aaa                                                                  


SQL> host cls


SQL> /*
SQL> 小结:
SQL> 基本概念: 1. SCN   2. 900秒  3. 权限 flashback any tables
SQL> 闪回表:将表回退到过去的一个时间
SQL>          1. 行移动
SQL>          2. 执行闪回表
SQL>         注意: 系统表不能闪回;不能跨越DDL
SQL>         问题: 如何得到离该操作最近的一个时间??
SQL> 闪回删除: Oracle的回收站
SQL>         1. 执行闪回删除
SQL>         2. 通过回收站中的名字闪回(双引号)
SQL>         3. 重名的表
SQL>         4. 触发器(disable)
SQL> */
SQL> host cls


SQL> --闪回版本查询
SQL> create table versions_table
  2  (tid number,tname varchar2(20));


表已创建。


SQL> insert into versions_table values(1.'Tom');
insert into versions_table values(1.'Tom')
                                    *
第 1 行出现错误: 
ORA-00917: 缺失逗号 




SQL> insert into versions_table values(1,'Tom');


已创建 1 行。


SQL> commit;


提交完成。


SQL> insert into versions_table values(2,'Mary');


已创建 1 行。


SQL> commit;


提交完成。


SQL> insert into versions_table values(3,'Mike');


已创建 1 行。


SQL> commit;


提交完成。


SQL> update versions_table set tname='MaryNew' where tid=2;


已更新 1 行。


SQL> commit;


提交完成。


SQL> select * from  versions_table;


       TID TNAME                                                                
---------- --------------------                                                 
         1 Tom                                                                  
         2 MaryNew                                                              
         3 Mike                                                                 


SQL> --如何查询Mary?
SQL> --执行闪回版本查询
SQL> select tid,tname
  2  from versions_table
  3  versions between TIMESTAMP MINVALUE and MAXVALUE
  4  order by 1;


       TID TNAME                                                                
---------- --------------------                                                 
         1 Tom                                                                  
         2 MaryNew                                                              
         2 Mary                                                                 
         3 Mike                                                                 


SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
  2             versions_endtime 结束时间,versions_xid 事务号
  3  from versions_table
  4  versions between TIMESTAMP MINVALUE and MAXVALUE
  5  order by 1,4;


       TID TNAME                                                                
---------- -------------------- -                                               
起始时间                                                                        
---------------------------------------------------------------------------     
结束时间                                                                        
---------------------------------------------------------------------------     
事务号                                                                          
----------------                                                                
         1 Tom                  I                                               
25-10月-12 11.17.28 上午                                                        
                                                                                
03002E005A050000                                                                
                                                                                


       TID TNAME                                                                
---------- -------------------- -                                               
起始时间                                                                        
---------------------------------------------------------------------------     
结束时间                                                                        
---------------------------------------------------------------------------     
事务号                                                                          
----------------                                                                
         2 Mary                 I                                               
25-10月-12 11.17.37 上午                                                        
25-10月-12 11.18.16 上午                                                        
02000D0064050000                                                                
                                                                                


       TID TNAME                                                                
---------- -------------------- -                                               
起始时间                                                                        
---------------------------------------------------------------------------     
结束时间                                                                        
---------------------------------------------------------------------------     
事务号                                                                          
----------------                                                                
         2 MaryNew              U                                               
25-10月-12 11.18.16 上午                                                        
                                                                                
0600030065050000                                                                
                                                                                


       TID TNAME                                                                
---------- -------------------- -                                               
起始时间                                                                        
---------------------------------------------------------------------------     
结束时间                                                                        
---------------------------------------------------------------------------     
事务号                                                                          
----------------                                                                
         3 Mike                 I                                               
25-10月-12 11.17.46 上午                                                        
                                                                                
0400130061050000                                                                
                                                                                


SQL> set linesize 150
SQL> col tid for 99
SQL> col tname for a10
SQL> col 操作 for a8
SQL> col 起始时间 for a40
SQL> col 结束时间 for a40
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
  2             versions_endtime 结束时间,versions_xid 事务号
  3  from versions_table
  4  versions between TIMESTAMP MINVALUE and MAXVALUE
  5  order by 1,4;


TID TNAME      操作     起始时间                                 结束时间                                 事务号                                      
--- ---------- -------- ---------------------------------------- ---------------------------------------- ----------------                            
  1 Tom        I        25-10月-12 11.17.28 上午                                                          03002E005A050000                            
  2 Mary       I        25-10月-12 11.17.37 上午                 25-10月-12 11.18.16 上午                 02000D0064050000                            
  2 MaryNew    U        25-10月-12 11.18.16 上午                                                          0600030065050000                            
  3 Mike       I        25-10月-12 11.17.46 上午                                                          0400130061050000                            


SQL> col 起始时间 for a30
SQL> col 结束时间 for a30
SQL> col 操作 for a4
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
  2             versions_endtime 结束时间,versions_xid 事务号
  3  from versions_table
  4  versions between TIMESTAMP MINVALUE and MAXVALUE
  5  order by 1,4;


TID TNAME      操作 起始时间                       结束时间                       事务号                                                              
--- ---------- ---- ------------------------------ ------------------------------ ----------------                                                    
  1 Tom        I    25-10月-12 11.17.28 上午                                      03002E005A050000                                                    
  2 Mary       I    25-10月-12 11.17.37 上午       25-10月-12 11.18.16 上午       02000D0064050000                                                    
  2 MaryNew    U    25-10月-12 11.18.16 上午                                      0600030065050000                                                    
  3 Mike       I    25-10月-12 11.17.46 上午                                      0400130061050000                                                    


SQL> host cls


SQL> --闪回事务查询
SQL> create table transaction_table
  2  (tid number,tname varchar2(20));


表已创建。


SQL> --第一个事务
SQL> insert into transaction_table values(1,'Tom');


已创建 1 行。


SQL> insert into transaction_table values(2,'Mary');


已创建 1 行。


SQL> insert into transaction_table values(3,'Mike');


已创建 1 行。


SQL> commit;


提交完成。


SQL>  --第二个事务
SQL> update transaction_table set tname='MaryNew' where tid=2;


已更新 1 行。


SQL> delete from transaction_table where tid =3;


已删除 1 行。


SQL> commit;


提交完成。


SQL> --如何撤销第二个事务??
SQL> --视图flashback_transaction_query
SQL> desc flashback_transaction_query
 名称                                                                                是否为空? 类型
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 XID                                                                                          RAW(8)
 START_SCN                                                                                    NUMBER
 START_TIMESTAMP                                                                              DATE
 COMMIT_SCN                                                                                   NUMBER
 COMMIT_TIMESTAMP                                                                             DATE
 LOGON_USER                                                                                   VARCHAR2(30)
 UNDO_CHANGE#                                                                                 NUMBER
 OPERATION                                                                                    VARCHAR2(32)
 TABLE_NAME                                                                                   VARCHAR2(256)
 TABLE_OWNER                                                                                  VARCHAR2(32)
 ROW_ID                                                                                       VARCHAR2(19)
 UNDO_SQL                                                                                     VARCHAR2(4000)


SQL> --得到XID
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
  2             versions_endtime 结束时间,versions_xid 事务号
  3  from transaction_table
  4  versions between TIMESTAMP MINVALUE and MAXVALUE
  5  order by 事务号;


TID TNAME      操作 起始时间                       结束时间                       事务号                                                              
--- ---------- ---- ------------------------------ ------------------------------ ----------------                                                    
  3 Mike       I    25-10月-12 11.29.38 上午       25-10月-12 11.30.23 上午       0100100060050000                                                    
  2 Mary       I    25-10月-12 11.29.38 上午       25-10月-12 11.30.23 上午       0100100060050000                                                    
  1 Tom        I    25-10月-12 11.29.38 上午                                      0100100060050000                                                    
  2 MaryNew    U    25-10月-12 11.30.23 上午                                      080029005C050000                                                    
  3 Mike       D    25-10月-12 11.30.23 上午                                      080029005C050000                                                    


SQL> select operation,undo_sql
  2  from flashback_transaction_query
  3  where xid='080029005C050000';


OPERATION                                                                                                                                             
--------------------------------                                                                                                                      
UNDO_SQL                                                                                                                                              
------------------------------------------------------------------------------------------------------------------------------------------------------
DELETE                                                                                                                                                
insert into "SCOTT"."TRANSACTION_TABLE"("TID","TNAME") values ('3','Mike');                                                                           
                                                                                                                                                      
UPDATE                                                                                                                                                
update "SCOTT"."TRANSACTION_TABLE" set "TNAME" = 'Mary' where ROWID = 'AAANpoAAEAAAAJvAAB';                                                           
                                                                                                                                                      
BEGIN                                                                                                                                                 
                                                                                                                                                      
                                                                                                                                                      


SQL> insert into "SCOTT"."TRANSACTION_TABLE"("TID","TNAME") values ('3','Mike')
  2  ;


已创建 1 行。


SQL> update "SCOTT"."TRANSACTION_TABLE" set "TNAME" = 'Mary' where ROWID = 'AAANpoAAEAAAAJvAAB';


已更新 1 行。


SQL> commit;


提交完成。


SQL> select * from transaction_table;


TID TNAME                                                                                                                                             
--- ----------                                                                                                                                        
  1 Tom                                                                                                                                               
  2 Mary                                                                                                                                              
  3 Mike                                                                                                                                              


SQL> spool off


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值