ORACLE数据误删除delete后的恢复
本帖最后由 ALLSTARS_ORACLE 于 2017-4-27 13:20 编辑ORACLE数据误删除delete后的恢复
我在导数据的时候反了一个很大的错误,不小心删除了所有的数据,当时我并没有COMMIT而是想着把它断开后在继续,于是我就按了CONN这串字副,结果我几个月的数据就这样丢了,真是让我叫天天不应,叫地地不灵啊@我想问哪位高人知道我还能把以前的数据找回来吗?该怎么找呢!!!!着急啊!!!谢谢大家帮忙了! oracle 中被delete的数据只是在row piece 级别被标记为deleted,但可能没有实际被删除。
可以使用prm-dul的undelete功能恢复delete的数据:
prm-dul恢复被删除的记录:http://www.tudou.com/programs/view/2eS30XTgZ6A/
也可以联系我们诗檀软件恢复
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ: 47079569 如果是短时间内的误操作,可以尝试使用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: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: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]