LogMnr-误DML后使用logmnr对数据进行恢复

开发人员错误的DML是个头痛的问题,如果是11g可以采用LogMinor进行异机恢复。[@more@]

误DML后使用logmnr对数据进行恢复
SQL> conn tangyun/tangyun
Connected.
SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
TANGYUN_TEST
MLOG$_T_PART
T_PART
LOGMNR
LOGMNR_REDO
MV_T_PART
TANGYUN

7 rows selected.
---------创建一张测试表,这里为了输出结果较明显,表记录不要太多
SQL> create table ty_log as select * from tangyun_test where rownum<=10;

Table created.

SQL> select count(1) count# from ty_log;

COUNT#
----------
9

SQL> delete from ty_log where tid<=5;

5 rows deleted.

SQL> commit;

Commit complete.

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 130 52428800 2 NO CURRENT 896827 10-7月 -11
2 1 128 52428800 1 YES INACTIVE 894997 10-7月 -11
3 1 129 52428800 1 YES INACTIVE 896123 10-7月 -11

-----切换当前日志,如果日志已经被归档,则需要分析的是归档日志,不过方法一样
SQL> alter system switch logfile;

System altered.

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 130 52428800 2 YES ACTIVE 896827 10-7月 -11
2 1 131 52428800 1 NO CURRENT 897105 10-7月 -11
3 1 129 52428800 1 YES INACTIVE 896123 10-7月 -11

SQL> col member format a60
SQL> select member from v$logfile;

MEMBER
------------------------------------------------------------
+DGSYSTEM/tgyun/onlinelog/group_1.257.747535069
+DGSYSTEM/tgyun/onlinelog/group_2.258.747535071
+DGSYSTEM/tgyun/onlinelog/group_3.259.747535075
+DGSYSTEM/tgyun/onlinelog/group_1.268.754483583

SQL> begin
2 sys.dbms_logmnr.add_logfile(logfilename => '+DGSYSTEM/tgyun/onlinelog/group_1.257.747535069',options => sys.dbms_logmnr.new);
3 end;
4 /

PL/SQL procedure successfully completed.

--------使用在线字典
SQL> begin
2 sys.dbms_logmnr.start_logmnr(options =>sys.dbms_logmnr.dict_from_online_catalog);
3 end;
4 /

PL/SQL procedure successfully completed.
SQL> begin
2 sys.dbms_logmnr.end_logmnr();
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> col sql_redo format a60
SQL> col sql_undo format a60
SQL> select sql_redo,sql_undo from v$logmnr_contents where table_name='TY_LOG';

SQL_REDO SQL_UNDO
------------------ -------------------------------------
create table ty_log as select * from tangyun_test where rown
um<=10;
---------------从输出结果没有看到任何的DML语句
------查看SUPPLEMENTAL LOG DATA参数
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;

SUPPLEME SUP SUP
-------- --- ---
NO NO NO
--------10g版本默认SUPPLEMENTAL LOG DATA参数均为关闭
--------打开SUPPLEMENTAL LOG DATA参数
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
/*==============打开和关闭最小日志=========================================================================
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Database altered.

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;

SUPPLEME SUP SUP
-------- --- ---
YES NO NO

SQL> alter database drop supplemental log data;

Database altered.

SQL>
SQL>
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;

SUPPLEME SUP SUP
-------- --- ---
NO NO NO

*/===================================================================================================
--------打开SUPPLEMENTAL LOG DATA参数后重新做测试

SQL> drop table ty_log purge;

Table dropped.

SQL> create table tylog as select * from tangyun_test;

Table created.

SQL> select count(1) from tylog;

COUNT(1)
----------
9

SQL> delete from tylog where tid<=5;

5 rows deleted.

SQL> commit;

Commit complete.

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 130 52428800 2 YES INACTIVE 896827 10-7月 -11
2 1 131 52428800 1 NO CURRENT 897105 10-7月 -11
3 1 129 52428800 1 YES INACTIVE 896123 10-7月 -11

SQL> select member from v$logfile;

MEMBER
------------------------------------------------------------
+DGSYSTEM/tgyun/onlinelog/group_1.257.747535069
+DGSYSTEM/tgyun/onlinelog/group_2.258.747535071
+DGSYSTEM/tgyun/onlinelog/group_3.259.747535075
+DGSYSTEM/tgyun/onlinelog/group_1.268.754483583

SQL> alter system switch logfile;

System altered.

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 130 52428800 2 YES INACTIVE 896827 10-7月 -11
2 1 131 52428800 1 YES ACTIVE 897105 10-7月 -11
3 1 132 52428800 1 NO CURRENT 897498 10-7月 -11

SQL> col filename format a60
SQL> select filename from v$logmnr_logs;

no rows selected

SQL> begin
2 sys.dbms_logmnr.add_logfile(logfilename => '+DGSYSTEM/tgyun/onlinelog/group_2.258.747535071',options => sys.dbms_logmnr.new);
3 end;
4 /

PL/SQL procedure successfully completed.

SQL> select filename from v$logmnr_logs;

FILENAME
------------------------------------------------------------
+DGSYSTEM/tgyun/onlinelog/group_2.258.747535071

SQL> begin
2 sys.dbms_logmnr.start_logmnr(options =>sys.dbms_logmnr.dict_from_online_catalog);
3 end;
4 /

PL/SQL procedure successfully completed.


SQL> select sql_redo,sql_undo from v$logmnr_contents where table_name='TYLOG';

SQL_REDO SQL_UNDO
------------------------------------------------------------ ------------------------------------------------------------
create table tylog as select * from tangyun_test;
insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('01','T delete from "TANGYUN"."TYLOG" where "TID" = '01' and "TNAME"
ANGYUN'); = 'TANGYUN' and ROWID = 'AAANBSAAFAAAABMAAA';

insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('02','T delete from "TANGYUN"."TYLOG" where "TID" = '02' and "TNAME"
EST'); = 'TEST' and ROWID = 'AAANBSAAFAAAABMAAB';

insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('03','S delete from "TANGYUN"."TYLOG" where "TID" = '03' and "TNAME"
HXJ'); = 'SHXJ' and ROWID = 'AAANBSAAFAAAABMAAC';

insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('04','S delete from "TANGYUN"."TYLOG" where "TID" = '04' and "TNAME"

SQL_REDO SQL_UNDO
------------------------------------------------------------ ------------------------------------------------------------
HSNC'); = 'SHSNC' and ROWID = 'AAANBSAAFAAAABMAAD';

insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('05',' delete from "TANGYUN"."TYLOG" where "TID" = '05' and "TNAME"
汤云'); = '汤云' and ROWID = 'AAANBSAAFAAAABMAAE';

insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('06','T delete from "TANGYUN"."TYLOG" where "TID" = '06' and "TNAME"
GYUN'); = 'TGYUN' and ROWID = 'AAANBSAAFAAAABMAAF';

insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('08','t delete from "TANGYUN"."TYLOG" where "TID" = '08' and "TNAME"
est_RMAN'); = 'test_RMAN' and ROWID = 'AAANBSAAFAAAABMAAG';


SQL_REDO SQL_UNDO
------------------------------------------------------------ ------------------------------------------------------------
insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('10','r delete from "TANGYUN"."TYLOG" where "TID" = '10' and "TNAME"
man'); = 'rman' and ROWID = 'AAANBSAAFAAAABMAAH';

insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('13','R delete from "TANGYUN"."TYLOG" where "TID" = '13' and "TNAME"
MAN'); = 'RMAN' and ROWID = 'AAANBSAAFAAAABMAAI';

delete from "TANGYUN"."TYLOG" where "TID" = '01' and "TNAME" insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('01','T
= 'TANGYUN' and ROWID = 'AAANBSAAFAAAABMAAA'; ANGYUN');

delete from "TANGYUN"."TYLOG" where "TID" = '02' and "TNAME" insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('02','T
= 'TEST' and ROWID = 'AAANBSAAFAAAABMAAB'; EST');

SQL_REDO SQL_UNDO
------------------------------------------------------------ ------------------------------------------------------------

delete from "TANGYUN"."TYLOG" where "TID" = '03' and "TNAME" insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('03','S
= 'SHXJ' and ROWID = 'AAANBSAAFAAAABMAAC'; HXJ');

delete from "TANGYUN"."TYLOG" where "TID" = '04' and "TNAME" insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('04','S
= 'SHSNC' and ROWID = 'AAANBSAAFAAAABMAAD'; HSNC');

delete from "TANGYUN"."TYLOG" where "TID" = '05' and "TNAME" insert into "TANGYUN"."TYLOG"("TID","TNAME") values ('05','
= '汤云' and ROWID = 'AAANBSAAFAAAABMAAE'; 汤云');


15 rows selected.


-------这里如果数据量很大的情况下我们可以把分析结果存放在另外一张表中进行处理

SQL> create table ty_undo as select replace(sql_undo,'"','') sql_undo from v$logmnr_contents where table_name='TYLOG' and lower(sql_undo) like 'insert into%';

Table created.

SQL> select * from ty_undo;

SQL_UNDO
--------------------------------------------------------------------------------
insert into TANGYUN.TYLOG(TID,TNAME) values ('01','TANGYUN');
insert into TANGYUN.TYLOG(TID,TNAME) values ('02','TEST');
insert into TANGYUN.TYLOG(TID,TNAME) values ('03','SHXJ');
insert into TANGYUN.TYLOG(TID,TNAME) values ('04','SHSNC');
insert into TANGYUN.TYLOG(TID,TNAME) values ('05','汤云');

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;

SUPPLEME SUP SUP
-------- --- ---
YES NO NO


--------可见,在10g中默认情况下LOGMNR已经不是一个可靠的数据获取的方式,希望通过这种方式获取丢失数据,则需要提前设置SUPPLEMENTAL LOG DATA。

其他参考语句:
begin
sys.dbms_logmnr.add_logfile(logfilename => '+DGSYSTEM/tgyun/onlinelog/group_2.258.747535071',options => sys.dbms_logmnr.addfile);
end;


begin
sys.dbms_logmnr.add_logfile(logfilename => '+DGSYSTEM/tgyun/onlinelog/group_2.258.747535071',options => sys.dbms_logmnr.removefile);
end;

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;

11g以上版本默认SUPPLEMENTAL LOG DATA为开启状态

参考文档:
http://ctchina.blog.sohu.com/128878209.html
http://yumianfeilong.com/html/2008/11/09/259.html
http://yangtingkun.itpub.net/post/468/464865

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

转载于:http://blog.itpub.net/24930246/viewspace-1058003/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值