oracle 误删数据的恢复

一、在恢复以前我们先看一下删除数据

   1、删除表中数据两种方法

         a. delete * from My_Table            --不释放区
         b. truncate table My_Table;

    2、删除整个表
         drop table My_Table                      --释放区(还会占用表空间,一般清理彻底不要的表一定要加 purge )

         drop table My_Table purge            --释放表空间

二、数据恢复

      1、恢复drop(不加purge,purge是无法恢复的)     

             但可以用如下语句查询到这个表还在Oracle回收站中:
              SELECT * FROM user_recyclebin WHERE original_name='tablename'

             那么现在就可以用如下语句进行恢复:
             FLASHBACK TABLE tablename TO BEFORE DROP

      2、delete 事务已提交(习惯用时间来恢复)

           a、根据时间来恢复:
                查询数据库当前时间(目的是为了检查数据库时间是否与你电脑时间相近,避免时间不同而将数据恢复到错误时间点)
                    select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
                查询删除数据时间点之前的数据
                    select * from tablename as of timestamp to_timestamp('2018-08-01 16:06:10','yyyy-mm-dd hh24:mi:ss')
                    如果发现没有数据试着往前提几分钟
                恢复数据(激动人心的时刻)
                   flashback table tablename to timestamp to_timestamp('2018-08-01 16:06:10','yyyy-mm-dd hh24:mi:ss');

                        报错:ORA-08189:未启用行移动功能,不能闪回表;        
                                   alter table tablename enable row movement;
                                   然后再次执行上面SQL即可;

           b、根据数据库SCN恢复数据

                  查询当前数据库SCN号

                          select current_scn from v$database;(不能执行的话,切换到sys用户或system用户查询)    

                          查询到的当前值为:91799986

                  缩小SCN号查询被删除表数据

                           (若无数据继续缩小SCN,由于数据库操作不止一人,SCN号变化比较多,可以多缩小几个号)

                           select * from tablename as of scn 91799980;

                  恢复数据

                           flashback table tablename to scn 91799980;

                 报错:ORA-08189:未启用行移动功能,不能闪回表;        
                                   alter table tablename enable row movement;
                                   然后再次执行上面SQL即可;

你可能感兴趣的:(oracle 误删数据的恢复)