Oracle 10g的新特性flashback

  1、flashback drop

    目前,Oracle10g为了加快用户错误操作的恢复,提供了flashback drop新特性。

    flashback drop功能可以允许你从当前数据库中恢复一个被drop了的对象,在执行drop操作时,现在Oracle不是真正删除它,而是将该对象自动将放入回收站。“回收站”我们可以理解为一个虚拟的容器,它用来存放所有被删除的对象。在回收站中,被删除的对象将占用创建时的同样的空间,你甚至还可以对已经删除的表查询,也可以利用flashback功能来恢复它,这个就是flashback drop功能。

    回收站内的相关信息我们可以从recyclebin /user_recyclebin/dba_recyclebin等视图中获取,或者通过SQL*Plus的show recyclebin 命令查看。

例:

SQL> create table myemp as select * from emp

表创建.

 

SQL>  drop table myemp

表删除.

 

SQL> show recyclebin

ORIGINAL NAME       RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

---------------- ------------------------------ ------------ -------------------

MYEMP            BIN$3oMpfWHfR6q1ccyEgXwBvg==$0 TABLE        2008-05-17:09:42:54

 

-----------------------闪回还原

SQL> flashback table myemp to before drop

  /

 

闪回完成。

 

SQL> select empno ,ename ,job,sal deptno from myemp where deptno=20

      /

       

           EMPNO ENAME      JOB           DEPTNO

      ---------- ---------- --------- ----------

            7369 SMITH      CLERK            800

            7566 JONES      MANAGER         2975

            7788 SCOTT      ANALYST         3000

            7876 ADAMS      CLERK           1100

10            7902 FORD       ANALYST         3000

 

    注意:使用"purge recyclebin"可以清除回收站中的所有对象。

    同时,您也可以通过purge user_recyclebin或purge dba_recyclebin来清除不同的回收站对象。通过PURGE TABLESPACE TSNAME,PURGE TABLESPACE TSNAME USER USERNAME命令来选择清除回收站。

    假如需要彻底删除一个表,不想放到回收站中,可以在drop语句中增加purge选项,例如:drop table tablename purge

    注释:您需要注意的是sysdba的Drop操作不会被记录,Oracle从不推荐用户用sysdba身份来创建用户对象。

 

   2、flashback database

    如果想启动FLASHBACK DATABASE的功能,您必须在MOUNT模式下,执行alter database  flashback on命令。或者是alter tablespace tsname flashback on,数据库将采集falshback log,如果需要关闭该功能,则修改On为OFF。
    如果想执行flashback database命令,你可以在两种方式下执行:RMAN与SQLPLUS。

SQL >flashback database to time to_date(xxx);
SQL >flashback database to time TO_TIMESTAMP (xxx);
SQL >flashback database to scn xxx
SQL >flashback database to sequence xxx thread 1
SQL>flashback database to timestamp(sysdate-1/24)

    我们下面看看具体的例子说明

SQL>shutdown immediate;--立即关闭数据库和实例

Database closed.
Database dismounted.
ORACLE instance shut down.


SQL> startup mount; --启动实例并加载数据库
ORACLE instance started.
Total System Global Area  113246208 bytes
Fixed Size                   787708 bytes
Variable Size              87030532 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
Database mounted.


SQL> alter database flashback on;--打开闪回功能
alter database flashback on
*
ERROR at line 1:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38707: Media recovery is not enabled.
可以看到,flashback还必须要归档的保证


SQL> alter database archivelog;--设为归档模式
Database altered.


SQL> alter database flashback on;
Database altered.


SQL> alter database open;--打开数据库
Database altered.


SQL> archive log list; --查看当前模式
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     13
Next log sequence to archive   15
Current log sequence           15
    经过以上步骤,我们确保了flashback database的功能,我们还可以发现,10g的自动归档是不需要手工干预的,只要开启了归档,就是自动归档了,归档区也在DB_RECOVERY_FILE_DEST参数指定的地点。

通过如下的查询
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
    Session altered.
SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM V$FLASHBACK_DATABASE_LOG;


OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
             1135440 2008-05-17 15:20:54

    我们可以知道,可以前滚恢复到的最早的SCN与时间点是多少,如果没有确保flashback database,该视图将没有查询结果。

    我们创建三个一样的表
SQL> create table t1 as select * from dba_objects;
Table created.
SQL> create table t2 as select * from t1;
Table created.
SQL> create table t3 as select * from t1;
Table created.
SQL> set time on;
SQL> select sysdate from dual;
SYSDATE
-------------------
2008-05-17 15:29:33

    我们确定了一个时间点
    现在,我们分别truncate一个表与drop一个表,模拟误操作。

SQL> set time on;
15:30:10 SQL> truncate table t2;
Table truncated.
15:30:43 SQL> drop table t3;
Table dropped.
    没有备份,我们利用flashback来恢复数据库到2008-05-17 15:29:33时间点。


15:39:02 SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


15:39:31 SQL> startup mount exclusive
ORACLE instance started.


15:41:19 SQL> FLASHBACK DATABASE TO timestamp(to_date(2008-05-17 15:29:33','yyyy-mm-dd hh24:mi:ss'));
Flashback complete.


    之后,我们可以用 ALTER DATABASE OPEN READ ONLY 来检查结果是否正确,如果满足结果,则可以用resetlog来正式启动数据库,注意,一旦resetlogs之后,将不能再flashback的resetlogs之前的时间点。


15:41:32 SQL> alter database open resetlogs;
Database altered.
我们现在查询那三个表
15:42:10 SQL> select count(*) from t1;
  COUNT(*)
----------
     47708
15:42:47 SQL> select count(*) from t2;
  COUNT(*)
----------
     47708
15:42:50 SQL> select count(*) from t3;
  COUNT(*)
----------
     47708


    发现truncate的记录或者是drop的表都存在,现在数据库已经前滚到前一个时间点了。


15:44:56 SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM $FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
             1136169 2008-05-17 15:41:50
    同时发现数据库的最早的flashback的时间与scn都回到resetlog的时间点了。

posted on 2009-07-14 16:25  .net学习交流  阅读(407)  评论(0编辑  收藏  举报

导航