如果不小心删除了oracle表中不应该删除的数据,这时候又想找回来,该怎么做呢?其实oracle提供了一个强大的回闪功能。
在sql窗口中使用
Begin
dbms_flashback.enable_at_time(to_date('2009-4-23 11:50:03','yyyy-mm-dd hh24:mi:ss'));
End;
这里要注意的是只有system用户才有使用包dbms_flashback权限,如果想其他用户也能使用dbms_flashback,那么必须用system给特定用户授权使用这个包的权限!!
可使用grant execute on dbms_flashback to XXX。
这时候我们再查询表里的数据,数据就是参数中所设时间以前的数据。但启动回闪以后只能进行select操作,而不能做dml操作,那我们又想恢复表里的数据到所设的时间点该怎么做呢?
其实很简单,通过写一段很简单的代码就可以实现啦!!
如:
Declare
Cursor c1 Is
Select *
From cux.cux_tes_temp;
Type tbl_type Is Table Of c1%Rowtype;
l_tbl tbl_type;
Begin
--先用一个游标TYPE存储回闪后的数据
Open c1;
Fetch c1 Bulk Collect
Into l_tbl;
Close c1;
dbms_flashback.disable;--关闭回闪模式,就可以进行DML操作了
For i In 1 .. l_tbl.Count
Loop
Insert Into cux.cux_tes_temp
Values l_tbl
(i);
End Loop;
Commit;
End;
在sql窗口中使用
Begin
dbms_flashback.enable_at_time(to_date('2009-4-23 11:50:03','yyyy-mm-dd hh24:mi:ss'));
End;
这里要注意的是只有system用户才有使用包dbms_flashback权限,如果想其他用户也能使用dbms_flashback,那么必须用system给特定用户授权使用这个包的权限!!
可使用grant execute on dbms_flashback to XXX。
这时候我们再查询表里的数据,数据就是参数中所设时间以前的数据。但启动回闪以后只能进行select操作,而不能做dml操作,那我们又想恢复表里的数据到所设的时间点该怎么做呢?
其实很简单,通过写一段很简单的代码就可以实现啦!!
如:
Declare
Cursor c1 Is
Select *
From cux.cux_tes_temp;
Type tbl_type Is Table Of c1%Rowtype;
l_tbl tbl_type;
Begin
--先用一个游标TYPE存储回闪后的数据
Open c1;
Fetch c1 Bulk Collect
Into l_tbl;
Close c1;
dbms_flashback.disable;--关闭回闪模式,就可以进行DML操作了
For i In 1 .. l_tbl.Count
Loop
Insert Into cux.cux_tes_temp
Values l_tbl
(i);
End Loop;
Commit;
End;