最近项目遇见一个表数据老是被莫名删除掉,想查出到底什么操作所致。想想
oracle的
logmnr可以解决这个问题,就研究了下,系统系RAC,数据老是在凌晨4点丢失,所以只能从归档分析,oracle
10g版本,之前只对logmnr有过初步了解,用起来还真的仔细研究研究,以下是简单的测试方法,其他方法暂时不做多描述。
安装logmnr视图及字典:
SQL> @/opt/app/oracle/product/10.1.2/rdbms/admin/dbmslm.sql
程序包已创建。
授权成功。
SQL> @/opt/app/oracle/product/10.1.2/rdbms/admin/dbmslmd.sql
程序包已创建。
下面就是使用在线分析的方法分析过程:
SQL> create table test(aa int);
表已创建。
SQL> insert into test values(1);
已创建 1 行。
SQL> insert into test values(2);
已创建 1 行。
SQL> insert into test values(3);
已创建 1 行。
SQL> insert into test values(4);
已创建 1 行。
SQL> insert into test values(5);
已创建 1 行。
SQL> commit;
提交完成。
SQL> delete from test;
已删除5行。
SQL> alter system archive log current;
系统已更改。
SQL> exec dbms_logmnr.add_logfile('/data/oracle/orabak/METARDB/archivelog/2010_07_13/o1_mf_1_76_63rkm9yq_.arc',options=>dbms_logmnr.new);
PL/SQL 过程已成功完成。
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL 过程已成功完成。
SQL> select timestamp,operation,sql_redo from v$logmnr_contents where table_name='TEST';
TIMESTAMP OPERATION
------------------- --------------------------------
SQL_REDO
--------------------------------------------------------------------------------
2010-07-13 18:55:19 DDL
create table test(aa int);
2010-07-13 18:55:34 INSERT
insert into "SYS"."TEST"("AA") values ('1');
2010-07-13 18:55:43 INSERT
insert into "SYS"."TEST"("AA") values ('2');
TIMESTAMP OPERATION
------------------- --------------------------------
SQL_REDO
--------------------------------------------------------------------------------
2010-07-13 18:55:49 INSERT
insert into "SYS"."TEST"("AA") values ('3');
2010-07-13 18:55:55 INSERT
insert into "SYS"."TEST"("AA") values ('4');
2010-07-13 18:56:01 INSERT
insert into "SYS"."TEST"("AA") values ('5');
TIMESTAMP OPERATION
------------------- --------------------------------
SQL_REDO
--------------------------------------------------------------------------------
2010-07-13 18:56:19 DELETE
delete from "SYS"."TEST" where "AA" = '1' and ROWID = 'AAANrnAABAAAPQCAAA';
2010-07-13 18:56:19 DELETE
delete from "SYS"."TEST" where "AA" = '2' and ROWID = 'AAANrnAABAAAPQCAAB';
2010-07-13 18:56:19 DELETE
delete from "SYS"."TEST" where "AA" = '3' and ROWID = 'AAANrnAABAAAPQCAAC';
TIMESTAMP OPERATION
------------------- --------------------------------
SQL_REDO
--------------------------------------------------------------------------------
2010-07-13 18:56:19 DELETE
delete from "SYS"."TEST" where "AA" = '4' and ROWID = 'AAANrnAABAAAPQCAAD';
2010-07-13 18:56:19 DELETE
delete from "SYS"."TEST" where "AA" = '5' and ROWID = 'AAANrnAABAAAPQCAAE';
已选择11行。
SQL> exec dbms_logmnr.end_logmnr;
PL/SQL 过程已成功完成。
这样就完成了一个完整的对对象操作记录查找过程。