Oracle数据库恢复用DELETE误删数据的几种方法

作者简介:石云华,现就职于北京海天起点,oracle技术二线专家成员,Exadata部门负责人。拥有十余年电信、保险、税务行业核心系统ORACLE数据库运维经验,持有11gOCM、Exadata、Goldengate等证书。擅长于oracle/goldengate/exadata方面的故障诊断及疑难问题处理。

当一个表中的数据被用delete错误删除并且已经commit,需要恢复时,一般可以用以下几种方法。

  1. 用Flashback Query恢复之前的数据
  2. 通过闪回表恢复
  3. 通过logmnr进行数据挖掘恢复
  4. 通过备份进行恢复

下面我们主要讨论前面的前三种方法。

用Flashback Query恢复之前的数据

Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据!当离误操作比较近,并且回滚段中的数据没有覆盖时,可以使用通过Flashback Query来恢复数据。因为oracle保存在回滚保持段里的数据时间有一定的时间限制由undo_retention 这个参数值决定。如果时间过长,并且业务比较频繁,回滚段中的相关数据已经被覆盖,则不能使用该方法。

下面是实验步骤:

新建一个表T3并插入数据

删除数据

删除的时间为2014-03-26 09:30:29

查看删除前的数据

将数据导入T3_new 表

将T3表备份,并将T3_new 改名为T3.

比对T3表和原表,数据已经恢复。

通过闪回表恢复数据

闪回表(Flashback table)是利用undo信息来恢复表对象到以前的某一个时间点(一个快照),因此也要确保自动回滚段有足够的Retention值。闪回表是将恢复当前表及附属对象一起回到以前的时间点。

语法:

运用闪回表前提

1)普通用户中需要有Flashback any table的系统权限。命令如:

2)有该表的select、insert、delete、alter权限。

3)必须保证该表有row movement(行移动)。

测试步骤如下:

新建表test

新建表TEST,并建立索引和相关的触发器

记录时间,并删除数据

删除索引并修改触发器

确保该表中的行迁移功能

恢复表到刚记录的时间点

恢复test表到刚记录的时间点(或scn),由于表中存在触发器,因此使用了关键字enable triggers;

查看恢复结果

总结

1) Flashback table在真正的高可用环境中,使用意义不大,受限比较多,要必须确保行迁移功能

2)Flashback table过程中,阻止写操作

3)表中数据能恢复,而表中索引确不能正常恢复

4)恢复的触发器本身还是修改后的,并不随表flashback到修改以前的时间点。说明关键字enable triggers只能保证触发器的状态正常,而不是内容回滚.

5)由于原理利用其undo信息,来恢复其对象,因此也是不能恢复truncate数据

6)恢复数据用flashback query实现比较好

通过logmnr进行数据挖掘恢复

新建表OBJ,并删除数据

修改参数,用于挖日志,重启数据库

生成数据字典

添加归档日志

开始挖日志

logmnr的数据暂时保存在一个表里面

免得再次查询时候不用再次添加归档日志。

做这一步之前注意将nls_date_format改成’yyyy-mm-dd hh24:mi:ss’,防止乱码。

终止日志分析过程。

利用脚本导入

检查数据

 

 

未经允许不得转载:Oracle一体机用户组 » Oracle数据库恢复用DELETE误删数据的几种方法

相关推荐