Oralce 为归档模式,在非自动归档状态下运行,现在删除了一个表,请问是否可以恢复?恢复的方法是什么

解决方案 »

  1.   

    利用flashback还原数据库和表
    flashback 是oracle 10G给我们提供的最有价值的工具之一。利用他结合TSPITR可以大大节省DBA的工作量。
    flashback 一张表的方法:
    1、首先确认用户有flashback any table 的权限,或者 grant flashback any table to user;
    2、向一张表中插入数据:
    INSERT INTO employee
    SELECT * FROM employee AS OF TIMESTAMP
    TO_TIMESTAMP('2003-04-04 14:00:00', 'YYYY-MM-DD HH:MI:SS')
    WHERE name = 'JOHN';
    3、如果确认数据插入错误:在FLASH_TRANSACTION_QUERY表中查询插入信息:
    SELECT commit_timestamp , logon_user FROM FLASHBACK_TRANSACTION_QUERY
    WHERE xid IN
    (SELECT versions_xid FROM employee VERSIONS BETWEEN
    TIMESTAMP TO_TIMESTAMP('2003-04-04 14:00:00', 'YYYY-MM-DD HH:MI:SS')
    and TO_TIMESTAMP('2003-04-04 17:00:00', 'YYYY-MM-DD HH:MI:SS')
    WHERE name = 'JOHN');
    4、根据表中显示的信息,可以用时间或SCN号进行还原:FLASHBACK TABLE employee TO TIMESTAMP TO_TIMESTAMP('2003-04-04 14:00:00','YYYY-MM-DD HH:MI:SS');如果表中含有与其它表的约束条件,而造成其它表的数据错误,则建议用以下方式:
    1、FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2003-04-04 14:00:00','YYYY-MM-DD HH:MI:SS');
    2、EXP 相应的数据;
    3、recover database until ...到当前状态
    4、IMP相应数据。错误删除一张表的恢复方法:
    1、drop table employee;
    2、被drop掉的表会保存在recyclebin中,并且不会自动删除,除非使用purge命令可以完全删除。
    3、查询recyclebin中保存的数据:
    SQL> SELECT object_name as recycle_name, original_name, object_type
    FROM recyclebin;
    RECYCLE_NAME ORIGINAL_NAME OBJECT_TYPE
    -------------------------------- --------------------- -------------
    BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0 EMPLOYEE_DEMO TABLE
    BIN$JKS983293M1dsab4gsz/I249==$0 I_EMP_DEMO INDEX
    BIN$NR72JJN38KM1dsaM4gI348as==$0 LOB_EMP_DEMO LOB
    BIN$JKJ399SLKnaslkJSLK330SIK==$0 LOB_I_EMP_DEMO LOB INDEX找到保存的表名,注意此时的表名是以ID形式存在,可以对照别名找到你删除的表。如果不使用ID名还原,可能会导致其它重名,或已经删除的同名表一起被还原。
    4、执行恢复:
    FLASHBACK TABLE "BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0" TO BEFORE DROP;虽然flashback为我们提供了数据库和表级的还原,但是也会有很多限制,比如如果在SQLPLUS下运行只能在本地。远程只能用RMAN;同时不能对表空间和数据文件进行flashback ,当然这里有保持数据一致性的要求。如果涉及表空间的数据恢复,仍然要使用传统方式,对多个数据文件错误或者表的数据错误,个人建议仍然使用TSPITR,会对数据库影响小些,使用flashback database + exp+recover database+imp方式,对全库影响太大,在生产环境中不太可行,同时如果表中部署有triger ,flashback是不支持的,当然也有解决方法,但考虑到恢复中的复杂性,建议大家还是保守些好。另外flashback 对系统资源占有很大,alter database flashback on 后后,会发现flash_recovery_area默认就达到2G。如果设置周期较长(默认是1天),会更大,会同时记录两份日志。
    这里有两张表很重要,要经常查到的V$FLASHBACK_DATABASE_LOG;V$FLASHBACK_DATABASE_STAT,可以查到状态和恢复信息。
      

  2.   

    不完恢复rman run{
      set until time ....;
      restore database;
      recover database;
    }