oracle 闪回

来源:互联网 发布:郑玲玲的淘宝店叫什么 编辑:程序博客网 时间:2024/04/28 15:43

闪回

 

 闪回是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 视图

原创粉丝点击