您的位置:首页 > 数据库 > Oracle

oracle使用闪回技术中恢复误删除和修改的表及数据

2013-05-28 09:05 901 查看
数据库的恢复在我的之前的文章中讲到了10g的新特性闪回技术。现在来使用oracle10g提供的闪回技术对数据库中的修改恢复到上一个时间点。使用恢复技术之前要保证闪回技术是开放状态。恢复主要涉及表的恢复以及表的记录的恢复两种情况。以下就这两种情况进行详细分析。
1、表的恢复当用户不小心把一个表删除之后,希望恢复表。以下使用实例进行讲解如何进行恢复。
1)创建示例表
ecdsnl:/home/ap/ecds/> sql1 "create table A (Sno int,Sname char(10));"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL>
Table created.
ecdsnl:/home/ap/ecds/> sql1 "desc A;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> Name Null? Type
SNO NUMBER(38)
SNAME CHAR(10)
2)删除示例表
ecdsnl:/home/ap/ecds/> sql1 "drop table A;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL>
Table dropped.
ecdsnl:/home/ap/ecds/> sql1 "desc A;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> ERROR:
ORA-04043: object A does not exist
ecdsnl:/home/ap/ecds/> sql1 "select * from cat;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL>
TABLE_NAME |TABLE_TYPE
BIN$3aoxxMMASMngRAAaSwkV3g==$0|TABLE
以上查询表明数据表A已经被删除,但删除的记录保存在闪回区域可以进行闪回技术回复表。
3)表的恢复
(1)从flash back里查询被删除的表
ecdsnl:/home/ap/ecds/> sql1 "select * from recyclebin;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL>
OBJECT_NAME |ORIGINAL_NAME |OPERATION|TYPE |TS_NAME |CREATETIME |DROPTIME | DROPSCN|PARTITION_NAME |CAN|CAN| RELATED| BASE_OBJECT|PURGE_OBJECT| SPACE
1|2|3|4|5|6|7|8|9|10 |11 |12|13|14|15|
1|2 |3|4 |5|6|7|8|9|10 |11 |12|13|14|15|
---------------------------------------------------------------------
BIN$3aoxxMMASMngRAAaSwkV3g==$0|A |DROP |TABLE |TBS_DATA2 |2013-05-27:10:43:10|2013-05-27:10:49:16| 654231737| |YES|YES| 1160212| 1160212| 1160212| 8
1 row selected.
(2)执行表的恢复
①ecdsnl:/home/ap/ecds/> sql1 "flashback table A to before drop;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> Flashback complete.②ecdsnl:/home/ap/ecds/> sql1 "desc A;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> Name TypeSNO NUMBER(38)
SNAME CHAR(10)
③ecdsnl:/home/ap/ecds/> sql1 "select * from cat;"SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> TABLE_NAME |TABLE_TYPEA |TABLE2、表记录的恢复对误删的表记录,只要没有truncate语句,就可以根据事务的提交时间进行选择恢复,一般步骤如下:1)删除表中的记录①ecdsnl:/home/ap/ecds/> sql "select * from A;"SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SNO|SNAME---------------------------------------------------------------------1|1231 row selected.② ecdsnl:/home/ap/ecds/> sql "delete from A where Sno=1;"SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> 1 row deleted.③ecdsnl:/home/ap/ecds/> sql "select * from A;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> no rows selected2)从flashback_transaction_query视图里查询,视图提供了供查询用的表名称、事务提交时间、UNDO_SQL等字段
ecdsnl:/home/ap/ecds/> sql "select * from flashback_transaction_query where TABLE_NAME='A';"SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> XID | START_SCN|START_TIMEST| COMMIT_SCN|COMMIT_TIMES|LOGON_USER |UNDO_CHANGE#|OPERATION |TABLE_NAME |TABLE_OWNER |ROW_ID1|2|3|4|5|6|7|8|9|10|11|1|||||||||||---------------------------------------------------------------------UNDO_SQL00010005000049A8| 0|27-MAY-13 | 38164029|27-MAY-13 |PECDS | 1|DELETE |A |PECDS |AAAY0jAAEAAABREAAAinsert into "PECDS"."A"("SNO","SNAME") values ('1','123 ');3)执行表记录恢复①先开启行移动模式
ecdsnl:/home/ap/ecds/>sql "alter table A enable row movement;"
SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> Table altered.②恢复数据(可以进行多次flashback,一边闪回一边进行数据的比较,直到找到正确的时间点为止。)ecdsnl:/home/ap/ecds/>sql "flashback table A to timestamp systimestamp - interval '20' minute;"SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> Flashback complete.ecdsnl:/home/ap/ecds/> sql "select * from A;"SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SNO|SNAME1|1231 row selected.或sql "flashback table A to timestamp to_date('2013-05-27 15:30:00','yyyy-mm-dd hh24:mi:ss');"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息