logminer使用测试库进行挖掘分析,10.2.0.5
上一篇测试是在dg环境进行测试挖掘,但是如果客户存在一个测试库,那样使用日志挖掘的影响性更小。本篇进行测试分析。 测试环境介绍: oracle linux? 5.6,vmware虚拟机,安装两套单实例10.2.0.5数据库,一套模拟生产环境进行dml操作,另一套模拟测试环境进行日志相关挖掘。 ? 测试流程说明: 1.生产环境,模拟dml操作,一个表A,产生一个delete 1行记录,执行两次,表B,执行一次delete操作, 30000条记录? ,日志切换(归档模式下),再次多切换几次日志 2.目标端,使用logminer 进行挖掘相关日志,最终得出相关分析。 ? ? 一、生产环境日志模拟SQL> show parameter name NAME VALUE -------------------- db_name test1 SQL> archive log list
SQL> conn test1/test1 SQL> create table a as select * from scott.emp; SQL> delete a where rownum=1; SQL> commit; SQL> delete a where empno=7788; SQL> commit; SQL> alter system switch logfile; SQL> conn test2/test2 SQL> insert into b select * from b; SQL> insert into b select * from b SQL> commit; SQL> delete b where rownum<100000; SQL> commit; SQL> alter system archive log current; SQL> select DEST_ID,THREAD#,SEQUENCE#,COMPLETION_TIME,NAME from v$archived_log where COMPLETION_TIME >sysdate-20/1440; DEST_ID THREAD# SEQUENCE# COMPLETION_TIME NAME ? 二、测试库使用Logminer?? 1)logminer前提准备
添加存储过程 @?/rdbms/admin/dbmslmd.sql 开启最小补充日志 select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI from v$database; SQL> alter database add supplemental log data; Database altered. SQL> select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_UI from v$database; SUPPLEME SUP SUP ? 2)日志挖掘,在无数据字典的情况下,输出内容 SQL> exec dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS); SQL> exec dbms_logmnr.add_logfile(‘/u02/app/oracle/arch/1_1_993126050.arc‘,dbms_logmnr.new); SQL> exec dbms_logmnr.add_logfile(‘/u02/app/oracle/arch/1_2_993126050.arc‘,dbms_logmnr.addfile); 使用online 数据字典进行翻译,报错: dbid不同 SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); ? SQL> exec DBMS_LOGMNR.START_LOGMNR(DictFileName=>‘‘,Options=>0); SQL> select sql_redo,sql_undo from V$LOGMNR_CONTENTS where sql_redo like ‘%insert into%‘; SQL_REDO SQL_UNDO 在使用异机使用logminer挖掘,在没有数据字典的情况下,挖掘出来的只能是obj#,无法获取对象名称 select * from ( M USERNAME SEG_OWNER SEG_NAME SEG_TYPE_NAME OPERATION A https://blog.csdn.net/cuiyan1982/article/details/80333013 ? ? 3)生产环境,修改参数使用文件存储数据字典,数据字典文件拷贝至测试库进行注册使用。 alter system set?utl_file_dir=/abc scope=spfile;? 生产环境需要重启,代价太高 startup force --实际环境不能这么干 SQL> exec dbms_logmnr_d.build(dictionary_filename=>‘ar1.dic‘,dictionary_location=>‘/abc‘,options=>dbms_logmnr_d.STORE_IN_FLAT_FILE); 测试环境,使用该数据字典,进行解析。 SQL> exec dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS); SQL>? exec dbms_logmnr.add_logfile(‘/u02/app/oracle/arch/1_1_993126050.arc‘,dbms_logmnr.new); SQL>? exec dbms_logmnr.add_logfile(‘/u02/app/oracle/arch/1_2_993126050.arc‘,dbms_logmnr.addfile); SQL> exec DBMS_LOGMNR.START_LOGMNR(DictFileName=>‘/abc/ar1.dic‘,Options=>0); ?select * from ( ROWNUM USERNAME SEG_OWNER SEG_NAME SEG_TYPE_NAME OPERATION A 2 UNKNOWN SYS WRH$_SYSSTAT,WRH$_SY TABPART INSERT 5820 3 UNKNOWN SYS WRH$_PARAMETER,WRH$_ TABPART INSERT 3990 #查询数据字典文件(oracle根据数据字典,进行解析obj,转换为我们熟悉的用户名,表对象名称等) CREATE_TABLE DICTIONARY_TABLE ( DB_NAME VARCHAR2(9),DB_ID NUMBER(20),DB_CREATED VARCHAR2(20),DB_DICT_CREATED VARCHAR2(20),DB_RESETLOGS_CHANGE# NUMBER(22 INSERT_INTO DICTIONARY_TABLE VALUES (‘TEST1‘,1370159887,‘11/25/2018 09:58:39‘,‘01/12/2019 13:56:03‘,420491,‘11/25/2018 12:20:50‘,‘11/25/2018 11:36:00‘,‘‘,‘‘
INSERT_INTO OBJ$_TABLE VALUES (20,2,‘ICOL$‘,1,to_date(‘04/20/2010 08:24:28‘,‘MM/DD/YYYY HH24:MI:SS‘),to_date(‘04/20/2010 08:32:25‘,‘MM/DD/YYYY HH24 ? 4)生产环境,将数据字典,写入Online redo文件中,切换归档,拷贝至测试库,注册后使用。 ?实际环境中,根本不允许生产环境随便重启库修改参数文件,因此在线操作更可取。 SQL> alter database add supplemental log data;? --需要开启最小补充日志 SQL> exec DBMS_LOGMNR_D.BUILD(dictionary_filename=>NULL,dictionary_location=>NULL,options=>dbms_logmnr_d.STORE_IN_REDO_LOGS); ?col name format a90 NAME ARC DIC DIC /u02/app/oracle/arch/1_9_993126050.arc? ? ? ? YES YES YES 选择将此归档文件进行copy,无需手工切换,因为执行exec写入redo,会自动切换产生归档日志 ? 测试环境,导入这个归档日志: SQL> exec dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS); PL/SQL procedure successfully completed. SQL> exec dbms_logmnr.add_logfile(‘/u02/app/oracle/arch/1_1_993126050.arc‘,dbms_logmnr.new); PL/SQL procedure successfully completed. SQL> exec dbms_logmnr.add_logfile(‘/u02/app/oracle/arch/1_2_993126050.arc‘,dbms_logmnr.addfile); PL/SQL procedure successfully completed. SQL> exec dbms_logmnr.add_logfile(‘/u02/app/oracle/arch/1_9_993126050.arc‘,dbms_logmnr.addfile); PL/SQL procedure successfully completed. SQL> exec DBMS_LOGMNR.START_LOGMNR(DictFileName=>‘‘,Options=>DBMS_LOGMNR.DICT_FROM_REDO_LOGS); PL/SQL procedure successfully completed. Sat Jan 12 14:20:14 CST 2019 ? ? ? 三、挖掘对比? select rownum,a from ( select username,count(*) a from V$LOGMNR_CONTENTS where seg_owner IN (‘TEST1‘,‘TEST2‘) group by username,OPERATION order by 6 desc); ROWNUM USERNAME SEG_OWNER SEG_NAME SEG_TYPE_N OPERATION A ---------- -------------------- -------------------------------- ---------- ---------- ---------- ---------- 1 UNKNOWN TEST2 B TABLE INSERT 151942 2 UNKNOWN TEST2 B TABLE DELETE 99983 3 UNKNOWN TEST1 A TABLE DDL 1 4 UNKNOWN TEST2 B TABLE DDL 1 5 SYS TEST2 USER DDL 1 6 SYS TEST1 USER DDL 1 6 rows selected. [email?protected]>select sql_redo,sql_undo from V$LOGMNR_CONTENTS where seg_owner IN (‘TEST1‘); SQL_REDO SQL_UNDO -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- create user test1 identified by VALUES ‘22F2E341BF4B8764‘ ; create table a as select * from scott.emp; [email?protected]>select sql_redo,sql_undo from V$LOGMNR_CONTENTS where seg_owner IN (‘TEST2‘) and OPERATION=‘DELETE‘ and rownum=1; SQL_REDO SQL_UNDO -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- delete from "TEST2"."B" where "OWNER" = ‘SYS‘ and "OBJECT_NAME" = ‘I_TS#‘ and "SUBOBJECT_NAME" IS NULL and "OBJECT_ID" = ‘7‘ and "DATA_OBJECT_ID" = ‘7‘ and "OBJECT_TYPE" = ‘INDEX‘ and "CREATED" = TO_D ATE(‘2010-04-20 08:24:28‘,‘yyyy-mm-dd hh24:mi:ss‘) and "LAST_DDL_TIME" = TO_DATE(‘2010-04-20 08:24:28‘,‘yyyy-mm-dd hh24:mi:ss‘) and "TIMESTAMP" = ‘2010-04-20:08:24:28‘ and "STATUS" = ‘VALID‘ and "TE MPORARY" = ‘N‘ and "GENERATED" = ‘N‘ and "SECONDARY" = ‘N‘ and ROWID = ‘AAAM+oAAEAAAALcAAQ‘; insert into "TEST2"."B"("OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID","DATA_OBJECT_ID","OBJECT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMPORARY","GENERATED","SECONDARY") values (‘S YS‘,‘I_TS#‘,NULL,‘7‘,‘INDEX‘,TO_DATE(‘2010-04-20 08:24:28‘,‘yyyy-mm-dd hh24:mi:ss‘),‘2010-04-20:08:24:28‘,‘VALID‘,‘N‘,‘N‘); 第一,delete 一条记录,删除9999行记录被抓取到,并且 count(*)说明oracle 底层delete操作,是逐行进行删除,虽然自己写的是一条delete where rownum<100000; 第二,虽然oracle logminer挖掘日志,能够挖掘很细腻,但是delete一行记录在本次操作中,挖掘消失了!!! 第三,ddl操作都被明确记录 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |