LogMiner救命稻草_找回误删除数据

LogMiner日志挖掘技术在有些时候可以被比作是命悬一线的救命稻草,比方说误删除数据(如delete执行不当),可以通过LogMiner挖掘日志文件将这些数据补插回来

使用LogMiner预览:

o LogMiner的原理就是找出日志文件(redo file),所对应的UNDO.如你新增1W行数据,在redo里以insert形式体现,对应的undo即为delete
o LogMiner所有操作要在单个会话里执行
o LogMiner是挖掘在线日志或归档日志,因此最好要知道误操作的具体(精确更好)时间,这样能够尽可能少的挖日志,恢复时间将更短
o LogMiner挖掘之后的数据将保存在V$LOGMNR_CONTENTS.但需要注意一点,它的数据是每次查询时候才去读取的,因此涉及的日志文件多的时候,查询将非常慢.因此建议将视图内容用CATS保存起来,便于后来查询
o 源库的日志文件可以在源库本地做挖掘,也可以在其他机器做挖掘,但有版本和系统要求: 目标操作系统要采用同一字节编码顺序(ENDIAN_FORMAT);数据库版本大于或等于源数据库版本,且字符集相同
o 所有计划纳入挖掘的日志,需要来自同一数据库,且基于同一个RESETLOGS SCN
o 既然LogMiner可以分析日志,那么就可以用于统计哪些表被增删改查最多,可以更深入地了解自身的应用和数据
o LogMiner可以基于time/SCN进行挖掘,精确
o 使用挖掘技术的用户需要被授权角色或权限: SELECT ANY TRANSACTION , EXECUTE_CATALOG_ROLE
o 如果表被误truncate或误drop,LogMiner恢复不了,可以通过ODU/DUL/PRM/AUL工具来恢复

简易的实验过程

以下模拟delete误删除全表的数据,如果通过LogMiner挖日志将数据找回

1. 启用数据库的Supplemental Logging

<span style="font-size:12px;">SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;</span>

LogMiner需要最小级别的Supplemental Logging

2. 准备测试表和测试数据

<span style="font-size:14px;">SQL> create table t1 (a number,b char(2));
SQL> create table t2 (c number,d char(2));
SQL> insert into t1 values(1,'r1');
SQL> insert into t1 values(2,'r2');
SQL> insert into t1 values(3,'r3');
SQL> insert into t2 values(1,'t2');
SQL> commit;       
SQL> SELECT * FROM T1;
 
         A B
---------- --
         1 r1
         2 r2
         3 r3
SQL> archive log list;
Database log mode        Archive Mode
Automatic archival        Enabled
Archive destination        /home/oracle/arch
Oldest online log sequence     57
Next log sequence to archive   59
Current log sequence        59  <<<<<<====
SQL> alter system archive log current;</span>

3. 添加日志至挖掘列表并开始挖掘

EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/home/oracle/arch/1_59_847657195.dbf',OPTIONS => DBMS_LOGMNR.NEW);

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

PL/SQL procedure successfully completed

每次添加或移除日志到列表都需要重新执行START_LOGMNR

查询视图V$LOGMNR_CONTENTS

SQL> select scn,
       timestamp,
       (xidusn || '.' || xidslt || '.' || xidsqn) as xid,
       info,
       seg_owner,
       seg_name,
       operation,
       sql_redo,
       sql_undo
  from v$logmnr_contents
 where seg_name in ('T1', 'T2')
/
       SCN TIMESTAMP   XID               SEG_OWNER      SEG_NAME   OPERATION      SQL_REDO                                               SQL_UNDO
---------- ----------- ----------------- -------------- ---------- -------------- ------------------------------------------------------ --------------------------------------------------------------------------------
   1212893 2015/1/10 1 4.1.550           SYS            T1         DDL            create table t1 (a number,b char(2));
   1212907 2015/1/10 1 10.12.537         SYS            T2         DDL            create table t2 (c number,d char(2));
   1212913 2015/1/10 1 5.40.556          SYS            T1         INSERT         insert into "SYS"."T1"("A","B") values ('1','r1');     delete from "SYS"."T1" where "A" = '1' and "B" = 'r1' and ROWID = 'AAANBSAABAAAP
   1212913 2015/1/10 1 5.40.556          SYS            T1         INSERT         insert into "SYS"."T1"("A","B") values ('2','r2');     delete from "SYS"."T1" where "A" = '2' and "B" = 'r2' and ROWID = 'AAANBSAABAAAP
   1212913 2015/1/10 1 5.40.556          SYS            T1         INSERT         insert into "SYS"."T1"("A","B") values ('3','r3');     delete from "SYS"."T1" where "A" = '3' and "B" = 'r3' and ROWID = 'AAANBSAABAAAP
   1212913 2015/1/10 1 5.40.556          SYS            T2         INSERT         insert into "SYS"."T2"("C","D") values ('1','t2');     delete from "SYS"."T2" where "C" = '1' and "D" = 't2' and ROWID = 'AAANBTAABAAAP

删除测试表数据

SQL> DELETE FROM T1;
 
3 rows deleted
 
SQL> COMMIT;
 
Commit complete
 
SQL> SELECT * FROM T1;
 
         A B
---------- --</span></p><p>
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
 
System altered</span></p>

新增日志列表,重新开始挖掘

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/home/oracle/arch/1_60_847657195.dbf',OPTIONS => DBMS_LOGMNR.ADDFILE);
 
PL/SQL procedure successfully completed</span><p></p><span style="font-size:14px;"></span><p>SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
 
PL/SQL procedure successfully completed</p>

查询V$LOGMNR_CONTENTS

 SQL> select scn,
       timestamp,
       (xidusn || '.' || xidslt || '.' || xidsqn) as xid,
       info,
       seg_owner,
       seg_name,
       operation,
       sql_redo,
       sql_undo
  from v$logmnr_contents
 where seg_name in ('T1', 'T2')
/
 
<span style="font-size:12px;">       SCN TIMESTAMP   XID            SEG_OWNER                        SEG_NAME    OPERATION     SQL_REDO                                                                         SQL_UNDO
---------- ----------- -------------- -------------------------------- ----------- ------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
   1212893 2015/1/10 1 4.1.550        SYS                              T1          DDL           create table t1 (a number,b char(2));
   1212907 2015/1/10 1 10.12.537      SYS                              T2          DDL           create table t2 (c number,d char(2));
   1212913 2015/1/10 1 5.40.556       SYS                              T1          INSERT        insert into "SYS"."T1"("A","B") values ('1','r1');                               delete from "SYS"."T1" where "A" = '1' and "B" = 'r1' and ROWID = 'AAANBSAABAAAP
   1212913 2015/1/10 1 5.40.556       SYS                              T1          INSERT        insert into "SYS"."T1"("A","B") values ('2','r2');                               delete from "SYS"."T1" where "A" = '2' and "B" = 'r2' and ROWID = 'AAANBSAABAAAP
   1212913 2015/1/10 1 5.40.556       SYS                              T1          INSERT        insert into "SYS"."T1"("A","B") values ('3','r3');                               delete from "SYS"."T1" where "A" = '3' and "B" = 'r3' and ROWID = 'AAANBSAABAAAP
   1212913 2015/1/10 1 5.40.556       SYS                              T2          INSERT        insert into "SYS"."T2"("C","D") values ('1','t2');                               delete from "SYS"."T2" where "C" = '1' and "D" = 't2' and ROWID = 'AAANBTAABAAAP
   1213003 2015/1/10 1 5.47.556       SYS                              T1          DELETE        delete from "SYS"."T1" where "A" = '1' and "B" = 'r1' and ROWID = 'AAANBSAABAAAP insert into "SYS"."T1"("A","B") values ('1','r1');
   1213003 2015/1/10 1 5.47.556       SYS                              T1          DELETE        delete from "SYS"."T1" where "A" = '2' and "B" = 'r2' and ROWID = 'AAANBSAABAAAP insert into "SYS"."T1"("A","B") values ('2','r2');
   1213003 2015/1/10 1 5.47.556       SYS                              T1          DELETE        delete from "SYS"."T1" where "A" = '3' and "B" = 'r3' and ROWID = 'AAANBSAABAAAP insert into "SYS"."T1"("A","B") values ('3','r3');

9 rows selected
</span>

执行SQL_UNDO字段的SQL即可

SQL> insert into "SYS"."T1"("A","B") values ('1','r1');

1 row inserted
SQL> insert into "SYS"."T1"("A","B") values ('2','r2');

1 row inserted
SQL> insert into "SYS"."T1"("A","B") values ('3','r3');

1 row inserted

SQL> commit;

Commit complete

SQL>
SQL> select * from t1;

         A B
---------- --
         1 r1
         2 r2
         3 r3

至此,被误删除的数据就找回来了.

关闭LogMiner

SQL> EXECUTE DBMS_LOGMNR.end_logmnr;

PL/SQL procedure successfully completed
时间: 2024-10-12 00:47:51

LogMiner救命稻草_找回误删除数据的相关文章

移动团购:压死骆驼的救命稻草

各大银行.第三方支付机构.电信运营商在去年全力推进.角逐移动支付市场,更让移动团购最大的难题--支付瓶颈有了打破的希望,但似乎还没有打破. 文/张书乐 本文刊载于<销售与市场>杂志评论版2013年03期,转载请注明出处. 支付宝公司人士称,2012年团购市场总体交易比2011年有80%的增长,其中移动团购交易增幅惊人,比上一年劲升27倍,占到整个团购市场15%的份额.从资本层面看,截至2012年12月31日,美团网.拉手网.窝窝团等10家团购网站已累计获得2.2亿元人民币以及5.36亿美元以上

“减少风险”还是“管理风险”哪一根才是救命稻草?

在大数据分析为背景的p2p网贷公司迅速崛起2014年二季度,全国P2P网贷成交额554.75元,较一季度增加145.04亿元,增长35.40%.与此同时,伴随着网贷行业的兴起,网贷公司运作上的坏账也一路飙升.银监会针对网贷公司风险提出监管,试图围剿.网贷公司提高自身风控能力已经迫在眉睫,实际上,线上信贷相对于线下信贷有着自身的特殊性."减少风险"和"管理风险"哪一种风控才是更适合p2p网络模式,成为网上企业的救命稻草? 网络信贷风险不同于传统线下信贷风险 传统线下信

央行降息 是农村互联网金融的救命稻草?

互联网金融各种关系正在重组,原先的商业模式已不合时宜.资本生产方.理财平台.资产经纪方,担保和保险方,流动性提供商和坏账处理方等多元机构正脱离单一属性,全面进行互联网化. 之前,线下复杂的生态系统被线上冲击下,正逐渐打包成四五个综合性平台出现.随着一二线城市风起云涌,四五线城市百废待兴,农村市场的缺口却在不断拉大.如何刺激农村市场?是现实问题,也是战略问题. 央行降息刺激农村市场,是农村互联网金融的救命稻草吗? 21日,中国人民银行宣布,自11月22日起下调金融机构人民币贷款和存款利率,金融机构

IT设备的救命稻草-如何正确构建OOB带外网络

现实生活中,无论是传统的大型园区网络,运营商.或是现今流行的数据中心.虚拟化等技术,往往归根结底都是大量的网络设备以及服务器堆叠而成.自然而然,当网络或者服务器因为软件故障或者人为操作失误的原因导致系统宕机后,如何第一时间登陆到故障设备,并快速恢复业务已经成为考验运维人员的一大难题. 其实,试想如果网络中存在一个完善的OOB带外网络,在故障发生时,网络控制中心可通过此网络登录网络设备或者服务器的带外管理接口或者Console接口.从而第一时间获取故障信息并予以修正,或者收集log文件上报厂家.岂

Oracle数据库误删除数据3种恢复语句

有很多朋友都遇到过在操作数据库时误删除某些重要数据的情况,如果数据库没有备份而且数据有十分重要的情况下怎么做才能找回误删除的数据呢?我在这里为大家介绍几种误删除数据库中重要数据的恢复方法(不考虑全库备份和利用归档日志)第一种数据恢复方法是利用oracle提供的闪回方法进行数据恢复,适用于delete删除(一条记录)方式:首先需要知道是什么时间进行的删除操作,如果不能确定具体时间点则选择尽量准确的删除数据前的时间.然后利用select from 表名 as of timestamp to_time

SQL Server 2008 数据库误删除数据的恢复

原文:http://www.cnblogs.com/dudu/archive/2011/10/15/sql_server_recover_deleted_records.html SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的数据库完全备份. 2. 数据库的恢复模式(Recovery mode)是“完整(Full)”. 针对这两个前提条件,会有三种情况: 情况一.如果这两个前提条件都存在,通过SQL语句只

SQL学习_查询重复数据和连接多个表数据的方法

进行数据库测试时需要根据不同场景查询数据,以便验证发现的问题是否为脏数据引起的.记录一下最近常用的查询方法: 1. 查询表中重复数据(id不同,多个字段值相同) select P1.* from project as P1, project as P2 where P1.id<>P2.id and P1.ProjectId=P2.ProjectId and P1.ServiceTypeId=P2.ServiceTypeId and P1.Rank=P2.Rank 2.连接多个表数据 selec

MIUI 7 会是小米的救命稻草吗?

花无百日红,人无千日好.再绚烂的曾经,或许一朝不慎,就会成为过去.在科技圈,诺基亚.黑莓等就是最好的例子.而对于看似蓬勃发展的小米来说,这么早早地看衰似乎并不合乎时宜.毕竟出货量在国内智能手机上还是处于一线阵营,各种智能硬件产品也层出不穷,俨然是创建庞大商业帝国的趋势. 但实事求是地说,目前小米最核心的智能手机业务已经出现下滑的苗头,昔日的高速增长已经完全成为过去式.于是,当初引领小米进入智能手机行业并一鸣惊人的"先知"--MIUI系统跳出来,准备拯救世界.据爆料,MIUI 7将于8月

滴滴小巴上线:无奈的妥协还是真救命稻草

对于通过收购.合并.残酷竞争等一系列大动作,网约车平台终于只剩下寥寥数家.这其中每个平台目前的形势还都不一样:滴滴一家独大,神州专车固步自封,易到传出欠款消息--但不管是成为巨头春风得意,还是惨被压制郁郁寡欢,它们当下都遇到了各种压力.尤其是对于滴滴来说,成为巨头的同时,它也成为一个更显眼的"靶子". 网约车新政在户籍.车籍.排量上的种种限制:出于盈利考虑而不断减少补贴让网约车司机.乘客怨声载道--在多重压力之下,滴滴推出小巴这个新业务.滴滴小巴的推出,是滴滴对当下局势的一种无奈妥协,