flashback的用法

来源:互联网 发布:头发定型喷雾推荐知乎 编辑:程序博客网 时间:2024/05/17 23:18

<span style="font-size:18px;">   oracle 自9i之后增加了flashback特性,本来想自己总结下关于这个知识点,但是看到<a target=_blank target="_blank" href="http://blog.chinaunix.net/uid-74941-id-3180228.html">http://blog.chinaunix.net/uid-74941-id-3180228.html</a>,<a target=_blank target="_blank" href="http://blog.csdn.net/chenweitang123/article/details/6163455">http://blog.csdn.net/chenweitang123/article/details/6163455</a>这两位兄台的总结,感觉比自己总结的好很多。所以就学习这两位仁兄的吧。</span>

    在使用这个特性的时候要谨记,使用回闪是到万不得已的时候才采取的,平时对数据的操作依旧要小心谨慎。因为回闪和很多参数有关。如果参数设置不正确可能就达不到你想要的效果。比如undo段如果设置的小,而且数据已经commit很长时间,就会遇到ORA-01555:snapshot too old错误。该错误的原因是:你查询之前某个时间段的undo段,但是现在由于某种原因,该undo段信息已经不存在或者被更改了。也就无法完成你想做的回闪。

 

/*

11g的flashbackup 分好几种,分别用途不一样。

A.flashback database 闪回数据库,简单理解就是把数据库闪回到某个以前的时间点,

能恢复到的最早的SCN, 取决与Flashback Log中记录的最早SCN

B.flashback drop 回收数据库表,用于表误drop后恢复。类似Windows的回收站。

C.flashback query 闪回表记录,用于数据表记录的恢复

D.falshabck Table 闪回数据库表,

后两个是重点,下面说明。

*/

– A.flashback database相关

/*

1.默认情况数据库的flashback database是关闭,可以在mount exclusive状态下打开。

在设置了闪回恢复区后,可以启动闪回数据库功能。

*/

–1.检查是否启动了flash recovery area

show parameter db_recovery_file

–2.检查是否启用了归档

archive log list;

–3.flashback database 默认是关闭的,查看方法

select flashback_on from v$database;

–4.查询当前的scn

SELECT CURRENT_SCN FROM V$DATABASE;

–5.查询当前的时间

select to_char(sysdate,’yy-mm-dd hh24:mi:ss’) time from dual;

–6.查看SCN 和 timestamp 之间的对应关系:

select scn,to_char(time_dp,’yyyy-mm-dd hh24:mi:ss’)from sys.smon_scn_time;

–7.恢复到时间点,或者恢复到SCN

flashback database to timestamp to_timestamp(’09-10-14 14:37:05′,’yy-mm-dd hh24:mi:ss’);

flashback database to scn 947921;

– B. flashback table 恢复误drop表

drop table sphsy.login_table;

select * from flash_table;

–purge table sphsy.login_table;清空回收站

flashback table sphsy.login_table to before drop;

select * from sphsy.login_table;

– C. flashback query 实现行级恢复

/*

flashback查询用于获取先前时间点的表行级数据。当使用flashback查询时,

需要在表名后指定as of timestamp子句或as of SCN子句,其中as of timestamp用于指定早期时间点,

而as of SCN用于指定早期的SCN值,示例如下:

*/

– 1.查原始记录 ,区间内有62 行

select *

from sphsy.login_table a

where a.id > 201204171078

and a.id < 201204171141

order by a.id ;

– 2.晚于区间的有 3016

select program,count(*)

from sphsy.login_table a

where a.id >= 201204171141

group by program ;

–3. 删除

delete from sphsy.login_table a

where a.id > 201204171078

and a.id < 201204171141

–4.利用闪回特性查到区间内,有62行

select * from sphsy.login_table

as of timestamp to_timestamp(’2012-04-17 17:20:30′,’YYYY-MM-DD HH24:MI:SS’)

where id > 201204171078

and id < 201204171141

– 5.不利用闪回特性,直接查询发现没有

select * from sphsy.login_table

where id > 201204171078

and id < 201204171141

– 6.进行数据恢复

– 禁止表上的触发器

alter trigger sphsy.T_INS_LOGIN_TABLE disable ;

– 恢复数据

insert into sphsy.login_table

select * from sphsy.login_table

as of timestamp to_timestamp(’2012-04-17 17:20:30′,’YYYY-MM-DD HH24:MI:SS’)

where id > 201204171078

and id < 201204171141

– 恢复触发器

alter trigger sphsy.T_INS_LOGIN_TABLE enable ;

– 7.晚于区间的数据回来了3130 = 3016 +62 + 后来的数据。实现了区间恢复误删除。

select program,count(*)

from sphsy.login_table a

where a.id >= 201204171078

group by program ;

– D. flashback table 恢复表到先前状态

/*

flashback查询可以用于恢复被误删除的表行数据,但是用户在表上执行了其他的DML语句误操作(insert或update),则不能直接使用flashback查询将表数据恢复到先前时间点,从oracle10g开始,使用flashback table语句可以将表恢复到先前时间点,通过使用该特征,可以避免执行基于时间点的不完全恢复,注意如果要在某个表上使用flashback table特征,则要求必须具有以下条件:

a.用户必须具有flashback any table系统权限或flashback对象权限

b.用户必修在表上具有select insert delete和alter权限

c.必须合理设置初始化参数undo_retention,以确保UNDO信息保留足够时间

d.必须激活行移动特征:alter table table_name enable row movement;

*/

– 1.查原始记录 ,区间内有62 行

select *

from sphsy.login_table a

where a.id > 201204171078

and a.id < 201204171141

order by a.id ;

– 2.晚于区间的有 3074

select count(*)

from sphsy.login_table a

where a.id >= 201204171141;

–3. 删除 ,先记下时间点,2012-04-17 17:43:46

select to_char(sysdate,’YYYY-MM-DD HH24:MI:SS’) from dual ;

delete from sphsy.login_table a

where a.id > 201204171078

and a.id < 201204171141

– 4.删除之后表 sphysy.login_table继续有修改 ,行3082

select count(*)

from sphsy.login_table a

where a.id >= 201204171141;

–5.激活行移动特征

alter table sphsy.login_table enable row movement

–6.利用闪回特性,直接恢复到删除时间点前

flashback table sphsy.login_table to timestamp to_timestamp(’2012-04-17 17:43:46′,’YYYY-MM-DD HH24:MI:SS’);

– 7.晚于区间的数据 回到了3080 ,说明时间点之后的修改丢失。

select count(*)

from sphsy.login_table a

where a.id >= 201204171141

– 8.往前推1分,恢复到删除之前,删除的62条也回来了。

flashback table sphsy.login_table to timestamp to_timestamp(’2012-04-17 17:40:46′,’YYYY-MM-DD HH24:MI:SS’);

– 62 行

select count(*)

from sphsy.login_table a

where a.id > 201204171078

and a.id < 201204171141

– 删除之后的数据为3074,代表还有修改丢失。

select count(*)

from sphsy.login_table a

where a.id >= 201204171141

/*

总结:方法C,方法D均可以用数据恢复。

方法C安全,恢复麻烦。方法D简单,有可能数据丢失。

*/

 

补充一点小技巧:

select count(*) from t as of timestamp sysdate-1/24;查询一个小时前某个表t的数据
select  sysdate-1/24 from dual;  

 

2013-09-15补充

对flashback一直有几点不是很了解,今天又学习了一下,作为补充。

1.undo表空间与回收站recyclebin.

flashback 大致分为四个级别 

1. flashback数据库(将整个数据库恢复到某时点);

2.flashback drop恢复删除的table。

3.flashback  闪回查询 as of 恢复某个表中某些记录;

4.flashback  table。将这个table恢复到之前的某个时点。

这四个级别原理不是完全相同的:

1. flashback数据库(将整个数据库恢复到某时点),基于闪回日志。使用之前需要dba进行配置

–1.检查是否启动了flash recovery area

show parameter db_recovery_file

–2.检查是否启用了归档

archive log list;

–3.flashback database 默认是关闭的,查看方法

select flashback_on from v$database;

由于没有做这个测试,而且说一般恢复整个database 很少使用这个,因此只是简单介绍下。如有遗漏,具体还要再实际操作。
2.flashback drop   这个是恢复误删除的table。是从oracle的回收站中将数据恢复,不是从undo表空间。这也是我之前将二者混淆的地方。
回收站是将删除的表信息保存起来,而undo空间是为了将事务进行回滚,保存之前的数据状态。两者各有各的用处。
3.和4.都是为了恢复表记录或者表到之前的某个状态,因此使用的也是undo表空间。
由此,总结如下:
使用recyclebin回收站 :    flashback table to before drop
使用undo_tbs:       flashback table to timestamp ....
使用undo_tbs:       select text from dba_source as of timestamp...
使用flashback log: flashback database.....
2.关于undo_retention参数:
undo 有几个重要的参数,undo_management、undo_tablespace、undo_retention可以通过show parameter + 参数名进行查看。
        之前对undo_rentention不是很理解,后来才知道,这个参数的单位是秒,意思是在undo空间足够大的情况下,数据最少可以保留多久。所以数据在undo中保存的情况不只是由这个参数决定的。它只是一个参考。具体还要看undo空间。


SQL> SELECT * FROM DBA_RECYCLEBIN;
OWNER                          OBJECT_NAME                    ORIGINAL_NAME                    OPERATION TYPE                      TS_NAME                        CREATETIME          DROPTIME               DROPSCN PARTITION_NAME                   CAN_UNDROP CAN_PURGE    RELATED BASE_OBJECT PURGE_OBJECT      SPACE
------------------------------ ------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ----------
SCOTT                          BIN$cyTZoWfNSMmgZkOX78CakQ==$0 TEMP_EMP                         DROP      TABLE                     USERS                          2015-05-14:15:53:43 2015-05-14:15:56:32    2254049                                  YES        YES            75054       75054        75054          8
 
SQL> flashback table scott.TEMP_EMP before drop;
flashback table scott.TEMP_EMP before drop
ORA-00905: 缺失关键字
 
SQL> flashback table scott.TEMP_EMP to before drop;
Done

 

原创粉丝点击