应客户需要,对某一天的日志进行挖掘,分析日均归档日志切换数量20增长至40的原因,是什么表的dml操作导致的日志量剧增,最终定位某个应用(需要客户自己进行甄别)
操作说明及介绍:
1.客户10.2.0.5 rac 两节点,一套10.2.0.5 dg单实例环境,一套测试库(测试库与dg在同一台主机,且测试库是一年前历史时期的生产库的备库)
2.根据对生产环境最小化原则,在主库只进行创建数据字典,并不在主库进行日志挖掘
3.根据操作简便,dg与测试库在同一台主机上,本次使用dg环境视图查询日志文件,在测试库中直接进行挖掘,省略拷贝归档日志步骤
操作流程
1.生产库rac,创建数据字典
2.dg环境,查询需要挖掘的归档日志信息+主库创建的数据字典所在的归档文件
3.测试库挖掘,使用Logminer工具进行日志挖掘
4.分析输出内容,使用sql分组查询出对象,操作类型,操作次数统计信息
1.生产库rac,创建数据字典
生产库,将数据字典,写入Online redo文件中,切换归档,拷贝至测试库,注册后使用。 alter system switch logfile; alter database add supplemental log data; --查询验证 SQL> select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI from v$database; SUPPLEME SUP SUP -------- --- --- YES NO NO --数据字典,写入日志文件 exec DBMS_LOGMNR_D.BUILD(dictionary_filename=>NULL,dictionary_location=>NULL,options=>dbms_logmnr_d.STORE_IN_REDO_LOGS); --关闭最小补充日志 alter database drop 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 --查询数据字典写入的日子文件,序列号名称sequence# SQL> select thread#,sequence#,name,ARCHIVED,DICTIONARY_BEGIN,DICTIONARY_END from v$archived_log where DICTIONARY_BEGIN='YES'; THREAD# SEQUENCE# NAME ARC DIC DIC ---------- ---------- ------------------------------------------------------------------------------------------ --- --- --- 1 13548 xxxdg YES YES YES 1 13548 +ASM/xxx/thread_1_seq_xxx YES YES YES
2.dg环境,查询需要挖掘的归档日志信息+主库创建的数据字典所在的归档文件
环境确认 修改 export ORACLE_SID=newdg 查询确认 echo $ORACLE_SID SQL>执行 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; select name,thread#,COMPLETION_TIME,FIRST_TIME,NEXT_TIME from v$archived_log where name is not null; ##########选择需要挖掘的归档日志################################## xxx 2 2019-01-15 00:25:25 2019-01-15 02:00:04 2019-01-15 02:01:34 xxx 2 2019-01-15 00:27:05 2019-01-15 02:01:34 2019-01-15 02:03:14 xxx 1 2019-01-15 00:28:56 2019-01-15 02:00:05 2019-01-15 02:05:10 xxx 2 2019-01-15 00:28:58 2019-01-15 02:03:14 2019-01-15 02:05:07 xxx 2 2019-01-15 00:31:06 2019-01-15 02:05:07 2019-01-15 02:07:14 xxx 2 2019-01-15 00:32:45 2019-01-15 02:07:14 2019-01-15 02:08:53 ################################################################## 查询出,生产库,写入数据字典的归档日志 1=>thread / 13548 =>sequence xxx 1 2019-01-15 10:21:59 2019-01-15 11:58:10 2019-01-15 11:58:15
3.测试库挖掘,使用Logminer工具进行日志挖掘
************************************test挖掘************************************* @?/rdbms/admin/dbmslmd.sql @?/rdbms/admin/dbmslm.sql @?/rdbms/admin/dbmslms.sql @?/rdbms/admin/prvtlm.plb*****************************新环境需要执行上述,已经挖掘过的环境忽略*********
1)测试库,准备工作 开启归档模式 确认连接数据库是测试库 $ export ORACLE_SID=ax $ echo $ORACLE_SID ax 2)关闭测试库,启动到Mount状态,关闭归档模式,修改归档参数 SQL> shutdown immediate; SQL> startup mount; 查询数据库归档模式 SQL> archive log list Database log mode No Archive Mode 非归档模式 Automatic archival Disabled Archive destination +NDATADG ----------------------------------------------------------------- log_archive_dest_1 string LOCATION=+NDATADG --测试库,修改归档参数, SQL> alter system set log_archive_dest_1='location=/data/test_arch'; SQL> alter database archivelog; SQL> alter database open; SQL> select status from v$instance; STATUS ------------ OPEN SQL> show parameter pfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string /xxx/spfilecdp11orcl.ora --测试库,已开启最小(可忽略) SQL> alter database add supplemental log data; 查询确认测试库,开启最小补充日志 SQL> select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI from v$database; SUPPLEME SUP SUP -------- --- --- YES NO NO --Logminer用法 开启logminer exec dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS); 第一个日志 exec dbms_logmnr.add_logfile('xxx',dbms_logmnr.new); 第二个日子++++ exec dbms_logmnr.add_logfile('xxx',dbms_logmnr.addfile); exec dbms_logmnr.add_logfile('xxx',dbms_logmnr.addfile); exec dbms_logmnr.add_logfile('xxx',dbms_logmnr.addfile); exec dbms_logmnr.add_logfile('xxx',dbms_logmnr.addfile); exec dbms_logmnr.add_logfile('xxx',dbms_logmnr.addfile); 建议:最后一个日志,选择包含数据字典信息的日子文件 exec dbms_logmnr.add_logfile('xxx',dbms_logmnr.addfile); 日志分析—这个步骤消耗性能,正在分析 exec DBMS_LOGMNR.START_LOGMNR(DictFileName=>'',Options=>DBMS_LOGMNR.DICT_FROM_REDO_LOGS); 可以查询日志挖掘后的行数量 select count(*) from V$LOGMNR_CONTENTS; COUNT(*) ---------- 5032895
4.分析输出内容,使用sql分组查询出对象,操作类型,操作次数统计信息
可以创建一个临时表存放(实际发现,时间过长可忽略)
create table logmnr_04_14_one_date as select * from V$LOGMNR_CONTENTS a ;
预留的一个脚本xls,可以修改spool xxx名称,自由选择: from logmnr_04_14_one_date 表可换成V$LOGMNR_CONTENTS
@HISBK [/home/oracle/enmo/script] $ cat tab_xls.sql
set linesize 200
set term off verify off feedback off pagesize 999
set markup html on entmap on spool on preformat off
spool log_20190104_14_15.xls
select username,SEG_OWNER,SEG_NAME,seg_type_name,OPERATION,count(*)
from logmnr_04_14_one_date group by username,SEG_OWNER,SEG_NAME,seg_type_name,
OPERATION order by 6 asc;
spool off
exit
执行脚本,输出xls格式表格
@/home/oracle/enmo/script/tab_xls.sql
--如果没有执行xls格式表格,备选退出挖掘模式(可选)
execute dbms_logmnr.end_logmnr;