误删数据的紧急修复

在日常维护数据库过程或开发应用过程,可能由于某种原因不慎将表删除了,这时有哪些补救措施呢?下面我们来说说其中的一种方法:

flashback drop用于恢复用户误删除的对象(包括表,索引等)这个技术依赖于table recycle bin(表空间回收站,前提是drop表未使用purge),flashback 不支持sys用户,system表空间下的对象,也不能从回收站里拿到。故使用sys或者system用户登陆时show recyclebin为空。

flashback drop是基于tablespace recyclebin来实现的,它只支持闪回与table相关连的对象,比如表,索引,约束,触发器等,如果是函数或者存储过程需要flashback query来实现

从oracle 10g开始,每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop(未加purge)命令时,被删除的表和表的相关联的对象(包括索引,约束,触发器,LOB段,LOB index段)不会被物理删除,这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。

当发生空间不够时,oracle会按照先入先出的顺序覆盖recycle Bin中的对象,也可以手动的删除recycle Bin占用的空间。

当然要使用这个功能首先要确保,该功能已经开启,我们可以使用show parameter recyclebin 来查看该功能是否开启,如查没有可以使用以下命令进行开启或关闭:

alter system set recyclebin=on;

alter system set recyclebin=off;

alter session recyclebin=on;

alter session recyclebin=off;

下面来看看基本的命令:

1.purge tablespace tablespace_name 用于清空表空间的recycle bin

2.purge tablespace tablespace_name user user_name 清空指定表空间的recyclebin中指定用户的对象

3.purge recyclebin 删除当前用户的recyclebin中的对象

4.purge dba_recyclebin;删除所有用户的recyclebin中的对象,该命令要sysdba权限

5.drop table table_name purge 删除对象不放入recyclebin中永久删除

6.purge index recycle_bin_object_name当想释放recyclebin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。因为索引是可以重建的。

7.show recyclebin 查看回收站中有哪些对象,也可以使用select original_name,object_name from recyclebin;查询

 下面我们来测试一下: 

首先生成一张表,生成一张测试数据,新建一个索引。

 


然后drop表(未加purge)

使用show recyclebin;查看回收站有t2表,但不能显示索引信息

使用select original_name,object_name from recyclebin;可以看到索引信息

 

使用命令恢复删除的表flashback table t1 to before drop;可以看到表已经恢复便索引的名字未恢复

 

恢复索引alter index "BIN$djskdjks" rename to inx_t1;

如果已经有了要恢复的表名则使用命令:flashback table t1 to before drop rename to t2;

flashback table "BIN$9isdksjdksla" to before drop;  recyclebin中有二张一样的表

flashback drop 的限制条件

1.只能用于非系统表空间和本地管理的表空间

2.对象的参考约束不会被恢复,指向该对象的外键约束需要重建

3.对象能否恢复成功,取决于对象空间是否被覆盖重用

4.当删除表时,依赖于该表的物化视图也会同时删除,但是由于物化视图不会放入到recyclebin中,所以需要重建

 

当我们误更新或删除数据时这时又没有备份时,我们可以使用闪回查询来紧急处理,下面介绍下闪回查询:

flashback query分三种:

  flashback query

  flashback version query

  flashback transaction query

flashback query是利用多版本一致性的特性从undo表空间读取操作前的记录数据,flashback query对v$table,x$tables等动态性能视图无效。对于dba_*,all_*,user_* 等数据字典是有效的。

 

下面来测试一下:生成测试数据

 

下面更新几条数据:

 

基于时间的查询

select * from t2 as of timestamp to_timestamp('2015-12-02 02:50:31','yyyy-mm-ddhh24:mi:ss');

下面是删除数据的测试:

这时我们就可以使用该语句进行恢复:insert into t1 select * from t2 as of timestamp to_timestamp('2015-12-02 02:10:45','yyyy-mm-dd hh24:mi:ss');

commit;

 

如上述示例中所表示的,as of timestamp 的确非常易用,但是在某些情况下,建议使用as of scn的方式执行flashback query,比如需要对多个相互有主外键约束的表进行恢复时,如果使用as of timestamp的方式,可能会由于时间点不綂一的缘故造成数据选择或插入失败,通过scn方式则能够确保记录的约束一致. 

利用scn查询

 

更新数据:

利用select imestamp_to_scn(to_timestamp('13-JAN-12 04.05.57','dd-mm-yy hh24.mi.ss')) from dual;根据时间找对应的scn号,利用select scn_to_timestamp(3814379) from dual; 查找scn号对应的时间

闪回查询:

 

flashback version query查询某段时间内数据变化

 

相对于flashback query只能看到某一点的对象状态,oracle 10g引入的flashback version query可以看到过去某个时间段内,记录是如何发生的。根据这个历史,DBA就可以快速的判断数据是在什么时间 的状态,flashback version query 技术其实有很多伪列,但是ora_rowscn是最重要。它记录的是最后一次被修改的scn.注意是被提交的修改。如果没有提交,这个伪列不会发生变化

ora_rowscn 伪列

select ora_rowscn,id from t2;

Select versions_xid,versions_startscn,versions_endscn,     DECODE(versions_operation,'I','Insert','U','Update','D','Delete', 'Original') "Operation", id from t2

     versions between scn minvalue and maxvalue;

select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q where q.xid in(select versions_xid from t1 versions between scn 12345 and 2345);

 

wangxiang

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30109892/viewspace-1979833/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30109892/viewspace-1979833/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值