数据库的恢复

在我的之前的文章中讲到了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 Type

SNO NUMBER(38)

SNAME CHAR(10)

ecdsnl:/home/ap/ecds/> sql1 "select * from cat;"

SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> 

TABLE_NAME |TABLE_TYPE

A |TABLE

2、表记录的恢复

对误删的表记录,只要没有truncate语句,就可以根据事务的提交时间进行选择恢复,一般步骤如下:

1)删除表中的记录

ecdsnl:/home/ap/ecds/> sql "select * from A;"

SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> 

SNO|SNAME

---------------------------------------------------------------------

1|123

1 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 selected

2)从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_ID

1|2|3|4|5|6|7|8|9|10|11|

1|||||||||||

---------------------------------------------------------------------

UNDO_SQL

00010005000049A8| 0|27-MAY-13 | 38164029|27-MAY-13 |PECDS | 1|DELETE |A |PECDS |AAAY0jAAEAAABREAAA

insert 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|SNAME

1|123

1 row selected.

sql "flashback table A to timestamp to_date('2013-05-27 15:30:00','yyyy-mm-dd hh24:mi:ss');"