ALLSTARS_ORACLE 发表于 2017-4-17 15:59:55

ORACLE数据误删除delete后的恢复

本帖最后由 ALLSTARS_ORACLE 于 2017-4-27 13:20 编辑


ORACLE数据误删除delete后的恢复

我在导数据的时候反了一个很大的错误,不小心删除了所有的数据,当时我并没有COMMIT而是想着把它断开后在继续,于是我就按了CONN这串字副,结果我几个月的数据就这样丢了,真是让我叫天天不应,叫地地不灵啊@我想问哪位高人知道我还能把以前的数据找回来吗?该怎么找呢!!!!着急啊!!!谢谢大家帮忙了!

ALLSTARS_ORACLE 发表于 2017-4-27 13:22:52

oracle 中被delete的数据只是在row piece 级别被标记为deleted,但可能没有实际被删除。
可以使用prm-dul的undelete功能恢复delete的数据:
prm-dul恢复被删除的记录:http://www.tudou.com/programs/view/2eS30XTgZ6A/
也可以联系我们诗檀软件恢复

诗檀软件专业数据库修复团队

服务热线 : 13764045638  QQ: 47079569   

biotwang 发表于 2017-8-1 11:20:41

如果是短时间内的误操作,可以尝试使用flashback query来找回表数据:SELECT * FROM employees
AS OF TIMESTAMP
TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
WHERE last_name = 'Chung';

biotwang 发表于 2017-8-1 17:06:44

本帖最后由 biotwang 于 2017-8-1 17:33 编辑

使用Flashback特性进行表恢复

Flashback Table语句使得用户可以将表恢复到之前的某个时间点上。对于用户或应用偶发性误删除,它提供了一个快速地在线解决方案,它比其它恢复机制速(如时间点恢复等)速度更快。
在进行指定表的所有数据恢复到之前某个时间点或SCN时,这个表上会持有一个DML排它锁,以在线进行恢复作业。

注意:你必须使用automatic undo management来使用flashback表特性。因此此特性的恢复基于存储在undo表空间中的undo信息。

flashback table表特性在恢复表的同时,也会自动恢复相应表的属性如index, trigger等相关对象。
当然闪回表的时间会检查相应的完整性约束,如果被闪回表和另一张表具有引用关系,而另一张表并未被闪回,则闪回失败。

即便你已经进行了一次flashback,数据在闪回之前的状态也不会丢失。你也可以之后转回原先的状态。

在使用Flashback Table语句前,你需要授权你的登陆用户有FLASH ANY TABLE的权限,或者至少对于你要闪回的对象的闪回权限。此外,你必须对你要闪回的表具有SELECT, INSERT, DELETE和UPDATE操作权限。需要被闪回的表必须启用row movement。

例如:SQL> alter tablespace UNDOTBS1 retention gurantee;
SQL> select tablespace_name, retention from dba_tablespaces;
TABLESPACE_NAME                RETENTION
------------------------------ -----------
SYSTEM                         NOT APPLY
UNDOTBS1                       GUARANTEE
SYSAUX                         NOT APPLY
TEMP                           NOT APPLY
EXAMPLE                        NOT APPLY
USERS                          NOT APPLY
HISTORY                        NOT APPLY
7 rows selected.

SQL> select * from flash_test_table;

     EMPNO EMPNAME
---------- ------------------------------
         1 Kiran
         2 Scott
         3 Tiger
         4 Jeff

SQL> select current_scn from v$database;
CURRENT_SCN
----------------
332348

SQL> connect scott/tiger
Connected.

SQL> insert into flash_test_table values(5,'Jane');
SQL> insert into flash_test_table values(6,'John');
SQL> commit;
Commit complete.

SQL> connect / as sysdba
Connected.

SQL> select current_scn from v$database;
CURRENT_SCN
----------------
332376

SQL> connect scott/tiger
Connected.

SQL> select * from flash_test_table;
     EMPNO EMPNAME
---------- ------------------------------
         1 Kiran
         2 Scott
         3 Tiger
         4 Jeff
         5 Jane
         6 John
6 rows selected.

-- 必须启动row movement
SQL> alter table flash_test_table enable row movement;
Table altered.

-- 闪回至scn 332348
SQL> flashback table flash_test_table to scn 332348;
Flashback complete.

SQL> select * from flash_test_table;
     EMPNO EMPNAME
---------- ------------------------------
         1 Kiran
         2 Scott
         3 Tiger
         4 Jeff

-- 闪回回插入新数据时候的scn 332376
SQL> flashback table flash_test_table to scn 332376;
Flashback complete.

SQL> select * from flash_test_table;
     EMPNO EMPNAME
---------- ------------------------------
         1 Kiran
         2 Scott
         3 Tiger
         4 Jeff
         5 Jane
         6 John
6 rows selected.若使用timestamp进行flashback table,举例:SQL> flashback table xxx to timestamp to_timestamp('2012-09-01 11:00:00', 'YYYY-MM-DD HH24:MI:SS') ;

biotwang 发表于 2017-8-1 18:04:44

本帖最后由 biotwang 于 2017-8-1 18:12 编辑

使用PRM恢复:SQL> select * from sh.flash_test_table;
     EMPNO EMPNAME
---------- ------------------------------
         1 Kiran
         2 Scott
         3 Tiger
         4 Jeff
         5 Jane
         6 John
6 rows selected.

SQL> delete from sh.flash_test_table where empno>2;
4 rows deleted.

SQL> commit;
Commit complete.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 启动PRM$ sh prm.shTools >> Recovery Wizard >> Dictionary Mode >> Choose Files >> Load




$ cd deleted/
$ ls
sh.flash_test_table.dat  sh.flash_test_table.dat.ctl
$ cat sh.flash_test_table.dat
"3" "Tiger"
"4" "Jeff"
"5" "Jane"
"6" "John"
$ Tip:如果你多次使用Unload deleted data,prm会将抓取出的数据都放入sh.flash_test_table.dat文件中,这会让你看到重复行(PRM不主张删除数据),所以请每次使用后查看被抓出的结果:P

注意:被删除的行,可能由于数据量过少或块被重用而导致被新行覆盖,那么在这种情况,PRM也仅能尽可能地找到那些还未被覆盖的被删除行,因此会有所残缺,完整恢复取决于救援时间的早晚,越早当然越好。

页: [1]
查看完整版本: ORACLE数据误删除delete后的恢复