闪回
闪回是10g的一个新特性 ,开启闪回数据库必须处于mount状态并且还要开启归档。
Databasemounted.
sys@OCP>alter database flashback on;
alterdatabase flashback on
*
ERROR atline 1:
ORA-38706:Cannot turn on FLASHBACK DATABASE logging.
ORA-38707:Media recovery is not enabled. --- 必须开启闪回
sys@OCP>alter database archivelog;
Databasealtered.
sys@OCP>alter database flashback on;
Databasealtered.
第01章 闪回查询(查过去某时间点,基于undo)
Oracle10g对于闪回查询进行了增强,支持更简单的 SQL 操作,允许对误删
误更新等 DML操作进行闪回。Flashback Query 仅仅是查询以前的一个快照
而已,并不改变当前表的状态,
1. 原表记录
hr@OCP> select count(*) from t1;
COUNT(*)
----------
3
2. 删除记录并提交更改
hr@OCP>delete from t1;
3 rowsdeleted.
hr@OCP>commit;
Commit complete.
3. 获取当前的scn号
[oracle@station10 ~]$ date
Fri Aug 2 16:12:55 CST 2013
sys@OCP> selectdbms_flashback.get_system_change_number scn from dual;
SCN
----------
641612
hr@OCP>select count(*) from t1 as of scn 641400;
selectcount(*) from t1 as of scn 64100
*
ERROR atline 1:
ORA-01466: unable to read data - table definition haschanged ---不能查询在表定义之前
hr@OCP>select count(*) from t1 as of scn 641450;
COUNT(*)
----------
3
或者利用timestamp
hr@OCP>select * from t1 as of timestamp sysdate-13/1440;
A
----------
1
2
3
最后不要忘了提交
4. 利用闪回查询恢复表
通过增加as of timestamp的语法,就可以到undo表空间中查找到5分钟之前的记录前镜像,使用它我们就可以很轻易的并且迅速的将记录恢复:
hr@OCP>insert into t1 select * from t1 as of timestamp sysdate-15/1440; ----做笔记时 时间有过了
3 rows created.
第02 章 闪回表( 恢复表及附属对象到某时,row movement,基于undo)
OracleFlashback Table特性允许利用Flashback Table 语句,确保闪回到表
一个时间点。利用回滚段信息来恢复一个或一些表到以前的一个时间点( 一
照) 。FlashbackTable 将改变当前表及附属对象一起回到以前的时间点。
注意:如果需要闪回一个表,需要以下条件:
1. 需要有flashback anytable 的系统权限或者是该表的 flashback 对象权限;
2. 需要有该表的select,insert,delete,alter 权限;
3. 必须保证该表row movement。
hr@OCP>select * from t1 ;
A
----------
1
2
3
删除一行
hr@OCP>delete from t1 where a=2;
1 rowdeleted.
hr@OCP>commit;
查询时间
hr@OCP>select to_timestamp(sysdate,'yyyy-mm-dd:hh24:mi:ss' ) from dual;
TO_TIMESTAMP(SYSDATE,'YYYY-MM-DD:HH24:MI:SS')
---------------------------------------------------------------------------
02-AUG-1304.32.05 PM
设定test使能行移动
hr@OCP>alter table t1 enable row movement;
Tablealtered.
hr@OCP>flashback table t1 to timestamp sysdate-6/1440;
Flashbackcomplete.
hr@OCP>select * from t1;
A
----------
1
2
3
第03章 闪回删除(基于recyclebin)
Oracle Flashback Drop特性提供一个类似回收站的功能,用来恢复不小心被
删除的表。当删除表时,Oracle10g并不立刻释放被删除的表所占用的空间,而
是将这个被删除的表进行自动重命名( 为了避免同类对象名称的重复) 并放进回
收站中。所谓的回收站类似于Windows系统中的回收站,是一个虚拟的容器,
用于存放所有被删除的对象,在回收站中被删除的对象将占用创建时的同样的空
间。如果这个被删除的表需要进行恢复,就可利用Flashback Drop 功能。
不能被闪回的表包括:
1 system 表空间
2 virtual private database
3 表空间被数据字典管理
4 purged 删除
5 基于空间压力被覆盖
6 表上存在策略
hr@OCP> show recyclebin ---回收站为空表示没有任何表在回收站中
hr@OCP> drop table t1;
Table dropped.
hr@OCP> show recyclebin
ORIGINAL NAME RECYCLEBINNAME OBJECT TYPE DROP TIME
---------------- ------------------------------ -------------------------------
T1 BIN$4vPpoiKMafbgQKjACjgTvA==$0 TABLE 2013-08-02:16:40:36
hr@OCP> select * from "BIN$4vPpoiKMafbgQKjACjgTvA==$0";
A
----------
1
2
3
hr@OCP> flashback table"BIN$4vPpoiKMafbgQKjACjgTvA==$0" to before drop;
或者
hr@OCP> flashback table t1 tobefore drop
Flashback complete.
hr@OCP> select * from t1;
A
----------
1
2
3
现在我们再删除t1表,然后再建一张相同名字的表t1
hr@OCP> drop table t1;
hr@OCP> create table t1(a varchar2(1));
hr@OCP> insert into t1 values('a');
hr@OCP> commit;
hr@OCP> flashback table t1 to before drop;
flashback table t1 to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object---因为已经存在一个对象了,我们可以对闪回删除表重命名解决这个问题。
hr@OCP> flashback table t1 to before drop rename to t2;
Flashback complete.
hr@OCP> select * from t2;
A
----------
1
2
3
现在我们再来看看回收站(recyclebin)的管理机制,我们先把t1表删除,然后把t2改为t1再删除
hr@OCP> drop table t1;
Table dropped.
hr@OCP> alter table t2 rename to t1;
Table altered.
hr@OCP> drop table t1;
Table dropped.
hr@OCP> show recyclebin ---现在回收站里有两条记录,并且recyclebin的名字都一样
ORIGINAL NAME RECYCLEBINNAME OBJECT TYPE DROP TIME
---------------- ------------------------------ -------------------------------
T1 BIN$4vPpoiKPafbgQKjACjgTvA==$0 TABLE 2013-08-02:16:49:06
T1 BIN$4vPpoiKOafbgQKjACjgTvA==$0 TABLE 2013-08-02:16:48:49
现在我们执行闪回删除表
hr@OCP> flashback table t1 to before drop;
Flashback complete.
hr@OCP> select * from t1;---可以看出recyclebin 的管理机制是栈类型的(后进先出)
A
----------
1
2
3
hr@OCP> flashback table t1 to before drop;
flashback table t1 tobefore drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
hr@OCP> flashback table t1 to before drop rename to t2;
Flashback complete.
hr@OCP> select * from t2;
A
-
a
注意:需要注意的是sysdba的drop 操作不会被记录,Oracle 也从不推荐用
户使用sysdba 身份创建用户对象。
sys@OCP> create table test1(a number);
Table created.
sys@OCP> insert into test1 values(1);
1 row created.
sys@OCP> commit;
Commit complete.
sys@OCP> drop table test1;
Table dropped.
sys@OCP> show recyclebin ---没有数据
sys@OCP>
如果向删除一个表且不放回收站中不能进行恢复,在drop语句中可以添加purge选项
hr@OCP> drop table t2 purge;
Table dropped.
hr@OCP> show recyclebin
hr@OCP>
在Oracle 10gR2中,recyclebin 变成了一个常规参数,可以在session/system
级动态修改:
sys@OCP> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ -----------------------------------------
recyclebin string on --默认打开
回收站的管理:只要回收站使用的空间没有被回收,就可以使用闪回删除功能。
当发生以下情况是回收站的空间就会被回收
Flashback Drop 需要注意的地方:
1). 只能用于非系统表空间和本地管理的表空间
2). 对象的参考约束不会被恢复,指向该对象的外键约束需要重建。
3). 对象能否恢复成功,取决与对象空间是否被覆盖重用。
4). 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba手工介入重新创建。
5). 对于Recycle Bin中的对象,只支持查询.
1、手工purege回收站(purge recyclebin)
2、当有空间压力时自动清空回收站,空闲空间可以查看dba_free_space 视图