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一体机用户组