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

oracle数据库恢复

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

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

1.用FlashbackQuery恢复之前的数据

2.通过闪回表恢复

3.通过logmnr进行数据挖掘恢复

4.通过备份进行恢复

下面我们主要讨论前面的前三种方法。
 
用Flashback Query恢复之前的数据

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

下面是实验步骤:

新建一个表T3并插入数据

删除数据
 
删除的时间为2014-03-2609:30:29

查看删除前的数据

将数据导入T3_new表

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

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

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

运用闪回表前提
 
1)普通用户中需要有Flashback any table的系统权限。命令如:

SQL>grant flashback any table to scott;
 
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,并删除数据

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

SQL> alter system set utl_file_dir=’d:oralcelogmnr’ scope=spfile;

生成数据字典

exec dbms_logmnr_d.build(‘dictionary.ora’,’d:oralcelogmnr ‘);

添加归档日志

开始挖日志

exec dbms_logmnr.start_logmnr(dictfilename=>’d:oraclelogmnrdictionary.ora’);

logmnr的数据暂时保存在一个表里面
 
免得再次查询时候不用再次添加归档日志。
 
做这一步之前注意将nls_date_format改成’yyyy-mm-dd hh24:mi:ss’,防止乱码。

终止日志分析过程

SQL> exec sys.dbms_logmnr.end_logmnr

利用脚本导入

检查数据

原创文章,版权归本文作者所有,如需转载请注明出处

喜欢本文请长按下方的二维码订阅Oracle一体机用户组

oracle数据库恢复相关文章

赞 (0)
版权声明