ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 恢复由用户错误误删除的表或表中的数据

恢复由用户错误误删除的表或表中的数据

原创 Linux操作系统 作者:jifei0611 时间:2008-06-13 18:26:15 0 删除 编辑

恢复由用户错误误删除的表或表中的数据

恢复由用户错误误删的表可以使用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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-12

  • 博文量
    143
  • 访问量
    308642