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表中。
