ALLSTARS_ORACLE 发表于 2017-4-17 15:23:01

急救,Oracle 恢复drop删掉的表

本帖最后由 ALLSTARS_ORACLE 于 2017-5-3 16:57 编辑

昨晚,不小心删除了一个表,请问如何恢复,
我的环境:
HP-UNIX,ORACLE9I,归档模式
急!急!急!


我试了一下,好象不行呀 flashback 只使用在DML语句中,并有日志记录,我是用DROP 来做的,请问还有别的方法吗?
急用呀!!!
有RMAN备份的昨天的数据,不知道如何恢复我DROP的那个表,有没有人给个操作过程在另一个机器上进行不安全恢复,需要那些文件

ALLSTARS_ORACLE 发表于 2017-5-3 16:58:41

使用prm-dul恢复被drop删除掉的oracle表:
DROP TABLE的Oracle数据恢复 PRM-DUL
http://www.askmaclean.com/archives/drop-table%E7%9A%84oracle%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D-prm-dul.html

biotwang 发表于 2017-7-7 15:26:17

对DROP表进行恢复:
============================
1) 如果你有这个表的EXPORT备份的话,直接使用IMPORT恢复即可。

2) 如果你没有EXPORT备份的话,那么这张表平时是通过SQL*Loader批量导入的么?
如果仅是批量导入后进行事务更新的表。那么重新批量导入手工更新下即可。

3) 如果前两种情况都不可行,那么考虑从备份进行恢复:
- 是否数据库存在良好备份
- 数据库是否在archivelog模式下:
a)如果不是的话那么表只能从最近的冷备中进行恢复了。
b)如果数据库在archivelog模式下,检查是否存在含有这张表的最近的表空间备份。

如果b)情况具备,那么就可以进行基于时间点的恢复(TSPITR: Tablespace Point-In-Time Recovery),
不过对应表空间下的所有数据将会被恢复到指定当时的状态。

进行操作时,如果,你并不介意恢复时间的话,你可以
1) 先将其表空间下的所有对象进行EXPORT(确保在导出时没有warning发生)。然后再开始进行表空间的时间点恢复。
2) drop所有表空间下除了此恢复表外的所有其它对象。
3) 使用IMPORT将表空间下的其它对象导入。
这样既保证了表空间下其它的对象都是最新的,又从备份中恢复了被drop的表。
确定是数据库表空间大的话EXPORT、IMPORT会很慢。

biotwang 发表于 2017-7-10 10:57:37

From MOS - Note: 223543.1
==========================
对于Oracle 10g及更高版本,你可以使用recyclebin来进行drop表的恢复,前提是这个功能没有被禁用。
如果recyclebin被禁用或数据库为9i版本,以下有几种方式可供恢复参考:
方法1. 使用RMAN duplicate建立一个数据库克隆,其克隆数据为删除表前的状态。克隆出来的辅助库可以仅含有需要恢复用的表空间子集。一旦RMAN建立了克隆并被打开了。那么就可以从这个辅助库里导出表并导回主库。
这种方式对主库影响小,为Oracle官方推荐方法。
方法2. 直接将主库恢复到表删除前的状态。这是一种极端方法,因为整个库都会被回退。
方法3. 将表空间恢复到删除前的时间点。虽然比整个库回退好,但是它仍然对相对应的表空间进行了回退。
方法4. 将数据库恢复到一个DUMMY库中,这样就可以导出这张被删除的表然后在导入到目标库中。当然,这个方法仅是对RMAN duplicate命令不可用情况下的尝试。Oracle还是推荐使用RMAN duplicate命令来进行恢复操作。

对于Oracle 12c RMAN现在有了一个'recover table'命令,相关新特性可以查看MOS Note: 1521524.1

biotwang 发表于 2017-7-10 15:19:40

本帖最后由 biotwang 于 2017-7-10 15:23 编辑

通过PRM DUL找到被Drop的表:
===============================================================
> sqlplus hr/oracle
===============================================================
SQL> select table_name from all_tables;

TABLE_NAME
------------------------------
DUAL
SYSTEM_PRIVILEGE_MAP
TABLE_PRIVILEGE_MAP
STMT_AUDIT_OPTION_MAP
AUDIT_ACTIONS
WRR$_REPLAY_CALL_FILTER
HS_BULKLOAD_VIEW_OBJ
HS$_PARALLEL_METADATA
HS_PARTITION_COL_NAME
HS_PARTITION_COL_TYPE
REGIONS
LOCATIONS
DEPARTMENTS
...
===============================================================
SQL> create table emp_status(emp_no number, status varchar2(20));

Table created.

SQL> insert into emp_status values(100, 'ACTIVE');

1 row created.

SQL>  insert into emp_status values(101,'IN-ACTIVE');

1 row created.

SQL>  insert into emp_status values(102,'ACTIVE');

1 row created.

SQL>  insert into emp_status values(103,'ACTIVE');

1 row created.

SQL>  insert into emp_status values(104,'ACTIVE');

1 row created.

SQL> commit;

Commit complete.
===============================================================
SQL> select * from emp_status;

    EMP_NO STATUS
---------- --------------------
       100 ACTIVE
       101 IN-ACTIVE
       102 ACTIVE
       103 ACTIVE
       104 ACTIVE
===============================================================
SQL> drop table emp_status;

Table dropped.
===============================================================
SQL> select * from sys.props$ where name in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

NAME                           VALUE$               COMMENT$
------------------------------ -------------------- --------------------
NLS_CHARACTERSET               AL32UTF8             Character set
NLS_NCHAR_CHARACTERSET         AL16UTF16            NCHAR Character set

===============================================================
SQL> select file_name from dba_data_files;

FILE_NAME
---------------------------------------------------------------
/u01/app/oracle/oradata/PROD1/data/system01.dbf
/u01/app/oracle/oradata/PROD1/data/sysaux01.dbf
/u01/app/oracle/oradata/PROD1/data/undotbs01.dbf
/u01/app/oracle/oradata/PROD1/data/users01.dbf
/u01/app/oracle/oradata/PROD1/data/example01.dbf
/u01/app/oracle/oradata/PROD1/data/indx01.dbf
/u01/app/oracle/oradata/PROD1/data/tools01.dbf
/u01/app/oracle/oradata/PROD1/data/test01.dbf

8 rows selected.

===============================================================

SQL> select username, default_tablespace from dba_users where username='HR';

USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
HR                             EXAMPLE
===============================================================
SQL> select min(object_id), max(object_id) from dba_objects where owner='HR';

MIN(OBJECT_ID) MAX(OBJECT_ID)
-------------- --------------
         13627          14228
===============================================================因为当时测试的表是最后建立的,所以被drop的表的object_id一定大于数据字典中最大的那个id,即14228。
通过非字典模式查找,并Scan Segment,我们就可以找到id为obj14231的emp_status表了。


                 
页: [1]
查看完整版本: 急救,Oracle 恢复drop删掉的表