恢复由用户错误误删除的表或表中的数据
恢复由用户错误误删的表可以使用flashback drop,恢复由用户错误误删的数据可以使用flashback query.
flashback drop恢复的数据是保留在recyclebin中的数据.,recyclebin中的数据可以保留多久是空间压力来确定.空间压力是向表中写入数据产生的.若表空间是auto extend的,当需要空间来存储数据时,recyclebin会首先被利用而不是扩展表空间;若表空间不是auto extend的,会先利用其它的空间,而不是先利用recyclebin.
flashback drop对truncate表,sys,system拥有的对象无效,也就是说truncate表,删除的sys或system的表不会记录在recyclebin中.
flashback query是通过undo来实现的.
下面通过过例子来说明如何实现
恢复由用户错误误删的表
1.创建表并插入数据
SYS@dbtest>create table oak.test(nu number);
SYS@dbtest>insert into oak.test values(10);
SYS@dbtest>commit;
2.删除表
SYS@dbtest >drop table oak.test;
3.查看recyclebin的内容
12:19:58 SYS@dbtest>select OWNER,DROPTIME from dba_recyclebin;
OWNER DROPTIME
------------------------------ -------------------
OAK 2008-06-12:12:19:35或在object schema下
或oak下运行show recyclebin(只显示当前schema的recyclebin)
conn oak
OAK@dbtest>show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST BIN$T3F4CJ8XcPngQFcKxgA0nQ==$0 TABLE 2008-06-12:12:19:35
show recyclebin;
4.恢复test表
flashback table oak.test to before drop;
再次运行
select OWNER,DROPTIME from dba_recyclebin;你将表recyclebin针对oak.test表的记录没有了
当然你可以在恢复时重命名表
SYS@dbtest>flashback table oak.test to before drop rename to test1;
5.验证
SYS@dbtest>select * from oak.test1;
NU
----------
10
恢复由用户错误误删的数据
可以通过scn或timestamp来进行flash query,个人倾向于使用timestamp,这样如果用户提供准确.
scn的方式
确定当前scn
select dbms_flashback.get_system_change_number from dual;
查看这一段时间的scn变化
select name ,first_change# ,next_change# ,first_time from v$archived_log;
运行下的语句试出最佳scn
select count(*) from pmsqhd.pms_pr as of scn &scn
得到的结果最大时的数据插入到一个表中让用户验证
create schema.table tablename as select * from schema.tablename as of scn number;
若用户说没有错误恢复即可.
timestamp的方式
若数据只有几条可以通过flashback_transaction_query视图的中undo来恢复
select * from flashback_transaction_query where table_name='tablename';此处的tablename不用加上schema名.
运行查出来的undo_sql将可恢复数据
若数据较多则可以通过下面的语句来恢复
select * from schema.tablename as of timestamp to_timestamp('2008-06-13 09:12','yyyy-mm-dd hh24:mi')
create table tablename as select * from schema.tablename as of timestamp to_timestamp('2008-06-13 09:12','yyyy-mm-dd hh24:mi')
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7419833/viewspace-345713/ ,如需转载,请注明出处,否则将追究法律责任。