Oracle找回数据

1、 dbms_flashback找回数据
 

首先必须要有使用dbms_flashback包的权力,可以在sys下通过

Grant execute on dbms_flashback to user;授权

 

Sql>execute dbms_flashback.enable_at_time(date);  //开启快照模式

Sql>进行回复操作,此时查询的表都是date所指时间的表,可以通过游标打开表,或把该表中的数据存入临时表

Sql>execute dbms_flashback.disable; //结束快照模式

Sql>把游标或临时表中的数据写回到原来的表中


 

 

一个示例存储过程:

1、确定数据被删之前的状态:

SQL>connect test/test

SQL>select * from yang;

SQL> select * from yang;

PART_ID ID NAME

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

1 1 yang

1 1 yang

11 1 ding

SQL> select to_char(sysdate,'mm-dd-yy hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'

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

01-21-05 14:48:09

2、删除表中的全部数据:

SQL>delete yang;

SQL>commit;

SQL>select to_char(sysdate,'mm-dd-yy hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'

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

01-21-05 14:49:08

3、启用flashback。

SQL> exec dbms_flashback.enable_at_time(to_date('2005-01-21 14:48:09','yyyy-mm-dd hh24:mi:ss'));

PL/SQL 过程已成功完成。

SQL> select * from yang;

PART_ID ID NAME

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

1 1 yang

1 1 yang

11 1 ding

这说明通过flashback可以找回丢失的数据。

因为在flashback方式下不能使用DML语句,而只能查看数据,因此使用通常的方法并不能恢复数据,但我们使用存储过程中的游标来保存flashback状态下的数据,等关闭flashback后再用此游标把数据恢复。

4、使用存储过程如下:

SQL>set serveroutput on

SQL>DECLARE

r_yang yang%ROWTYPE;

CURSOR c_yang IS SELECT * FROM yang;

BEGIN

OPEN c_yang;

dbms_flashback.disable;

LOOP

FETCH c_yang INTO r_yang;

EXIT WHEN c_yang%NOTFOUND;

dbms_output.put_line(r_yang.part_id||','||r_yang.id||','||r_yang.name);

insert into yang (part_id,id,name) values (r_yang.part_id,r_yang.id,r_yang.name);

commit;

END LOOP;

CLOSE c_yang;

END;

/

1,1,yang

1,1,yang

11,1,ding

PL/SQL 过程已成功完成。

5、然后再查看表中的数据,发现数据已经恢复了。

SQL> select * from yang;

PART_ID ID NAME

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

1 1 yang

1 1 yang

11 1 ding


 

 

2、用timestamp找回数据

 

insert into yang

select * from yang as of timestamp to_timestamp('2005-01-21 14:48:0', 'yyyy-mm-dd hh24:mi:ss');

将表yang在2005-01-21 14:48:0这一时间点时的记录插入到当前时刻的yang表中。


 

 

你可能感兴趣的:(Oracle找回数据)