Oracle库恢复删除数据的方法小结


    误删 Oracle 库中的数据,在不考虑全库备份和利用归档日志情况,如何恢复数据呢?
    下面介绍几种方法恢复数据:
    1、利用 Oracle 提供的闪回方法进行数据恢复,适用于 delete 删除方式
    首先获取删除数据的时间点:
    
select * from v$sql where sql_text like '%table_name%';

    根据结果中的 sql_text 内容,找到 delete 执行语句对应的删除时间点,执行下面语句查询出删除的数据。
    
select * from table_name as of timestamp to_timestamp(‘删除时间点',‘yyyy-mm-dd hh24:mi:ss') 
where (删除时的条件);

    检查数据无误后,执行下面操作,将数据插回原表中。注意主键不重复
    
insert into table_name
select * from from table_name as of timestamp to_timestamp(‘删除时间点',‘yyyy-mm-dd hh24:mi:ss')
where (删除时的条件);

    2、利用 Oracle 虚拟回收站功能
    原理是因为 Oracle 数据库在删除表时会将删除信息存放于某虚拟回收站中而非直接清空,在此种状态下数据库标记该表的数据库为可以复写,所以在该块未被重新使用前依然可以恢复数据。该方法多用于 drop 删除。
    首先查询 user_table 视图,找到被删除的表:
    
select table_name,dropped from user_tables;
select object_name,original_name,type,droptime from user_recyclebin;

    注意此时的,object_name 和 original_name 就是回收站存放的表名和原来删除的表名,如果表名没有被重新命名,可以通过下面语句进行恢复:
    
flashback table original_name to before drop;

    3、用 Oracle 数据库的闪回功能可以将数据库恢复到过去某一状态
    注意,此时是整库恢复,具体语法如下:
    
SQL>alter database flashback on
SQL>flashback database to scn SCNNO;
SQL>flashback database to timestamp to_timestamp(‘frombyte 2021-09-02 23:59:59',‘yyyy-mm-dd hh24:mi:ss');

    4、彻底删除数据
    如果确定需要删除的数据又不想无谓的占用空间,可以使用以下3种方式:
    1)采用 truncate 方式进行截断。(不能进行数据恢复)
    2)在 drop 时加上 purge 选项:
    
drop table table_name purge;

    5. 关于清空回收站
    1)删除当前用户回收站
    
purge recyclebin;

    2)删除全体用户在回收站的数据
    
purge dba_recyclebin;