oracle 闪回

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、付费专栏及课程。

余额充值