如何使用Logminer来分析具体的DML操作日志
在Oracle数据库维护中,常常需要分析原来数据库都做了哪些删除、更新、增加数据的操作,所以一般需要用到Logminer这工具来分析归档日志。
环境:AIX5.3+Oracle10.2.0.1 使用IBM的Tivoli Storage Manager把数据库数据、归档日志备份到带库中
1、确定具体时间的DML操作,把相应的归档日志从带库恢复到数据库中
2、用Logminer来分析相应的归档日志
一.在sqlplus用sys超级用户登陆数据库中,然后把当前的时间改成'yyyy-mm-dd hh24:mi:ss'格式,这样可以看清楚归档日志的起始时间:
SQL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
二、v$log_history视图的sequence#为归档日志序列号,first_time为该归档日志的开始时间。
SQL>select sequence#,first_time from v$log_history;
记下某天的归档日志序列,比如为3988--4000
三、用rman target/ 进入数据库,把相应的归档日志从带库取到数据库中来,/oracle/oms/oradata/temp目录为放归档日志的目录。
RUN
{
SET ARCHIVELOG DESTINATION TO '/oracle/oms/oradata/temp';
RESTORE ARCHIVELOG SEQUENCE 3988;
}
注:导出多个归档日志:
RUN
{
SET ARCHIVELOG DESTINATION TO '/oracle/oms/oradata/temp';
RESTORE ARCHIVELOG SEQUENCE between 2895 and 2897;
}
注:3988为归档日志的序列号,有多个日志,需要运行多个上面的语句。
四、建立日志分析列表,把第一个归档日志放到分析列表
SQL>execute dbms_logmnr.add_logfile(logfilename=>'/oracle/oms/oradata/temp/1_3988_644336885.dbf',options=>dbms_logmnr.new);
五、把第二个归档日志放到分析列表(第二个归档日志以后都是下面的格式)
SQL>execute dbms_logmnr.add_logfile(logfilename=>'/oracle/oms/oradata/temp/1_3989_644336885.dbf',options=>dbms_logmnr.addfile);
六、启动LogMiner
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
七、把分析出来的数据放在logminer_test表中,这样方便查询。因为表v$logmnr_contents的数据量很大,选择一个空闲的表空间
SQL>
create table logminer_test tablespace MLOG_NORM_SPACE
as
select * from v$logmnr_contents;
八、把分析日志表logminer_test的查询权限赋予给lhomsread只读的数据库用户,这样使用第三方工具很方便查询(plsql等):
SQL>grant select on logminer_test to lhomsread;
九、结束logminer
SQL> execute dbms_logmnr.end_logmnr;
本文链接
本文阅读目录如下:
1、概述
2、Oracle跟踪
3、Tkprof分析
4、简单实例分析实战
1、概述
最近研究了一下Oracle的跟踪和对跟踪的分析,在网上搜索了好多资料终于对这一块有了一个大致的了解,本人之前用sqlserver用的比较多,感觉Oracle在这一块确实很不方便啊,Oracle根本没有像SqlServer Profiler那样专业性的图形化工具,还有SqlServer在做性能优化的时候在查询分析器里面能够估算的执行计划和实际计划,sqlserver在这方面确实非常独到啊哈哈,有一些复杂的sql语句、存储过程、函数等在查询分析器里面一估算就能看出在哪个地方出现了问题,而且直接给出修改的建议,我们这个非DBA级别的研发人员用这些工具也可以做DBA的工作了-_-,当然还有DBCC命令等,当然本文不是讲sqlserver的跟踪和优化的,言归正传,本文主要讲解Oracle的跟踪和分析的。
2、Oracle跟踪
2、1 sql脚本跟踪
主要是通过查看v$sql和v$sqlarea两个内置视图来监视所有sql的执行过程。
v$sqlarea和v$sql两个视图的不同之处在于,v$sql中为每一条SQL保留一个条目,而v$sqlarea中根据sql_text进行group by,通过version_count计算子指针的个数。下面对这个问题进行一点延伸探讨。
首先介绍一下v$sql视图,v$sql视图列举了共享SQL区(Shared SQL Area)中的SQL统计信息,这个视图中的信息未经分组,每个SQL指针都包含一条独立的记录。这个视图的主要字段如下:
Column
Datatype
Descrption
SQL_TEXT
VARCHAR2(1000)
当前SQL指针的前1000个字符(也就是说这里记录的SQL是不完整的)
EXECUTIONS
NUMBER
执行次数
DISK_READS
NUMBER
这个子指针Disk Read的次数
BUFFER_GETS
NUMBER
这个子指针的Buffer Gets数量
OPTIMIZER_MODE
VARCHAR2(10)
SQL执行的优化器模式
OPTIMIZER_COST
NUMBER
SQL执行成本
HASH_VALUE
NUMBER
在Library Cache中父指针的Hash Value值
具体sql查看语句,如下:
select SQL_TEXT,EXECUTIONS,DISK_READS,BUFFER_GETS,OPTIMIZER_MODE,OPTIMIZER_COST,HASH_VALUE,a.MODULE,a.first_load_time from v$sqlarea a
where 1=1
--and a.LAST_ACTIVE_TIME >= to_date( '2013-04-18 14:35:00','yyyy-MM-dd HH24:mi:ss')
--and a.LAST_ACTIVE_TIME < to_date( '2013-04-18 18:24:00','yyyy-MM-dd HH24:mi:ss')
--and a.MODULE_HASH <> 0
and a.MODULE = 'w3wp.exe'
order by a.first_load_time desc
其中a.MODULE 的类型是w3wp.exe时代表监视的是iis站点访问数据库的情况,这个sql脚本跟踪类似于sqlserver profiler中的sql分析;
2、2 sql_trace跟踪
当SQL语句出现性能问题时,我们可以用SQL_TRACE来跟踪SQL的执行情况,通过跟踪,我们可以了解一条SQL或者PL/SQL包的运行情况,SQL_TRACE命令会将SQL执行的整个过程输出到一个trace文件中,我们可以读这个trace 文件来了解在这个
lsnrctl命令常用参数详解:
lsnrctl
start
启动指定的监听器
stop
关闭指定的监听器
status
显示监听器的状态。status命令显示监听器是不是活动的,日志与跟踪文件的位置,监听器已经持续运行了多长时间,以及监听器所监听的任务。
services
列举监听器的服务信息,比如这些服务是否有任何专用的预生成服务器进程或与之相关的调度进程,以及每个服务已有多少连接被接受或拒绝。这种方法用来检查一个监听器是否在监听一个指定服务。
列出服务的一个汇总表及为每个协议服务处理程序所建立和拒绝的连接信息个数。
Version
显示oracle net软件与协议适配器的版本。
reload
重新装入监听器,重新读取listener.ora文件,但不关闭监听器。如果该文件发生了变化,重新刷新监听器。
save_config
当从lsnrctl工具中对listener.ora文件进行了修改时,复制一个叫做listener.bak的listener.ora的文件。
trace
打开监听器的跟踪特性。
change_password
允许用户修改关闭监听器所需要的密码。
quit
退出lsnrctl工具。
exit
退出lsnrctl工具。
set*
password
指定在lsnrctl命令行工具中执行管理任务所需要的密码。
rawmode
displaymode
trc_file
指定监听器跟踪信息的位置。默认设置是$ORACLE_HOMEnetworktracelistener.trc
trc_directory
trc_level
跟踪级别
OFF – 未启用跟踪功能。OFF 为默认设置。
USER – 将跟踪设置为用户的相应级别。跟踪以标识用户导致的错误条件。
ADMIN – 将跟踪设置为数据库管理员的相应级别。跟踪以标识特定的安装问题。
SUPPORT – 将跟踪设置为客户支持人员的相应级别。 跟踪文件可能会变得很大。
Oracle Corporation 建议在不进行网络问题诊断时关闭跟踪功能。
log_file
指定一个监听器将把日志信息写到哪里。这个参数在默认的情况下是ON,并默认为%oracle_home%networkloglistener.log
log_directory
log_status
current_listener
inbound_connect_timeout
定义监听器在一个会话得到启动时将等待的有效响应时间。默认设置为10秒。
startup_waittime
定义监听器在响应lsnrctl命令行工具中的一条status命令之前将等待多长时间。
save_config_on_stop
指定在一个lsnrctl会话期内所发生的修改在退出时是否应该被保存起来。
show*
rawmode
显示关于status和service的较详细信息(当他们设置成on时)值为ON或OFF。
displaymode
把lsnrctl工具的显示模式设置成raw、compact、normal或verbose
服务显示模式为NORMAL
rules
trc_file
指定监听器跟踪信息的位置。默认设置是$ORACLE_HOMEnetworktracelistener.trc
current_listener
目前的监听器为 listener2
inbound_connect_timeout
定义监听器在一个会话得到启动时将等待的有效响应时间。默认设置为10秒。
startup_waittime
定义监听器在响应lsnrctl命令行工具中的一条status命令之前将等待多长时间。
snmp_visible
save_config_on_stop
指定在一个lsnrctl会话期内所发生的修改在退出时是否应该被保存起来。
lsnrctl部分查询状态详解:
LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle.domain)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 – Production
Start Date 17-MAY-2011 21:03:40
Uptime 0 days 0 hr. 2 min. 49 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.1/db/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.1/db/network/log/listener.log
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle.domain)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle.domain)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle.domain)(PORT=1600)))
Services Summary…
Service “POD” has 1 instance(s).
Instance “POD”, status READY, has 1 handler(s) for this service…
Service “POD1″ has 1 instance(s).
Instance “POD”, status UNKNOWN, has 1 handler(s) for this service…
Service “PODS” has 1 instance(s).
Instance “POD”, status READY, has 2 handler(s) for this service…
Service “pod_XPT” has 1 instance(s).
Instance “POD”, status READY, has 1 handler(s) for this service…
Service “repos” has 2 instance(s).
Instance “repos”, status UNKNOWN, has 1 handler(s) for this service…
Instance “repos”, status READY, has 1 handler(s) for this service…
Service “repos_XPT” has 1 instance(s).
Instance “repos”, status READY, has 1 handler(s) for this service…
The command completed successfully
status详解
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle.domain)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle.domain)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle.domain)(PORT=1600)))
#此处说明该主机地址为ocm1.oracle.domain,开启的监听端口有1521,1522,1600
Services Summary…
Service “POD” has 1 instance(s).
Instance “POD”, status READY, has 1 handler(s) for this service…
#此处说明有一个服务名POD的服务,数据库实例名为POD,状态READY说明其目前处于动态注册
Service “POD1″ has 1 instance(s).
Instance “POD”, status UNKNOWN, has 1 handler(s) for this service…
#此处说明有一个服务名为POD1的服务,数据库的实例名为POD,状态UNKNOWN说明其目前是静态注册
Service “PODS” has 1 instance(s).
Instance “POD”, status READY, has 2 handler(s) for this service…
#此处说明有一个服务名为PODS的服务,数据库实例名为POD,状态READY说明其是动态注册
Service “repos” has 2 instance(s).
Instance “repos”, status UNKNOWN, has 1 handler(s) for this service…
Instance “repos”, status READY, has 1 handler(s) for this service…
The command completed successfully
#此处说明有一个服务名为repos的服务,对应数据库实例为repos,UNKNOWN,READY状态说明其目前有一个静态注册和一个动态注册
LSNRCTL> services
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm1.oracle.domain)(PORT=1521)))
Services Summary…
Service “POD” has 1 instance(s).
Instance “POD”, status READY, has 1 handler(s) for this service…
Handler(s):
“DEDICATED” established:0 refused:0 state:ready
LOCAL SERVER
Service “POD1″ has 1 instance(s).
Instance “POD”, status UNKNOWN, has 1 handler(s) for this service…
Handler(s):
“DEDICATED” established:0 refused:0
LOCAL SERVER
Service “PODS” has 1 instance(s).
Instance “POD”, status READY, has 2 handler(s) for this service…
Handler(s):
“D001″ established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle.domain)(PORT=37290))
“D000″ established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=ocm1.oracle.domain)(PORT=37288))
Service “pod_XPT” has 1 instance(s).
Instance “POD”, status READY, has 1 handler(s) for this service…
Handler(s):
“DEDICATED” established:0 refused:0 state:ready
LOCAL SERVER
Servi